{"openapi":"3.1.0","info":{"title":"Streamkap REST API","description":"The Streamkap REST API allows you to programmatically manage your CDC pipelines, sources, destinations, transforms, and more.\n\nAuthenticate using a bearer token obtained from the [Access Token](/api-reference/auth/access-token) endpoint with your API client credentials.","contact":{"name":"Streamkap Support","url":"https://streamkap.com/","email":"support@streamkap.com"},"license":{"name":"Proprietary"},"version":"2.0.0"},"servers":[{"url":"https://api.streamkap.com","description":"Production"}],"paths":{"/auth/access-token":{"post":{"tags":["Authentication"],"summary":"Access Token","description":"Exchange credentials for a JWT access token.\n\nAccepts either:\n- `client_id` + `secret` (classic API token flow)\n- `project_key`: a Streamkap Project Key credential file (raw JSON or base64-encoded)\n\nFor `project_key` input, the API credentials are extracted from the bundle and used\nto issue the JWT. Kafka-only Project Keys (no API credentials) cannot be exchanged\nfor a JWT.","operationId":"getAccessToken","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_getAccessToken"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessToken"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/switch-tenant":{"post":{"tags":["Authentication"],"summary":"Switch Tenant","description":"Switch the caller's active tenant.\n\nMarks `tenant_id` as the caller's active tenant on the server side. The current\nJWT is NOT rotated — the caller must refresh their access token after this call\nbefore subsequent requests will be scoped to the new tenant. Returns\n`204 No Content` on success.\n\nThe caller can only switch into tenants they belong to; other targets return 403.","operationId":"switchTenant","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SwitchTenantRequest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/auth/access-token/refresh":{"post":{"tags":["Authentication"],"summary":"Refresh Access Token","description":"Refresh access token.","operationId":"refreshAccessToken","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Body_refreshAccessToken"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessToken"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/whoami":{"get":{"tags":["Authentication"],"summary":"Whoami","description":"Return the caller's verified identity: tenant, service, and credential linkage.\n\nLightweight endpoint for clients to read backend-verified context without trusting\nlocally-stored credential files. Works for all token types (Project Key, API token,\nuser token).","operationId":"getCallerIdentity","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CallerIdentity"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/auth/roles":{"get":{"tags":["Authentication"],"summary":"Get Roles","operationId":"listRoles","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Role"},"type":"array","title":"Response Listroles"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/auth/tools":{"get":{"tags":["Authentication"],"summary":"Get Mcp Tools","description":"List available MCP tools with profile membership.","operationId":"listMcpTools","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Listmcptools"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/auth/permissions":{"get":{"tags":["Authentication"],"summary":"Get Permissions","operationId":"listPermissions","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Permission"},"type":"array","title":"Response Listpermissions"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/auth/client-credentials":{"get":{"tags":["Authentication"],"summary":"List Client Credentials","operationId":"listClientCredentials","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ClientCredential"},"type":"array","title":"Response Listclientcredentials"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]},"post":{"tags":["Authentication"],"summary":"Create Client Credential","operationId":"createClientCredential","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCredentialCreateReq"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCredential"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/auth/client-credentials/{client_id}":{"patch":{"tags":["Authentication"],"summary":"Update Client Credential","operationId":"updateClientCredential","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCredentialUpdateReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCredential"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Authentication"],"summary":"Delete Client Credential","operationId":"deleteClientCredential","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/details/search":{"post":{"tags":["Topics"],"summary":"Search topics (POST)","description":"POST alternative for GET /topics/details. Use when URL length limits are exceeded (e.g., 100+ entity IDs). Supports both query parameters and request body. Body parameters take precedence over query parameters.","operationId":"searchTopics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by entity type(s). Single value (e.g., 'sources') or comma-separated (e.g., 'sources,transforms'). Valid types: sources, destinations, transforms, pipelines, manual.","title":"Entity Type"},"description":"Filter by entity type(s). Single value (e.g., 'sources') or comma-separated (e.g., 'sources,transforms'). Valid types: sources, destinations, transforms, pipelines, manual."},{"name":"topic_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id"}},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Topic id","title":"Partial Name"},"description":"Topic id"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Page Size"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by specific entity IDs (comma-separated list)","title":"Entity Id"},"description":"Filter by specific entity IDs (comma-separated list)"},{"name":"include_dlq","in":"query","required":false,"schema":{"type":"boolean","description":"Include Dead Letter Queue (DLQ) topics in results. Set to false to exclude DLQ topics.","default":true,"title":"Include Dlq"},"description":"Include Dead Letter Queue (DLQ) topics in results. Set to false to exclude DLQ topics."},{"name":"include_internal","in":"query","required":false,"schema":{"type":"boolean","description":"Local/admin-app only: include Streamkap/KC internal topics (streamkap_signal, streamkap_state, KC offsets/configs/status) in the result. Internal topics carry connector='internal:<klass>'.","default":false,"title":"Include Internal"},"description":"Local/admin-app only: include Streamkap/KC internal topics (streamkap_signal, streamkap_state, KC offsets/configs/status) in the result. Internal topics carry connector='internal:<klass>'."},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter topics by snapshot status. Comma-separated for multiple statuses (e.g., 'running', 'completed,failed'). Valid statuses: running, completed, failed, pending, cancelled","title":"Snapshot"},"description":"Filter topics by snapshot status. Comma-separated for multiple statuses (e.g., 'running', 'completed,failed'). Valid statuses: running, completed, failed, pending, cancelled"},{"name":"eta","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by snapshot ETA in milliseconds. Format: 'operator:value' (e.g., 'gt:60000', 'lte:300000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=). Topics without ETA (null/0) are excluded when filtering.","title":"Eta"},"description":"Filter by snapshot ETA in milliseconds. Format: 'operator:value' (e.g., 'gt:60000', 'lte:300000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=). Topics without ETA (null/0) are excluded when filtering."},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start timestamp for filtering topics by activity period (ISO 8601 format)","title":"Timestamp From"},"description":"Start timestamp for filtering topics by activity period (ISO 8601 format)"},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End timestamp for filtering topics by activity period (ISO 8601 format)","title":"Timestamp To"},"description":"End timestamp for filtering topics by activity period (ISO 8601 format)"},{"name":"time_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["timeseries","timesummary","latest"],"type":"string"},{"type":"null"}],"description":"Time aggregation type for filtering active topics (only applies when timestamp_from/to are specified)","title":"Time Type"},"description":"Time aggregation type for filtering active topics (only applies when timestamp_from/to are specified)"},{"name":"value_format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by serialization value format. Valid values: avro, json, json_schema, protobuf, string, bytearray. Case-insensitive. Omit or pass null to return all formats.","title":"Value Format"},"description":"Filter by serialization value format. Valid values: avro, json, json_schema, protobuf, string, bytearray. Case-insensitive. Omit or pass null to return all formats."},{"name":"has_errors","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter topics by error status. true = only topics with recordErrorTotal > 0, false = only topics with recordErrorTotal == 0, null/omit = return all topics.","title":"Has Errors"},"description":"Filter topics by error status. true = only topics with recordErrorTotal > 0, false = only topics with recordErrorTotal == 0, null/omit = return all topics."},{"name":"orphaned","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by orphaned status. true = only topics with 0 destinations, false = only topics with destinations.","title":"Orphaned"},"description":"Filter by orphaned status. true = only topics with 0 destinations, false = only topics with destinations."},{"name":"partition_skew","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by partition skew. true = only topics where max partition lag > 2x average.","title":"Partition Skew"},"description":"Filter by partition skew. true = only topics where max partition lag > 2x average."},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Valid values: DB fields (name, connector, entity_type, entity_name), snapshot_status (sources only), or Kafka-admin fields (partition_count, replication_factor, retention_ms, lastMessageTimestamp).","title":"Sort"},"description":"Sort field. Valid values: DB fields (name, connector, entity_type, entity_name), snapshot_status (sources only), or Kafka-admin fields (partition_count, replication_factor, retention_ms, lastMessageTimestamp)."},{"name":"sort_dir","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"asc","title":"Sort Dir"}},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic.","title":"Tag Ids"},"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic."},{"name":"tag_filter_operation","in":"query","required":false,"schema":{"anyOf":[{"enum":["and","or"],"type":"string"},{"type":"null"}],"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags.","default":"or","title":"Tag Filter Operation"},"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TopicDetailsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicsDetailsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/details":{"get":{"tags":["Topics"],"summary":"List all topics","operationId":"listTopics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by entity type(s). Single value (e.g., 'sources') or comma-separated (e.g., 'sources,transforms'). Valid types: sources, destinations, transforms, pipelines, manual.","title":"Entity Type"},"description":"Filter by entity type(s). Single value (e.g., 'sources') or comma-separated (e.g., 'sources,transforms'). Valid types: sources, destinations, transforms, pipelines, manual."},{"name":"topic_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id"}},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Topic id","title":"Partial Name"},"description":"Topic id"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Page Size"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by specific entity IDs (comma-separated list)","title":"Entity Id"},"description":"Filter by specific entity IDs (comma-separated list)"},{"name":"include_dlq","in":"query","required":false,"schema":{"type":"boolean","description":"Include Dead Letter Queue (DLQ) topics in results. Set to false to exclude DLQ topics.","default":true,"title":"Include Dlq"},"description":"Include Dead Letter Queue (DLQ) topics in results. Set to false to exclude DLQ topics."},{"name":"include_internal","in":"query","required":false,"schema":{"type":"boolean","description":"Local/admin-app only: include Streamkap/KC internal topics (streamkap_signal, streamkap_state, KC offsets/configs/status) in the result. Internal topics carry connector='internal:<klass>'.","default":false,"title":"Include Internal"},"description":"Local/admin-app only: include Streamkap/KC internal topics (streamkap_signal, streamkap_state, KC offsets/configs/status) in the result. Internal topics carry connector='internal:<klass>'."},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter topics by snapshot status. Comma-separated for multiple statuses (e.g., 'running', 'completed,failed'). Valid statuses: running, completed, failed, pending, cancelled","title":"Snapshot"},"description":"Filter topics by snapshot status. Comma-separated for multiple statuses (e.g., 'running', 'completed,failed'). Valid statuses: running, completed, failed, pending, cancelled"},{"name":"eta","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by snapshot ETA in milliseconds. Format: 'operator:value' (e.g., 'gt:60000', 'lte:300000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=). Topics without ETA (null/0) are excluded when filtering.","title":"Eta"},"description":"Filter by snapshot ETA in milliseconds. Format: 'operator:value' (e.g., 'gt:60000', 'lte:300000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=). Topics without ETA (null/0) are excluded when filtering."},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start timestamp for filtering topics by activity period (ISO 8601 format)","title":"Timestamp From"},"description":"Start timestamp for filtering topics by activity period (ISO 8601 format)"},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End timestamp for filtering topics by activity period (ISO 8601 format)","title":"Timestamp To"},"description":"End timestamp for filtering topics by activity period (ISO 8601 format)"},{"name":"time_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["timeseries","timesummary","latest"],"type":"string"},{"type":"null"}],"description":"Time aggregation type for filtering active topics (only applies when timestamp_from/to are specified)","title":"Time Type"},"description":"Time aggregation type for filtering active topics (only applies when timestamp_from/to are specified)"},{"name":"value_format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by serialization value format. Valid values: avro, json, json_schema, protobuf, string, bytearray. Case-insensitive. Omit or pass null to return all formats.","title":"Value Format"},"description":"Filter by serialization value format. Valid values: avro, json, json_schema, protobuf, string, bytearray. Case-insensitive. Omit or pass null to return all formats."},{"name":"has_errors","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter topics by error status. true = only topics with recordErrorTotal > 0, false = only topics with recordErrorTotal == 0, null/omit = return all topics.","title":"Has Errors"},"description":"Filter topics by error status. true = only topics with recordErrorTotal > 0, false = only topics with recordErrorTotal == 0, null/omit = return all topics."},{"name":"orphaned","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by orphaned status. true = only topics with 0 destinations, false = only topics with destinations.","title":"Orphaned"},"description":"Filter by orphaned status. true = only topics with 0 destinations, false = only topics with destinations."},{"name":"partition_skew","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by partition skew. true = only topics where max partition lag > 2x average.","title":"Partition Skew"},"description":"Filter by partition skew. true = only topics where max partition lag > 2x average."},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Valid values: DB fields (name, connector, entity_type, entity_name), snapshot_status (sources only), or Kafka-admin fields (partition_count, replication_factor, retention_ms, lastMessageTimestamp).","title":"Sort"},"description":"Sort field. Valid values: DB fields (name, connector, entity_type, entity_name), snapshot_status (sources only), or Kafka-admin fields (partition_count, replication_factor, retention_ms, lastMessageTimestamp)."},{"name":"sort_dir","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"asc","title":"Sort Dir"}},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic.","title":"Tag Ids"},"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic."},{"name":"tag_filter_operation","in":"query","required":false,"schema":{"anyOf":[{"enum":["and","or"],"type":"string"},{"type":"null"}],"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags.","default":"or","title":"Tag Filter Operation"},"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TopicDetailsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicsDetailsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/details/grouped":{"get":{"tags":["Topics"],"summary":"List topics grouped by connector/entity","description":"Get topics grouped by entity_id (connector instances) with nested pagination.\n\nEach group represents a source/transform/destination entity and contains its topics.\nSupports dual pagination (groups and topics within groups) and dual sorting.\n\nSupports multiple entity types via comma-separated values (e.g., entity_type=sources,transforms).\nNote: group_id requires exactly one entity_type to be specified.","operationId":"listTopicsGrouped","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by entity type(s). Single value (e.g., 'sources') or comma-separated (e.g., 'sources,transforms'). Valid types: sources, destinations, transforms, pipelines, manual.","title":"Entity Type"},"description":"Filter by entity type(s). Single value (e.g., 'sources') or comma-separated (e.g., 'sources,transforms'). Valid types: sources, destinations, transforms, pipelines, manual."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Page Size"}},{"name":"topics_per_group","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Topics Per Group"}},{"name":"topics_page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Topics Page"}},{"name":"sort_groups_by","in":"query","required":false,"schema":{"enum":["name","connector","topic_count"],"type":"string","default":"name","title":"Sort Groups By"}},{"name":"sort_groups_dir","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"asc","title":"Sort Groups Dir"}},{"name":"sort_topics_by","in":"query","required":false,"schema":{"type":"string","default":"name","title":"Sort Topics By"}},{"name":"sort_topics_dir","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"asc","title":"Sort Topics Dir"}},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partial Name"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector"}},{"name":"group_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a specific group/entity_id. Requires exactly one entity_type when used.","title":"Group Id"},"description":"Filter to a specific group/entity_id. Requires exactly one entity_type when used."},{"name":"group_topic_pages","in":"query","required":false,"schema":{"anyOf":[{"type":"object","additionalProperties":{"type":"integer"}},{"type":"null"}],"title":"Group Topic Pages"}},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic.","title":"Tag Ids"},"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic."},{"name":"tag_filter_operation","in":"query","required":false,"schema":{"anyOf":[{"enum":["and","or"],"type":"string"},{"type":"null"}],"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags.","default":"or","title":"Tag Filter Operation"},"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicsDetailsGroupedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/statistics":{"get":{"tags":["Topics"],"summary":"Get topic statistics","operationId":"getTopicStatistics","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicStatisticsRes"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/topics/configs":{"get":{"tags":["Topics"],"summary":"Get topic configurations","operationId":"getTopicConfigs","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"mapping_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["config","metrics","create"],"type":"string"},{"type":"null"}],"title":"Mapping Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/metrics":{"get":{"tags":["Topics"],"summary":"Get topic metrics","operationId":"getTopicMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp To"}},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp From"}},{"name":"time_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Type"}},{"name":"time_interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Time Interval"}},{"name":"time_unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Time Unit"}},{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by entity type. Valid values: sources, transforms. Comma-separated for multiple (e.g., 'sources,transforms').","title":"Entity Type"},"description":"Filter by entity type. Valid values: sources, transforms. Comma-separated for multiple (e.g., 'sources,transforms')."},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by specific entity IDs (comma-separated list).","title":"Entity Id"},"description":"Filter by specific entity IDs (comma-separated list)."},{"name":"value_format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by serialization value format. Valid values: avro, json, json_schema, protobuf, string, bytearray. Case-insensitive.","title":"Value Format"},"description":"Filter by serialization value format. Valid values: avro, json, json_schema, protobuf, string, bytearray. Case-insensitive."},{"name":"has_errors","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter topics by error status. true = only topics with recordErrorTotal > 0.","title":"Has Errors"},"description":"Filter topics by error status. true = only topics with recordErrorTotal > 0."},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by topic name (partial match).","title":"Partial Name"},"description":"Filter by topic name (partial match)."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicMetricsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/table_metrics":{"post":{"tags":["Topics"],"summary":"Per-topic Kafka metadata for the topics list","description":"Returns per-topic Kafka broker metadata (partition_count, replication_factor, retention_ms) and lastMessageTimestamp, keyed by topic_id.\n\n`sources`/`transforms` entities must carry matching `topic_ids` and `topic_db_ids` (used for ownership verification); such entities missing `topic_db_ids` return HTTP 400. `destinations` are exempt (send `topic_db_ids: []`) — they are verified against the destination's topic_map. Topic names must match `[a-zA-Z0-9._-]{1,249}`; up to 1000 per entity.\n\nAll `kafka.*` fields are nullable — `null` means the broker did not return metadata for that topic, which is distinct from a legitimate `0`. Values may be up to ~60 s stale for `partition_count` / `replication_factor` / `retention_ms` and up to ~10 s stale for `lastMessageTimestamp`.","operationId":"getTopicTableMetrics","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicTableMetricsReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"$ref":"#/components/schemas/TopicTableMetricsRowRes"},"type":"object","title":"Response Gettopictablemetrics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/topics/messages":{"get":{"tags":["Topics"],"summary":"Get topic messages","operationId":"getTopicMessages","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"asc","title":"Sort"}},{"name":"topic_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gettopicmessages"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/messages/value":{"get":{"tags":["Topics"],"summary":"Get a single topic message value","description":"Fetch the full value of a single topic message on demand (e.g. for oversized messages).","operationId":"getTopicMessageValue","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"topic_id","in":"query","required":true,"schema":{"type":"string","description":"Kafka topic name","title":"Topic Id"},"description":"Kafka topic name"},{"name":"partition","in":"query","required":true,"schema":{"type":"integer","minimum":0,"description":"Partition number","title":"Partition"},"description":"Partition number"},{"name":"offset","in":"query","required":true,"schema":{"type":"integer","minimum":0,"description":"Message offset within partition","title":"Offset"},"description":"Message offset within partition"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Gettopicmessagevalue"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/{topic_id}/raw-metrics":{"get":{"tags":["Topics"],"summary":"Get latest raw metrics for a topic","description":"Returns the latest raw metric values (per partition / task / context) from the ClickHouse `metrics` and `metrics_qa` tables for a single topic — bypassing the materialized-view aggregation that powers the lineage / observability surfaces.\n\nIntended for debugging discrepancies between what raw CH holds and what the UI renders. Returns one row per (metric_name, partition, task, context); the caller is responsible for aggregating across partitions if needed (sum for lag, max for latency, etc.).","operationId":"getTopicRawMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","title":"Topic Id"}},{"name":"since","in":"query","required":false,"schema":{"type":"string","description":"Lookback window. Accepts '<int><unit>' where unit ∈ {s,m,h,d}. Defaults to 15m, capped at 3d (raw-table TTL).","default":"15m","title":"Since"},"description":"Lookback window. Accepts '<int><unit>' where unit ∈ {s,m,h,d}. Defaults to 15m, capped at 3d (raw-table TTL)."},{"name":"metric_names","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated metric_name filter. Omit to return every metric_name seen in the window.","title":"Metric Names"},"description":"Comma-separated metric_name filter. Omit to return every metric_name seen in the window."},{"name":"include_destinations","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Destinations"}},{"name":"include_qa","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Qa"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicRawMetricsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/bulk/snapshot":{"post":{"tags":["Topics"],"summary":"Bulk Snapshot Topics","description":"Execute snapshot for selected topics, grouped by their source connector.\n\nAccepts topic DB IDs, resolves them to their source connectors, and triggers\nper-source snapshots scoped to only the selected topics (via topic_names).\n\nOnly topics produced by source connectors can be snapshotted - topics from\ntransforms, destinations, or manually created topics are skipped.\n\nSupports both incremental (default) and blocking snapshot types:\n- **incremental**: Uses watermarking to capture data while streaming continues.\n- **blocking**: Pauses streaming during snapshot. Required for keyless tables.\n\nResults are reported per source connector, since snapshots are source-level operations.\nReturns partial success results - continues processing even if individual snapshots fail.","operationId":"bulkSnapshotTopics","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTopicSnapshotReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/topics/bulk/stop-snapshot":{"post":{"tags":["Topics"],"summary":"Bulk Stop Snapshot Topics","description":"Stop snapshot for sources identified by the selected topics.\n\nAccepts topic DB IDs, resolves them to their source connectors, and stops\nany running snapshots on those sources.\n\nNote: Because snapshots run at the source level, stopping affects all topics\nfor that source, not just the selected ones.\n\nAutomatically detects the running snapshot type (incremental or blocking)\nand uses the appropriate cancellation method:\n- Incremental: Cancels via signal table, streaming continues.\n- Blocking: Restarts the connector, streaming resumes after restart.\n\nReturns partial success results - continues processing even if individual stop operations fail.","operationId":"bulkStopSnapshotTopics","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTopicStopSnapshotReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/topics/catalog":{"get":{"tags":["Topics"],"summary":"Browse topics for SQL Studio","description":"Get a browsable catalog of topics with schema metadata for the Query Playground.","operationId":"getTopicCatalog","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Page Size"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Partial topic name search","title":"Search"},"description":"Partial topic name search"},{"name":"value_format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by serialization format (avro, json, protobuf, etc.)","title":"Value Format"},"description":"Filter by serialization format (avro, json, protobuf, etc.)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KafkaTopicCatalogRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/catalog/grouped":{"get":{"tags":["Topics"],"summary":"Browse topics grouped by source","description":"Get topics grouped by source connector for the SQL Studio tree sidebar.","operationId":"getTopicCatalogGrouped","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Partial topic name search","title":"Search"},"description":"Partial topic name search"},{"name":"source_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to a single source/producer ID","title":"Source Id"},"description":"Filter to a single source/producer ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KafkaTopicCatalogGroupedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/catalog/schema":{"get":{"tags":["Topics"],"summary":"Get schema for a single topic","description":"Lazy-fetch schema fields for a single topic (called on tree node expand).","operationId":"getTopicSchema","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"topic_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Kafka topic name","title":"Topic Id"},"description":"Kafka topic name"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KafkaTopicSchemaRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/query":{"post":{"tags":["Topics"],"summary":"Execute SQL query against Kafka topics","description":"Parse and execute a SQL query against a Kafka topic.","operationId":"executeSqlQuery","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KafkaSqlQueryReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KafkaSqlQueryRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/topics":{"post":{"tags":["Topics"],"summary":"Create a new Kafka topic","operationId":"createTopic","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicReq"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/topics/internal/publish":{"post":{"tags":["Topics"],"summary":"Publish a record to a Streamkap/KC internal topic (local + admin app only)","operationId":"publishInternalTopicMessage","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Publishinternaltopicmessage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/topics/{topic_id}":{"get":{"tags":["Topics"],"summary":"Get comprehensive topic information","operationId":"getTopic","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","title":"Topic Id"}},{"name":"detailed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Detailed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TopicDetailsWithKafka"},{"type":"object","additionalProperties":true}],"title":"Response Gettopic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Topics"],"summary":"Update Topic Api","operationId":"updateTopic","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","title":"Topic Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopicUpdateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Topics"],"summary":"Delete Topic Api","operationId":"deleteTopic","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"topic_id","in":"path","required":true,"schema":{"type":"string","title":"Topic Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/topics/bulk_update":{"put":{"tags":["Topics"],"summary":"Update Bulk Topics","description":"Update tags for multiple topics in bulk.\n\nSupports two modes:\n1. Explicit IDs: Pass a list of topic IDs to update\n2. Select all: Set select_all=true with optional filters","operationId":"bulkUpdateTopics","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateEntityReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/logs":{"post":{"tags":["Logs"],"summary":"Get Logs","description":"Get logs","operationId":"queryLogs","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":1000,"minimum":10},{"type":"null"}],"title":"Size"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"From"}},{"name":"log_level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of log level. Example: INFO,WARN","title":"Log Level"},"description":"A comma-separated list of log level. Example: INFO,WARN"},{"name":"query_string","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query String"}},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"Example: 2025-07-30T07:54:13.922","title":"Timestamp To"},"description":"Example: 2025-07-30T07:54:13.922"},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"Example: 2025-07-30T07:54:13.922","title":"Timestamp From"},"description":"Example: 2025-07-30T07:54:13.922"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logs/summary":{"post":{"tags":["Logs"],"summary":"Summarise Log","description":"Generate and store a structured summary for a single log entry.","operationId":"summarizeLog","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummariseLogBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/logs/histogram":{"post":{"tags":["Logs"],"summary":"Get Logs Histogram","description":"Get histogram data for log counts bucketed by time.\n\nReturns time-series data suitable for rendering a histogram chart.","operationId":"getLogsHistogram","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"timestamp_from","in":"query","required":true,"schema":{"type":"string","description":"Start of time range (ISO 8601)","title":"Timestamp From"},"description":"Start of time range (ISO 8601)"},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End of time range (ISO 8601)","title":"Timestamp To"},"description":"End of time range (ISO 8601)"},{"name":"bucket_count","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Number of buckets","default":30,"title":"Bucket Count"},"description":"Number of buckets"},{"name":"log_level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated log levels","title":"Log Level"},"description":"Comma-separated log levels"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/HistogramRequestBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistogramResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logs/count":{"post":{"tags":["Logs"],"summary":"Get Logs Count","description":"Get count of new logs since a specific timestamp.\n\nLightweight endpoint for real-time polling. Recommended polling interval: 5 seconds.\nUse this to show a \"N new logs\" badge in the UI.","operationId":"getLogsCount","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"since","in":"query","required":true,"schema":{"type":"string","description":"Count logs after this timestamp (ISO 8601)","title":"Since"},"description":"Count logs after this timestamp (ISO 8601)"},{"name":"log_level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated log levels","title":"Log Level"},"description":"Comma-separated log levels"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/LogCountRequestBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogCountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/search":{"post":{"tags":["Transforms"],"summary":"Search transforms (POST)","description":"POST alternative for GET /transforms. Use when URL length limits are exceeded (e.g., 100+ tag IDs). Supports both query parameters and request body. Body parameters take precedence over query parameters.","operationId":"searchTransforms","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partial Name"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Can be DB field (name, created_timestamp) or metric (status, latency, duration)","title":"Sort"},"description":"Sort field. Can be DB field (name, created_timestamp) or metric (status, latency, duration)"},{"name":"sort_dir","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort direction: 'asc' or 'desc'","default":"asc","title":"Sort Dir"},"description":"Sort direction: 'asc' or 'desc'"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status. Comma-separated for multiple (e.g., 'RUNNING', 'RUNNING,STOPPED'). Valid statuses: RUNNING, INITIALIZING, DEPLOYING, CANCELLING, CANCELED, CREATED, RESTARTING, FAILING, FAILED, STOPPED, UNKNOWN","title":"Status"},"description":"Filter by status. Comma-separated for multiple (e.g., 'RUNNING', 'RUNNING,STOPPED'). Valid statuses: RUNNING, INITIALIZING, DEPLOYING, CANCELLING, CANCELED, CREATED, RESTARTING, FAILING, FAILED, STOPPED, UNKNOWN"},{"name":"latency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Latency"},"description":"Filter by latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"duration","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by duration in milliseconds. Format: 'operator:value' (e.g., 'gt:5000', 'lt:1000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Duration"},"description":"Filter by duration in milliseconds. Format: 'operator:value' (e.g., 'gt:5000', 'lt:1000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"unwind_topics","in":"query","required":false,"schema":{"type":"boolean","description":"Unwind topics into separate rows (one per topic). Default is False (topics returned as array in each transform row). Note: Pagination with unwind_topics=true may not reflect accurate totals.","default":false,"title":"Unwind Topics"},"description":"Unwind topics into separate rows (one per topic). Default is False (topics returned as array in each transform row). Note: Pagination with unwind_topics=true may not reflect accurate totals."},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic.","title":"Tag Ids"},"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic."},{"name":"tag_filter_operation","in":"query","required":false,"schema":{"anyOf":[{"enum":["and","or"],"type":"string"},{"type":"null"}],"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags.","default":"or","title":"Tag Filter Operation"},"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TransformDetailsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullTransformsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms":{"get":{"tags":["Transforms"],"summary":"Get Full Transforms","operationId":"listTransforms","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partial Name"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Can be DB field (name, created_timestamp) or metric (status, latency, duration)","title":"Sort"},"description":"Sort field. Can be DB field (name, created_timestamp) or metric (status, latency, duration)"},{"name":"sort_dir","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort direction: 'asc' or 'desc'","default":"asc","title":"Sort Dir"},"description":"Sort direction: 'asc' or 'desc'"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status. Comma-separated for multiple (e.g., 'RUNNING', 'RUNNING,STOPPED'). Valid statuses: RUNNING, INITIALIZING, DEPLOYING, CANCELLING, CANCELED, CREATED, RESTARTING, FAILING, FAILED, STOPPED, UNKNOWN","title":"Status"},"description":"Filter by status. Comma-separated for multiple (e.g., 'RUNNING', 'RUNNING,STOPPED'). Valid statuses: RUNNING, INITIALIZING, DEPLOYING, CANCELLING, CANCELED, CREATED, RESTARTING, FAILING, FAILED, STOPPED, UNKNOWN"},{"name":"latency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Latency"},"description":"Filter by latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"duration","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by duration in milliseconds. Format: 'operator:value' (e.g., 'gt:5000', 'lt:1000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Duration"},"description":"Filter by duration in milliseconds. Format: 'operator:value' (e.g., 'gt:5000', 'lt:1000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"unwind_topics","in":"query","required":false,"schema":{"type":"boolean","description":"Unwind topics into separate rows (one per topic). Default is False (topics returned as array in each transform row). Note: Pagination with unwind_topics=true may not reflect accurate totals.","default":false,"title":"Unwind Topics"},"description":"Unwind topics into separate rows (one per topic). Default is False (topics returned as array in each transform row). Note: Pagination with unwind_topics=true may not reflect accurate totals."},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic.","title":"Tag Ids"},"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic."},{"name":"tag_filter_operation","in":"query","required":false,"schema":{"anyOf":[{"enum":["and","or"],"type":"string"},{"type":"null"}],"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags.","default":"or","title":"Tag Filter Operation"},"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TransformDetailsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullTransformsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Transforms"],"summary":"Update Transform","operationId":"updateTransform","security":[{"FronteggHTTPAuthentication":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTransformReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullTransformEntity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Transforms"],"summary":"Create New Transform","operationId":"createTransform","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"secret_returned","in":"query","required":false,"schema":{"type":"boolean","description":"Whether to include secret values in the response","default":false,"title":"Secret Returned"},"description":"Whether to include secret values in the response"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTransformReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullTransformEntity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Transforms"],"summary":"Delete Existing Transform","operationId":"deleteTransform","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/brief":{"get":{"tags":["Transforms"],"summary":"List All Transforms Brief","operationId":"listTransformsBrief","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BriefTransform"},"type":"array","title":"Response Listtransformsbrief"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/transforms/topics-for-pattern/{topic_pattern}/{java_replacement_pattern}":{"get":{"tags":["Transforms"],"summary":"Get Topics For Pattern","operationId":"getTopicsForPattern","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"topic_pattern","in":"path","required":true,"schema":{"type":"string","title":"Topic Pattern"}},{"name":"java_replacement_pattern","in":"path","required":true,"schema":{"type":"string","title":"Java Replacement Pattern"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"array","prefixItems":[{"type":"string"},{"type":"string"}],"minItems":2,"maxItems":2},"title":"Response Gettopicsforpattern"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/bulk_update":{"put":{"tags":["Transforms"],"summary":"Update Bulk Transforms","description":"Update tags for multiple transforms in bulk.\n\nSupports two modes:\n1. Explicit IDs: Pass a list of transform IDs to update\n2. Select all: Set select_all=true with optional filters","operationId":"bulkUpdateTransforms","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateEntityReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/transforms/bulk/clone":{"post":{"tags":["Transforms"],"summary":"Bulk Clone Transforms","description":"Clone multiple transforms with new names in parallel.\nSupports two modes:\n1. Explicit items: Provide list of items with id and name for each clone\n2. Select all: Set select_all=true with optional filters and name_suffix\n\nReturns partial success results - continues processing even if individual clones fail.","operationId":"bulkCloneTransforms","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCloneReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/transforms/bulk/delete":{"delete":{"tags":["Transforms"],"summary":"Bulk Delete Transforms","description":"Delete multiple transforms in parallel.\nSupports two modes:\n1. Explicit IDs: Pass a list of transform IDs to delete\n2. Select all: Set select_all=true with optional filters to delete all matching transforms\n\nReturns partial success results - continues processing even if individual deletes fail.","operationId":"bulkDeleteTransforms","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/transforms/{transforms_id}/set-input-output-topics/{topic_pattern}/{java_replacement_pattern}":{"put":{"tags":["Transforms"],"summary":"Set Input Output Topics","operationId":"setTransformInputOutputTopics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transforms_id","in":"path","required":true,"schema":{"type":"string","title":"Transforms Id"}},{"name":"topic_pattern","in":"path","required":true,"schema":{"type":"string","title":"Topic Pattern"}},{"name":"java_replacement_pattern","in":"path","required":true,"schema":{"type":"string","title":"Java Replacement Pattern"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullTransformEntity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/{transforms_id}/clear-output-topics/{output_topic_pattern}":{"put":{"tags":["Transforms"],"summary":"Clear Output Topics","operationId":"clearTransformOutputTopics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transforms_id","in":"path","required":true,"schema":{"type":"string","title":"Transforms Id"}},{"name":"output_topic_pattern","in":"path","required":true,"schema":{"type":"string","title":"Output Topic Pattern"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Cleartransformoutputtopics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/{transforms_id}/output-topics":{"get":{"tags":["Transforms"],"summary":"Get Output Topics For Transform","operationId":"getTransformOutputTopics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transforms_id","in":"path","required":true,"schema":{"type":"string","title":"Transforms Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Response Gettransformoutputtopics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/{transforms_id}/errors":{"get":{"tags":["Transforms"],"summary":"Get Errors Transform","operationId":"getTransformErrors","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transforms_id","in":"path","required":true,"schema":{"type":"string","title":"Transforms Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TransformJobError"},"title":"Response Gettransformerrors"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/{transforms_id}/job_status":{"get":{"tags":["Transforms"],"summary":"Get Jobs Status","operationId":"getTransformJobStatus","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transforms_id","in":"path","required":true,"schema":{"type":"string","title":"Transforms Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransformJobStatusRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/{transforms_id}/implementation_details":{"get":{"tags":["Transforms"],"summary":"Get Transforms Implementation Details","operationId":"getTransformImplementation","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transforms_id","in":"path","required":true,"schema":{"type":"string","title":"Transforms Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransformsImplementationDetailsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Transforms"],"summary":"Put Transforms Implementation Details","operationId":"updateTransformImplementation","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transforms_id","in":"path","required":true,"schema":{"type":"string","title":"Transforms Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransformsImplementationDetails"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransformsImplementationDetails"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/{transforms_id}/run-unit-tests/{version_id}":{"put":{"tags":["Transforms"],"summary":"Run Unit Tests","operationId":"runTransformUnitTests","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transforms_id","in":"path","required":true,"schema":{"type":"string","title":"Transforms Id"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransformsMapFilterImplementation"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/{transforms_id}/deploy-job-preview/{version_id}":{"put":{"tags":["Transforms"],"summary":"Deploy Job Preview","operationId":"deployTransformPreview","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transforms_id","in":"path","required":true,"schema":{"type":"string","title":"Transforms Id"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}},{"name":"replay_window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Replay Window"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TransformsMapFilterImplementation"},{"$ref":"#/components/schemas/TransformsEnrichAsyncImplementation"},{"$ref":"#/components/schemas/TransformsJoinImplementation"},{"$ref":"#/components/schemas/TransformsEnrichImplementation"},{"$ref":"#/components/schemas/TransformsTopicRouterImplementation"},{"type":"null"}],"title":"Response Deploytransformpreview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/{transforms_id}/deploy-job-live/{version_id}":{"put":{"tags":["Transforms"],"summary":"Deploy Job Live","operationId":"deployTransformLive","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transforms_id","in":"path","required":true,"schema":{"type":"string","title":"Transforms Id"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TransformsMapFilterImplementation"},{"$ref":"#/components/schemas/TransformsEnrichAsyncImplementation"},{"$ref":"#/components/schemas/TransformsJoinImplementation"},{"$ref":"#/components/schemas/TransformsEnrichImplementation"},{"$ref":"#/components/schemas/TransformsTopicRouterImplementation"},{"type":"null"}],"title":"Response Deploytransformlive"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/details":{"get":{"tags":["Transforms"],"summary":"Get Transform Details","operationId":"listTransformDetails","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransformDetailsRes"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/transforms/configs":{"get":{"tags":["Transforms"],"summary":"Get Transform Configs","operationId":"listTransformConfigs","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"items":{"additionalProperties":true,"type":"object"},"type":"array"},"type":"object","title":"Response Listtransformconfigs"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/transforms/{transform_id}/clone":{"post":{"tags":["Transforms"],"summary":"Clone Transform","operationId":"cloneTransform","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transform_id","in":"path","required":true,"schema":{"type":"string","title":"Transform Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloneTransformReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullTransformEntity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/full-process":{"post":{"tags":["Transforms"],"summary":"Create New Transform With Full Process","operationId":"createTransformFullProcess","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"secret_returned","in":"query","required":false,"schema":{"type":"boolean","description":"Whether to include secret values in the response","default":false,"title":"Secret Returned"},"description":"Whether to include secret values in the response"},{"name":"replay_window","in":"query","required":false,"schema":{"type":"string","default":"","title":"Replay Window"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTransformWithFullProcessReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullTransformEntity"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/metrics":{"get":{"tags":["Transforms"],"summary":"Get Transform Metrics","operationId":"listTransformMetrics","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/transforms/{transform_id}":{"get":{"tags":["Transforms"],"summary":"Get Full Transforms With Id","operationId":"getTransform","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transform_id","in":"path","required":true,"schema":{"type":"string","title":"Transform Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullTransformsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/{transform_id}/dlq":{"get":{"tags":["Transforms"],"summary":"Get Transform Dlq Errors","description":"Get DLQ errors for transform - retrieves the first DLQ error from the topic\nand shows: timestamp, error message, message offset, link to the DLQ topic.\n\nReturns:\n    TransformDLQError: First DLQ error with parsed error message\n    None: If transform not found, DLQ topic empty, or access error","operationId":"getTransformDlqErrors","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transform_id","in":"path","required":true,"schema":{"type":"string","title":"Transform Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TransformDLQError"},{"type":"null"}],"title":"Response Gettransformdlqerrors"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/transforms/{transform_id}/checkpoints":{"get":{"tags":["Transforms"],"summary":"Get Transform Checkpoints","description":"Get checkpoint statistics and state size information for a transform job.\n\nReturns checkpoint counts, summary statistics (state size, duration, etc.),\nlatest checkpoint details, and checkpoint history.\n\nArgs:\n    transform_id: The transform ID\n\nReturns:\n    TransformCheckpointsInfo: Checkpoint statistics and history\n    None: If transform job not found or no checkpoints available","operationId":"getTransformCheckpoints","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"transform_id","in":"path","required":true,"schema":{"type":"string","title":"Transform Id"}},{"name":"include_operator_breakdown","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Operator Breakdown"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TransformCheckpointsInfo"},{"type":"null"}],"title":"Response Gettransformcheckpoints"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/services/all":{"get":{"tags":["Services"],"summary":"Get All Service Metadata","description":"Fetch metadata for all tenant services.","operationId":"listServices","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/services/switch":{"put":{"tags":["Services"],"summary":"Switch","description":"Switch service for the tenant.","operationId":"switchService","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":true,"schema":{"type":"string","title":"Id"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/alerts/subscribers/{subscriberId}":{"get":{"tags":["Alerts"],"summary":"Get Subscribers","operationId":"getAlertSubscriber","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"subscriberId","in":"path","required":true,"schema":{"type":"string","title":"Subscriberid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Alerts"],"summary":"Update Subscribers","operationId":"updateAlertSubscriber","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"subscriberId","in":"path","required":true,"schema":{"type":"string","title":"Subscriberid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriberBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/alerts/subscribers/{subscriberId}/preferences":{"get":{"tags":["Alerts"],"summary":"Get Subscriber Preferences","operationId":"getSubscriberPreferences","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"subscriberId","in":"path","required":true,"schema":{"type":"string","title":"Subscriberid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/alerts/subscribers/{subscriberId}/credentials":{"put":{"tags":["Alerts"],"summary":"Update Subscriber Credentials","operationId":"updateSubscriberCredentials","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"subscriberId","in":"path","required":true,"schema":{"type":"string","title":"Subscriberid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Alerts"],"summary":"Delete Subscriber Credentials","operationId":"deleteSubscriberCredentials","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"subscriberId","in":"path","required":true,"schema":{"type":"string","title":"Subscriberid"}},{"name":"provider_id","in":"query","required":true,"schema":{"type":"string","title":"Provider Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/alerts/summary":{"post":{"tags":["Alerts"],"summary":"Summarise Alert","description":"Generate AI-powered summary for an alert.\n\nTakes the alert message and context from Courier, enriches with\nentity configuration, and returns a structured explanation with\ntroubleshooting guidance.","operationId":"summarizeAlert","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummariseAlertBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/billing/usage/metrics":{"post":{"tags":["Usage"],"summary":"Get usage metrics (POST)","description":"POST alternative for GET /billing/usage/metrics. Use when URL length limits are exceeded (e.g., 100+ tenant IDs). Supports both query parameters and request body. Body parameters take precedence over query parameters.","operationId":"searchUsageMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page"}},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"asc","title":"Sort"}},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Source connector name. Example: postgresql, mysql, ...","title":"Connector"},"description":"Source connector name. Example: postgresql, mysql, ..."},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Enter the source name you want to search for","title":"Partial Name"},"description":"Enter the source name you want to search for"},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of Tenant IDs","title":"Tenant Ids"},"description":"A comma-separated list of Tenant IDs"},{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(sources|destinations)$"},{"type":"null"}],"default":"sources","title":"Entity Type"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/GetUsageMetricsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Searchusagemetrics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Usage"],"summary":"Get Usage Metrics","description":"Fetch detailed usage metrics for the organisation.","operationId":"getUsageMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"page_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page Size"}},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Page"}},{"name":"sort","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"asc","title":"Sort"}},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Source connector name. Example: postgresql, mysql, ...","title":"Connector"},"description":"Source connector name. Example: postgresql, mysql, ..."},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Enter the source name you want to search for","title":"Partial Name"},"description":"Enter the source name you want to search for"},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of Tenant IDs","title":"Tenant Ids"},"description":"A comma-separated list of Tenant IDs"},{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(sources|destinations)$"},{"type":"null"}],"default":"sources","title":"Entity Type"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/GetUsageMetricsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Getusagemetrics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/usage/summary":{"get":{"tags":["Usage"],"summary":"Get Usage Summary","description":"Fetch usage summary for the billing page.","operationId":"getUsageSummary","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Getusagesummary"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/billing/usage/export":{"get":{"tags":["Usage"],"summary":"Get Usage Export","description":"Export usage metrics as a CSV.","operationId":"exportUsageMetrics","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Exportusagemetrics"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/other/tenant/trees":{"get":{"tags":["other"],"summary":"Get Tenant Trees","description":"Get hierarchical trees of tenants.","operationId":"getTenantTrees","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/dashboard/organisation/statistics":{"get":{"tags":["Dashboard"],"summary":"Get Organisation Statistics","description":"Fetch organisation statistics for the authenticated user with proper permissions.","operationId":"getOrganisationStatistics","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/dashboard/health":{"get":{"tags":["Dashboard"],"summary":"Get dashboard health summary","description":"Returns a high-level health overview including broken connectors, failed transforms, active snapshots, and topic health metrics.","operationId":"getDashboardHealth","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardHealthRes"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/dashboard/lineage":{"get":{"tags":["Dashboard"],"summary":"Get dashboard lineage groups","description":"Returns lineage groups (sources, destinations, or transforms) with aggregated metrics. Use the group_by parameter to select the grouping dimension.","operationId":"getDashboardLineage","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"group_by","in":"query","required":false,"schema":{"enum":["source","destination","transform","source_audit"],"type":"string","description":"Group lineage by entity type","default":"source","title":"Group By"},"description":"Group lineage by entity type"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter for group names","title":"Search"},"description":"Search filter for group names"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LineageGroupSortEnum"},{"type":"null"}],"description":"Sort field for lineage groups","title":"Sort"},"description":"Sort field for lineage groups"},{"name":"sort_dir","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort direction","default":"desc","title":"Sort Dir"},"description":"Sort direction"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Results per page","default":10,"title":"Page Size"},"description":"Results per page"},{"name":"include_metrics","in":"query","required":false,"schema":{"type":"boolean","description":"When false, skip ClickHouse metrics and return metrics as null for faster initial render","default":true,"title":"Include Metrics"},"description":"When false, skip ClickHouse metrics and return metrics as null for faster initial render"},{"name":"topic_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter groups to those with matching topics (substring, case-insensitive)","title":"Topic Name"},"description":"Filter groups to those with matching topics (substring, case-insensitive)"},{"name":"source_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated source entity IDs to filter groups by","title":"Source Ids"},"description":"Comma-separated source entity IDs to filter groups by"},{"name":"destination_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated destination entity IDs to filter groups by","title":"Destination Ids"},"description":"Comma-separated destination entity IDs to filter groups by"},{"name":"transform_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated transform entity IDs to filter groups by","title":"Transform Ids"},"description":"Comma-separated transform entity IDs to filter groups by"},{"name":"include_topics","in":"query","required":false,"schema":{"type":"boolean","description":"When true, embed first page of enriched topics in each group","default":false,"title":"Include Topics"},"description":"When true, embed first page of enriched topics in each group"},{"name":"topics_page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max topics to embed per group","default":20,"title":"Topics Page Size"},"description":"Max topics to embed per group"},{"name":"topics_sort","in":"query","required":false,"schema":{"enum":["byteTotal","latency","speed","lag","name"],"type":"string","description":"Sort field for embedded topics","default":"byteTotal","title":"Topics Sort"},"description":"Sort field for embedded topics"},{"name":"topics_sort_dir","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort direction for embedded topics","default":"desc","title":"Topics Sort Dir"},"description":"Sort direction for embedded topics"},{"name":"diff_bands","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated diff% bands for topic filtering (audit tab). Each band is 'min-max' (inclusive). Multi-select: topic passes if its rounded-to-2-decimals max diff% falls in ANY band. Example: '0-0.05,2-10'.","title":"Diff Bands"},"description":"Comma-separated diff% bands for topic filtering (audit tab). Each band is 'min-max' (inclusive). Multi-select: topic passes if its rounded-to-2-decimals max diff% falls in ANY band. Example: '0-0.05,2-10'."},{"name":"latency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter groups by max_latency_ms using \"op:value\" syntax (e.g. \"gt:300000\"). Ops: gt|gte|lt|lte|eq|ne.","title":"Latency"},"description":"Filter groups by max_latency_ms using \"op:value\" syntax (e.g. \"gt:300000\"). Ops: gt|gte|lt|lte|eq|ne."},{"name":"lag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter groups by total_lag using \"op:value\" syntax (e.g. \"gt:1000\"). Ops: gt|gte|lt|lte|eq|ne.","title":"Lag"},"description":"Filter groups by total_lag using \"op:value\" syntax (e.g. \"gt:1000\"). Ops: gt|gte|lt|lte|eq|ne."},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter groups by snapshot state. Comma-separated list: running|pending|completed|failed|not_started.","title":"Snapshot"},"description":"Filter groups by snapshot state. Comma-separated list: running|pending|completed|failed|not_started."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLineageRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/lineage/topics":{"get":{"tags":["Dashboard"],"summary":"Get dashboard lineage topics","description":"Returns detailed topic-level lineage information including source, transforms, destinations, and per-topic metrics. Supports filtering and pagination.","operationId":"getDashboardLineageTopics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by source entity ID","title":"Source Id"},"description":"Filter by source entity ID"},{"name":"destination_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by destination entity ID","title":"Destination Id"},"description":"Filter by destination entity ID"},{"name":"transform_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by transform entity ID","title":"Transform Id"},"description":"Filter by transform entity ID"},{"name":"topic_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by topic name (substring match)","title":"Topic Name"},"description":"Filter by topic name (substring match)"},{"name":"filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated topic filters: has_destination, orphaned, has_transform, dlq, snapshotting","title":"Filter"},"description":"Comma-separated topic filters: has_destination, orphaned, has_transform, dlq, snapshotting"},{"name":"include_dlq","in":"query","required":false,"schema":{"type":"boolean","description":"When false, exclude DLQ topics","default":true,"title":"Include Dlq"},"description":"When false, exclude DLQ topics"},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Comma-separated snapshot status filter: running, completed, pending","title":"Snapshot"},"description":"Comma-separated snapshot status filter: running, completed, pending"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Results per page","default":5,"title":"Page Size"},"description":"Results per page"},{"name":"sort","in":"query","required":false,"schema":{"enum":["byteTotal","latency","speed","lag","name"],"type":"string","description":"Sort field","default":"byteTotal","title":"Sort"},"description":"Sort field"},{"name":"sort_dir","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","description":"Sort direction","default":"desc","title":"Sort Dir"},"description":"Sort direction"},{"name":"include_metrics","in":"query","required":false,"schema":{"type":"boolean","description":"When false, skip ClickHouse metrics and return metrics as null for faster initial render","default":true,"title":"Include Metrics"},"description":"When false, skip ClickHouse metrics and return metrics as null for faster initial render"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLineageTopicsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/lineage/topics/batch":{"post":{"tags":["Dashboard"],"summary":"Batch fetch topics for multiple entities","description":"Returns enriched topics grouped by entity ID. Use for polling refresh or expand-all when groups are already loaded. Accepts 1-100 entity IDs.","operationId":"getDashboardLineageTopicsBatch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LineageTopicsBatchReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LineageTopicsBatchRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/dashboard/qa-counts":{"post":{"tags":["Dashboard"],"summary":"Get latest QA row counts for topics","description":"Returns per-topic source_count, destination_count, and shard_counts from the most recent metrics_qa collection. Accepts lineage topic names (e.g., source_XXX.demo.shard1.Orders) and matches against metrics_qa topic_ids.","operationId":"get_qa_counts_dashboard_qa_counts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QACountsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/destinations/search":{"post":{"tags":["Destinations"],"summary":"Search destinations (POST)","description":"POST alternative for GET /destinations. Use when URL length limits are exceeded (e.g., many filter values). Supports both query parameters and request body. Body parameters take precedence over query parameters.","operationId":"searchDestinations","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","description":"Number of results per page (max 100)","default":10,"title":"Page Size"},"description":"Number of results per page (max 100)"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, connector_status, recordsLag)","title":"Sort"},"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, connector_status, recordsLag)"},{"name":"sort_dir","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SortDirectionEnum","description":"Sort direction: 'asc' (ascending) or 'desc' (descending)","default":"asc"},"description":"Sort direction: 'asc' (ascending) or 'desc' (descending)"},{"name":"last_seen_offsets","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"object","additionalProperties":true},{"type":"null"}],"description":"Last seen offsets for topic messages pagination (cursor-based)","title":"Last Seen Offsets"},"description":"Last seen offsets for topic messages pagination (cursor-based)"},{"name":"first_seen_offsets","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"object","additionalProperties":true},{"type":"null"}],"description":"First seen offsets for topic messages pagination (cursor-based)","title":"First Seen Offsets"},"description":"First seen offsets for topic messages pagination (cursor-based)"},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partial Name"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by connector type. Comma-separated for multiple connectors (e.g., 'snowflake', 'snowflake,bigquery,clickhouse')","title":"Connector"},"description":"Filter by connector type. Comma-separated for multiple connectors (e.g., 'snowflake', 'snowflake,bigquery,clickhouse')"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by connector status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown","title":"Status"},"description":"Filter by connector status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown"},{"name":"lag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by consumer lag (records behind). Format: 'operator:value' (e.g., 'gt:100', 'lt:50'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Lag"},"description":"Filter by consumer lag (records behind). Format: 'operator:value' (e.g., 'gt:100', 'lt:50'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic.","title":"Tag Ids"},"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic."},{"name":"tag_filter_operation","in":"query","required":false,"schema":{"anyOf":[{"enum":["and","or"],"type":"string"},{"type":"null"}],"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags.","default":"or","title":"Tag Filter Operation"},"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DestinationsPaginatedReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationsPaginatedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations":{"get":{"tags":["Destinations"],"summary":"Get Destinations","operationId":"listDestinations","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","description":"Number of results per page (max 100)","default":10,"title":"Page Size"},"description":"Number of results per page (max 100)"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, connector_status, recordsLag)","title":"Sort"},"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, connector_status, recordsLag)"},{"name":"sort_dir","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SortDirectionEnum","description":"Sort direction: 'asc' (ascending) or 'desc' (descending)","default":"asc"},"description":"Sort direction: 'asc' (ascending) or 'desc' (descending)"},{"name":"last_seen_offsets","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"object","additionalProperties":true},{"type":"null"}],"description":"Last seen offsets for topic messages pagination (cursor-based)","title":"Last Seen Offsets"},"description":"Last seen offsets for topic messages pagination (cursor-based)"},{"name":"first_seen_offsets","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"object","additionalProperties":true},{"type":"null"}],"description":"First seen offsets for topic messages pagination (cursor-based)","title":"First Seen Offsets"},"description":"First seen offsets for topic messages pagination (cursor-based)"},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partial Name"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by connector type. Comma-separated for multiple connectors (e.g., 'snowflake', 'snowflake,bigquery,clickhouse')","title":"Connector"},"description":"Filter by connector type. Comma-separated for multiple connectors (e.g., 'snowflake', 'snowflake,bigquery,clickhouse')"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by connector status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown","title":"Status"},"description":"Filter by connector status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown"},{"name":"lag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by consumer lag (records behind). Format: 'operator:value' (e.g., 'gt:100', 'lt:50'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Lag"},"description":"Filter by consumer lag (records behind). Format: 'operator:value' (e.g., 'gt:100', 'lt:50'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic.","title":"Tag Ids"},"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic."},{"name":"tag_filter_operation","in":"query","required":false,"schema":{"anyOf":[{"enum":["and","or"],"type":"string"},{"type":"null"}],"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags.","default":"or","title":"Tag Filter Operation"},"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DestinationsPaginatedReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationsPaginatedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Destinations"],"summary":"Create New Destination","description":"spec: /specs/20_Destinations/spec.md#create-destination","operationId":"createDestination","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"secret_returned","in":"query","required":false,"schema":{"type":"boolean","description":"Whether to include secret values in the response","default":false,"title":"Secret Returned"},"description":"Whether to include secret values in the response"},{"name":"wait","in":"query","required":false,"schema":{"type":"boolean","description":"When False, save config and return immediately without waiting for KC deployment","default":true,"title":"Wait"},"description":"When False, save config and return immediately without waiting for KC deployment"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDestinationReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationConnector"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/brief":{"get":{"tags":["Destinations"],"summary":"List All Destinations Brief","operationId":"listDestinationsBrief","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BriefDestinationConnector"},"type":"array","title":"Response Listdestinationsbrief"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/destinations/connectors":{"get":{"tags":["Destinations"],"summary":"Get Destinations Connectors","description":"List available destination connector types and their configuration schemas.\n\nReturns connector definitions grouped by display name. Each connector includes a `config`\narray describing every configuration property - use properties where `user_defined` is `true`\nto build the `config` object for the **POST /destinations** and **PUT /destinations/{destination_id}** endpoints.\n\nPass `connector_code` (e.g., `snowflake`, `bigquery`, `clickhouse`) to retrieve the schema for a\nsingle connector type. Omit it to retrieve all available connectors.\n\nEach config property includes:\n- `name` - the dot-notation key to use in the `config` object\n- `description` - human-readable explanation\n- `required` - whether the property is mandatory\n- `display_name` - short label\n- `value.control` - input type (`string`, `password`, `one-select`, etc.)\n- `value.default` - default value, if any","operationId":"listDestinationConnectorTypes","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"connector_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by connector type identifier (e.g., 'snowflake', 'bigquery', 'clickhouse'). Omit to return all available connector types.","title":"Connector Code"},"description":"Filter by connector type identifier (e.g., 'snowflake', 'bigquery', 'clickhouse'). Omit to return all available connector types."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/{destination_id}/deploy":{"post":{"tags":["Destinations"],"summary":"Deploy Destination","description":"Deploy a PENDING destination, transitioning it to ACTIVE.","operationId":"deployDestination","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"type":"string","title":"Destination Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationConnector"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/{destination_id}/explain-error":{"post":{"tags":["Destinations"],"summary":"Explain Destination Error","description":"Explain a Broken destination's failure from its task trace, config, and optionally recent logs.","operationId":"explainDestinationError","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"type":"string","title":"Destination Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplainConnectorErrorRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/{destination_id}/metrics":{"get":{"tags":["Destinations"],"summary":"Get Metrics For Destination","description":"Retrieve metrics for a specific destination based on the provided parameters.\n\n    This endpoint returns metrics data for a given destination ID, allowing flexibility in the type of metrics\n    returned (timeseries, timesummary, or latest), the time interval, and the time range. The response includes\n    metadata about the metrics and is tailored to the specified time type.\n\n    ### Parameters:\n    - **destination_id** (path): The unique identifier of the destination for which metrics are requested.\n    - **time_type** (query): Specifies the type of metrics to return:\n        - `timeseries`: Metrics over a series of time intervals.\n        - `timesummary`: Aggregated summary of metrics over the specified period.\n        - `latest`: The most recent metrics available.\n    - **time_interval** (query): The numeric interval between metrics data points (e.g., 1, 2, etc.).\n    - **time_unit** (query): The unit of time for the interval (e.g., minute, hour, day, week, month).\n        Combined with `time_interval` to define the granularity (e.g., 1 hour, 2 days).\n    - **timestamp_from** (query, optional): The start time of the metrics data in UTC (ISO 8601 format, e.g.,\n        `2025-03-02T07:10:15Z`). Defaults to 24 hours before the current time if not provided.\n    - **timestamp_to** (query, optional): The end time of the metrics data in UTC (ISO 8601 format).\n        Defaults to the current time if not provided.\n\n    ### Authentication:\n    - Requires a valid user token with the `read:destination_metrics` permission.\n\n    ### Returns:\n    Depending on the `time_type`:\n    - `DestinationTimeseriesMetricsWithMetadata`: For `timeseries` metrics.\n    - `DestinationTimesummaryMetricsWithMetadata`: For `timesummary` metrics.\n    - `DestinationLatestMetricsWithMetadata`: For `latest` metrics.\n\n    ### Errors:\n    - **400 Bad Request**: Invalid parameters or unexpected errors during processing.\n    - **404 Not Found**: Metrics not found for the specified destination or connector plugin issues.\n    - **500 Internal Server Error**: Connector plugin not found or misconfigured.\n\n    ### Example Request:\n    ```http\n    https://api.streamkap.com/destinations/67ad6e0af08a2365c729ba79/metrics?time_type=latest&time_interval=2&time_unit=hour&timestamp_from=2025-03-02T07:10:15Z&timestamp_to=2025-03-04T07:10:15Z\n    ```\n    ### Example Response:\n    ```json\n    {\n        \"data\": {\n            \"connector_status\": \"Active\",\n            \"latency\": 0.0,\n            \"partitionCount\": 1.0,\n            \"putBatchMaxTimeMs\": 0.0,\n            \"recordsLag\": 0.0,\n            \"sinkRecordReadTotal\": 101.0,\n            \"recordsConsumedTotal\": null,\n            \"sinkRecordSendTotal\": 65.0,\n            \"bytesConsumedTotal\": null,\n        },\n        \"metadata\": {\n            \"connector_status\": {\n                \"name\": \"Destination State\",\n                \"unit\": \"enum\"\n            },\n            \"latency\": {\n                \"name\": \"Destination Latency\",\n                \"unit\": \"milliseconds\"\n            },\n            \"sinkRecordReadTotal\": {\n                \"name\": \"Events (Received)\",\n                \"unit\": \"count\"\n            },\n            \"sinkRecordSendTotal\": {\n                \"name\": \"Events (Sent)\",\n                \"unit\": \"count\"\n            },\n            \"partitionCount\": {\n                \"name\": \"Partition Count\",\n                \"unit\": \"count\"\n            },\n            \"putBatchMaxTimeMs\": {\n                \"name\": \"Put Batch Max Time\",\n                \"unit\": \"milliseconds\"\n            },\n            \"bytesConsumedTotal\": {\n                \"name\": \"Volume\",\n                \"unit\": \"bytes\"\n            },\n            \"recordsConsumedTotal\": {\n                \"name\": \"Consumed Events\",\n                \"unit\": \"count\"\n            },\n            \"recordsLag\": {\n                \"name\": \"Lag in Events\",\n                \"unit\": \"count\"\n            }\n        }\n    }\n    ```","operationId":"getDestinationMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"type":"string","title":"Destination Id"}},{"name":"time_type","in":"query","required":false,"schema":{"enum":["timeseries","timesummary","latest"],"type":"string","title":"Time Type","description":"Type of the metrics.","examples":["latest"],"default":"latest"},"description":"Type of the metrics."},{"name":"time_interval","in":"query","required":false,"schema":{"type":"integer","title":"Time Interval","description":"The interval between each metrics data point.","examples":[1],"default":1},"description":"The interval between each metrics data point."},{"name":"time_unit","in":"query","required":false,"schema":{"enum":["minute","hour","day","week","month"],"type":"string","title":"Time Unit","description":"The unit of the time interval. Combined with time_interval to determine the interval between each metrics data point. For example, if time_interval=1 and time_unit=hour, the interval between each metrics data point is 1 hour.","examples":["hour"],"default":"hour"},"description":"The unit of the time interval. Combined with time_interval to determine the interval between each metrics data point. For example, if time_interval=1 and time_unit=hour, the interval between each metrics data point is 1 hour."},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start time of the metrics data in UTC timezone. If not provided, start time is set to 24 hours before the current time.","examples":["2025-03-02T07:10:15Z"]},"description":"Start time of the metrics data in UTC timezone. If not provided, start time is set to 24 hours before the current time."},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time of the metrics data in UTC timezone. If not provided, end time is set to the current time.","examples":["2025-03-04T07:10:15Z"]},"description":"End time of the metrics data in UTC timezone. If not provided, end time is set to the current time."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DestinationTimeseriesMetricsWithMetadata"},{"$ref":"#/components/schemas/DestinationLatestMetricsWithMetadata"},{"$ref":"#/components/schemas/DestinationTimesummaryMetricsWithMetadata"}],"title":"Response Getdestinationmetrics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/metrics":{"post":{"tags":["Destinations"],"summary":"Get destination metrics (POST)","description":"POST alternative for GET /destinations/metrics. Use when URL length limits are exceeded (e.g., 100+ IDs). Supports both query parameters and request body. Body parameters take precedence over query parameters.","operationId":"searchDestinationsMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Entity identifier to fetch metrics for","title":"Id"},"description":"Entity identifier to fetch metrics for"},{"name":"topic_list_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Starting index for topic list pagination","title":"Topic List From"},"description":"Starting index for topic list pagination"},{"name":"topic_list_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of topics to return in the list","title":"Topic List Size"},"description":"Number of topics to return in the list"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"description":"Starting key for cursor-based pagination","title":"From"},"description":"Starting key for cursor-based pagination"},{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of results to return","title":"Size"},"description":"Number of results to return"},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')","title":"Level"},"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')"},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Page number for pagination","title":"Page"},"description":"Page number for pagination"},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')","title":"Timestamp To"},"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')"},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')","title":"Timestamp From"},"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')"},{"name":"time_unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')","title":"Time Unit"},"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')"},{"name":"time_interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Time interval value for aggregation","title":"Time Interval"},"description":"Time interval value for aggregation"},{"name":"time_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'","title":"Time Type"},"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'"},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of Tenant IDs","title":"Tenant Ids"},"description":"A comma-separated list of Tenant IDs"},{"name":"ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of destination IDs","title":"Ids"},"description":"A comma-separated list of destination IDs"},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snapshot status filter","title":"Snapshot"},"description":"Snapshot status filter"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field to sort results by","title":"Sort"},"description":"Field to sort results by"},{"name":"sort_dir","in":"query","required":false,"schema":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"description":"Sort direction: 'asc' or 'desc'","title":"Sort Dir"},"description":"Sort direction: 'asc' or 'desc'"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DestinationMetricsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationMetricsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Destinations"],"summary":"Get Metrics For Destinations","operationId":"listDestinationsMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Entity identifier to fetch metrics for","title":"Id"},"description":"Entity identifier to fetch metrics for"},{"name":"topic_list_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Starting index for topic list pagination","title":"Topic List From"},"description":"Starting index for topic list pagination"},{"name":"topic_list_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of topics to return in the list","title":"Topic List Size"},"description":"Number of topics to return in the list"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"description":"Starting key for cursor-based pagination","title":"From"},"description":"Starting key for cursor-based pagination"},{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of results to return","title":"Size"},"description":"Number of results to return"},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')","title":"Level"},"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')"},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Page number for pagination","title":"Page"},"description":"Page number for pagination"},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')","title":"Timestamp To"},"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')"},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')","title":"Timestamp From"},"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')"},{"name":"time_unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')","title":"Time Unit"},"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')"},{"name":"time_interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Time interval value for aggregation","title":"Time Interval"},"description":"Time interval value for aggregation"},{"name":"time_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'","title":"Time Type"},"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'"},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of Tenant IDs","title":"Tenant Ids"},"description":"A comma-separated list of Tenant IDs"},{"name":"ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of destination IDs","title":"Ids"},"description":"A comma-separated list of destination IDs"},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snapshot status filter","title":"Snapshot"},"description":"Snapshot status filter"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field to sort results by","title":"Sort"},"description":"Field to sort results by"},{"name":"sort_dir","in":"query","required":false,"schema":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"description":"Sort direction: 'asc' or 'desc'","title":"Sort Dir"},"description":"Sort direction: 'asc' or 'desc'"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DestinationMetricsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationMetricsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/configuration":{"get":{"tags":["Destinations"],"summary":"Get Destination Configuration","operationId":"getDestinationConfiguration","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"connector","in":"query","required":true,"schema":{"type":"string","title":"Connector"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/common_configurations":{"get":{"tags":["Destinations"],"summary":"Destination Configs","operationId":"listDestinationCommonConfigurations","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"mapping_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["config","metrics"],"type":"string"},{"type":"null"}],"title":"Mapping Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/sample_scripts":{"get":{"tags":["Destinations"],"summary":"Get Sample Scripts For Destinations","operationId":"listDestinationSampleScripts","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"query","required":true,"schema":{"type":"string","title":"Destination Id"}},{"name":"topic_ids","in":"query","required":false,"schema":{"type":"string","description":"A list of topic ids","default":"[]","title":"Topic Ids"},"description":"A list of topic ids"},{"name":"text","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Text"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/invite":{"post":{"tags":["Destinations"],"summary":"Destination Invite","operationId":"inviteDestinationCollaborator","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationInviteBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/destinations/bulk_update":{"put":{"tags":["Destinations"],"summary":"Update Bulk Destinations","description":"Update tags for multiple destinations in bulk.\n\nSupports two modes:\n1. Explicit IDs: Pass a list of destination IDs to update\n2. Select all: Set select_all=true with optional filters","operationId":"bulkUpdateDestinations","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateEntityReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/destinations/bulk/delete":{"delete":{"tags":["Destinations"],"summary":"Bulk Delete Destinations","description":"Delete multiple destinations in parallel.\nSupports two modes:\n1. Explicit IDs: Pass a list of destination IDs to delete\n2. Select all: Set select_all=true with optional filters to delete all matching destinations\n\nReturns partial success results - continues processing even if individual deletes fail.","operationId":"bulkDeleteDestinations","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/destinations/bulk/stop":{"put":{"tags":["Destinations"],"summary":"Bulk Stop Destinations","description":"Stop multiple destinations in parallel.\nSupports two modes:\n1. Explicit IDs: Pass a list of destination IDs\n2. Select all: Set select_all=true with optional filters\n\nReturns partial success results - continues processing even if individual stops fail.","operationId":"bulkStopDestinations","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/destinations/bulk/reset":{"post":{"tags":["Destinations"],"summary":"Bulk Reset Destinations","description":"Reset multiple destinations in parallel (stops, deletes offsets, resumes).\nSupports two modes:\n1. Explicit IDs: Pass a list of destination IDs\n2. Select all: Set select_all=true with optional filters\n\nReturns partial success results - continues processing even if individual resets fail.","operationId":"bulkResetDestinations","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/destinations/bulk/resume":{"put":{"tags":["Destinations"],"summary":"Bulk Resume Destinations","description":"Resume multiple destinations in parallel.\nSupports two modes:\n1. Explicit IDs: Pass a list of destination IDs\n2. Select all: Set select_all=true with optional filters\n\nReturns partial success results - continues processing even if individual resumes fail.","operationId":"bulkResumeDestinations","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/destinations/{destination_id}/resume":{"put":{"tags":["Destinations"],"summary":"Resume Existing Destination","operationId":"resumeDestination","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/{destination_id}/pause":{"put":{"tags":["Destinations"],"summary":"Pause Existing Destination","operationId":"pauseDestination","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/{destination_id}/stop":{"put":{"tags":["Destinations"],"summary":"Stop Existing Destination","operationId":"stopDestination","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/{destination_id}/restart":{"post":{"tags":["Destinations"],"summary":"Restart Existing Destination","operationId":"restartDestination","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/{destination_id}/reset":{"post":{"tags":["Destinations"],"summary":"Reset Existing Destination","description":"Reset a destination connector by stopping it, deleting offsets, and resuming it.\nThis will treat the connector as brand new and start consuming from the beginning.","operationId":"resetDestination","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/{destination_id}/restart_task":{"post":{"tags":["Destinations"],"summary":"Restart Destination Task Api","operationId":"restartDestinationTask","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/{destination_id}":{"get":{"tags":["Destinations"],"summary":"Get Destination","description":"spec: /specs/20_Destinations/spec.md#verify-running","operationId":"getDestination","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"type":"string","title":"Destination Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationsPaginatedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Destinations"],"summary":"Update Existing Destination","description":"Update an existing destination connector.\n\nThe `config` object contains connector-specific properties using **dot notation**.\n\nUse the **GET /destinations/connectors** endpoint with a `connector_code` query parameter to\nretrieve the full configuration schema for a specific connector type.","operationId":"updateDestination","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}},{"name":"secret_returned","in":"query","required":false,"schema":{"type":"boolean","description":"Whether to include secret values in the response","default":false,"title":"Secret Returned"},"description":"Whether to include secret values in the response"},{"name":"wait","in":"query","required":false,"schema":{"type":"boolean","description":"When False, save config and return immediately without waiting for KC update","default":true,"title":"Wait"},"description":"When False, save config and return immediately without waiting for KC update"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDestinationReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DestinationConnector"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Destinations"],"summary":"Delete Existing Destination","operationId":"deleteDestination","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}},{"name":"wait","in":"query","required":false,"schema":{"type":"boolean","description":"When False, mark for deletion and return immediately without waiting for KC teardown","default":true,"title":"Wait"},"description":"When False, mark for deletion and return immediately without waiting for KC teardown"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/{destination_id}/config-history":{"get":{"tags":["Destinations"],"summary":"Get Destination Config History","description":"Retrieve configuration change history for a destination with AI-generated summaries.","operationId":"getDestinationConfigHistory","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"type":"string","title":"Destination Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Items per page","default":50,"title":"Page Size"},"description":"Items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KCConfigChangeHistoryRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/destinations/{destination_id}/config-history/compare-to-original":{"get":{"tags":["Destinations"],"summary":"Get Destination Config Comparison","description":"Compare a destination's current config against its original recorded config (secret-masked diff).","operationId":"getDestinationConfigComparison","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"destination_id","in":"path","required":true,"schema":{"type":"string","title":"Destination Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KCConfigChangeComparisonRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/search":{"post":{"tags":["Sources"],"summary":"Search sources (POST)","description":"POST alternative for GET /sources. Use when URL length limits are exceeded (e.g., many filter values). Supports both query parameters and request body. Body parameters take precedence over query parameters.","operationId":"searchSources","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","description":"Number of results per page (max 100)","default":10,"title":"Page Size"},"description":"Number of results per page (max 100)"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, connector_status, recordsLag)","title":"Sort"},"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, connector_status, recordsLag)"},{"name":"sort_dir","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SortDirectionEnum","description":"Sort direction: 'asc' (ascending) or 'desc' (descending)","default":"asc"},"description":"Sort direction: 'asc' (ascending) or 'desc' (descending)"},{"name":"last_seen_offsets","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"object","additionalProperties":true},{"type":"null"}],"description":"Last seen offsets for topic messages pagination (cursor-based)","title":"Last Seen Offsets"},"description":"Last seen offsets for topic messages pagination (cursor-based)"},{"name":"first_seen_offsets","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"object","additionalProperties":true},{"type":"null"}],"description":"First seen offsets for topic messages pagination (cursor-based)","title":"First Seen Offsets"},"description":"First seen offsets for topic messages pagination (cursor-based)"},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partial Name"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by connector type. Comma-separated for multiple connectors (e.g., 'postgresql', 'postgresql,mysql,mongodb')","title":"Connector"},"description":"Filter by connector type. Comma-separated for multiple connectors (e.g., 'postgresql', 'postgresql,mysql,mongodb')"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by connector status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown","title":"Status"},"description":"Filter by connector status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown"},{"name":"latency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500', 'gte:100'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Latency"},"description":"Filter by latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500', 'gte:100'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by snapshot status. Comma-separated for multiple statuses (e.g., 'running', 'completed,failed'). Valid statuses: running, completed, failed, pending, cancelled","title":"Snapshot"},"description":"Filter by snapshot status. Comma-separated for multiple statuses (e.g., 'running', 'completed,failed'). Valid statuses: running, completed, failed, pending, cancelled"},{"name":"eta","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by snapshot ETA in milliseconds. Format: 'operator:value' (e.g., 'gt:60000', 'lte:300000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=). Sources without ETA (null/0) are excluded when filtering.","title":"Eta"},"description":"Filter by snapshot ETA in milliseconds. Format: 'operator:value' (e.g., 'gt:60000', 'lte:300000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=). Sources without ETA (null/0) are excluded when filtering."},{"name":"stale","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by staleness. true = only sources with no data in 24h, false = only active sources.","title":"Stale"},"description":"Filter by staleness. true = only sources with no data in 24h, false = only active sources."},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic.","title":"Tag Ids"},"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic."},{"name":"tag_filter_operation","in":"query","required":false,"schema":{"anyOf":[{"enum":["and","or"],"type":"string"},{"type":"null"}],"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags.","default":"or","title":"Tag Filter Operation"},"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SourcesPaginatedReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcesPaginatedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources":{"get":{"tags":["Sources"],"summary":"Get Sources","operationId":"listSources","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","description":"Number of results per page (max 100)","default":10,"title":"Page Size"},"description":"Number of results per page (max 100)"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, connector_status, recordsLag)","title":"Sort"},"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, connector_status, recordsLag)"},{"name":"sort_dir","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SortDirectionEnum","description":"Sort direction: 'asc' (ascending) or 'desc' (descending)","default":"asc"},"description":"Sort direction: 'asc' (ascending) or 'desc' (descending)"},{"name":"last_seen_offsets","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"object","additionalProperties":true},{"type":"null"}],"description":"Last seen offsets for topic messages pagination (cursor-based)","title":"Last Seen Offsets"},"description":"Last seen offsets for topic messages pagination (cursor-based)"},{"name":"first_seen_offsets","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"object","additionalProperties":true},{"type":"null"}],"description":"First seen offsets for topic messages pagination (cursor-based)","title":"First Seen Offsets"},"description":"First seen offsets for topic messages pagination (cursor-based)"},{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partial Name"}},{"name":"connector","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by connector type. Comma-separated for multiple connectors (e.g., 'postgresql', 'postgresql,mysql,mongodb')","title":"Connector"},"description":"Filter by connector type. Comma-separated for multiple connectors (e.g., 'postgresql', 'postgresql,mysql,mongodb')"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by connector status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown","title":"Status"},"description":"Filter by connector status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown"},{"name":"latency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500', 'gte:100'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Latency"},"description":"Filter by latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500', 'gte:100'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by snapshot status. Comma-separated for multiple statuses (e.g., 'running', 'completed,failed'). Valid statuses: running, completed, failed, pending, cancelled","title":"Snapshot"},"description":"Filter by snapshot status. Comma-separated for multiple statuses (e.g., 'running', 'completed,failed'). Valid statuses: running, completed, failed, pending, cancelled"},{"name":"eta","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by snapshot ETA in milliseconds. Format: 'operator:value' (e.g., 'gt:60000', 'lte:300000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=). Sources without ETA (null/0) are excluded when filtering.","title":"Eta"},"description":"Filter by snapshot ETA in milliseconds. Format: 'operator:value' (e.g., 'gt:60000', 'lte:300000'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=). Sources without ETA (null/0) are excluded when filtering."},{"name":"stale","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by staleness. true = only sources with no data in 24h, false = only active sources.","title":"Stale"},"description":"Filter by staleness. true = only sources with no data in 24h, false = only active sources."},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic.","title":"Tag Ids"},"description":"Filter by tag IDs. Comma-separated list (e.g., 'tag1,tag2'). Use with tag_filter_operation to control AND/OR logic."},{"name":"tag_filter_operation","in":"query","required":false,"schema":{"anyOf":[{"enum":["and","or"],"type":"string"},{"type":"null"}],"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags.","default":"or","title":"Tag Filter Operation"},"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SourcesPaginatedReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcesPaginatedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Sources"],"summary":"Create New Source","description":"Create a new source connector.\n\nThe `config` object contains connector-specific properties using **dot notation**\n(e.g., `table.include.list`, `schema.include.list`, `database.hostname`).\n\nUse the **GET /sources/connectors** endpoint with a `connector_code` query parameter to\nretrieve the full configuration schema for a specific connector type.","operationId":"createSource","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"secret_returned","in":"query","required":false,"schema":{"type":"boolean","description":"Whether to include secret values in the response","default":false,"title":"Secret Returned"},"description":"Whether to include secret values in the response"},{"name":"wait","in":"query","required":false,"schema":{"type":"boolean","description":"When False, save config and return immediately without waiting for KC deployment","default":true,"title":"Wait"},"description":"When False, save config and return immediately without waiting for KC deployment"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSourceReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceConnector"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/brief":{"get":{"tags":["Sources"],"summary":"List All Sources Brief","operationId":"listSourcesBrief","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BriefSourceConnector"},"type":"array","title":"Response Listsourcesbrief"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/connectors":{"get":{"tags":["Sources"],"summary":"Get Sources Connectors","description":"List available source connector types and their configuration schemas.\n\nReturns connector definitions grouped by display name. Each connector includes a `config`\narray describing every configuration property - use properties where `user_defined` is `true`\nto build the `config` object for the **POST /sources** and **PUT /sources/{source_id}** endpoints.\n\nPass `connector_code` (e.g., `postgresql`, `mysql`, `mongodb`) to retrieve the schema for a\nsingle connector type. Omit it to retrieve all available connectors.\n\nEach config property includes:\n- `name` - the dot-notation key to use in the `config` object (e.g., `database.hostname.user.defined`)\n- `description` - human-readable explanation\n- `required` - whether the property is mandatory\n- `display_name` - short label\n- `value.control` - input type (`string`, `password`, `one-select`, etc.)\n- `value.default` - default value, if any","operationId":"listSourceConnectorTypes","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"connector_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by connector type identifier (e.g., 'postgresql', 'mysql', 'mongodb'). Omit to return all available connector types.","title":"Connector Code"},"description":"Filter by connector type identifier (e.g., 'postgresql', 'mysql', 'mongodb'). Omit to return all available connector types."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}/deploy":{"post":{"tags":["Sources"],"summary":"Deploy Source","description":"Deploy a PENDING source, transitioning it to ACTIVE.","operationId":"deploySource","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceConnector"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}/explain-error":{"post":{"tags":["Sources"],"summary":"Explain Source Error","description":"Explain a Broken source's failure from its task trace, config, and optionally recent logs.","operationId":"explainSourceError","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExplainConnectorErrorRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}/metrics":{"get":{"tags":["Sources"],"summary":"Get Metrics For Source","description":"Retrieve metrics for a specific source based on the provided parameters.\n\n    This endpoint returns metrics data for a given source ID, allowing flexibility in the type of metrics\n    returned (timeseries, timesummary, or latest), the time interval, and the time range. The response includes\n    metadata about the metrics and is tailored to the specified time type.\n\n    ### Parameters:\n    - **source_id** (path): The unique identifier of the source for which metrics are requested.\n    - **time_type** (query): Specifies the type of metrics to return:\n        - `timeseries`: Metrics over a series of time intervals.\n        - `timesummary`: Aggregated summary of metrics over the specified period.\n        - `latest`: The most recent metrics available.\n    - **time_interval** (query): The numeric interval between metrics data points (e.g., 1, 2, etc.).\n    - **time_unit** (query): The unit of time for the interval (e.g., minute, hour, day, week, month).\n        Combined with `time_interval` to define the granularity (e.g., 1 hour, 2 days).\n    - **timestamp_from** (query, optional): The start time of the metrics data in UTC (ISO 8601 format, e.g.,\n        `2025-03-02T07:10:15Z`). Defaults to 24 hours before the current time if not provided.\n    - **timestamp_to** (query, optional): The end time of the metrics data in UTC (ISO 8601 format).\n        Defaults to the current time if not provided.\n\n    ### Authentication:\n    - Requires a valid user token with the `read:source_metrics` permission.\n\n    ### Returns:\n    Depending on the `time_type`:\n    - `SourceTimeseriesMetricsWithMetadata`: For `timeseries` metrics.\n    - `SourceTimesummaryMetricsWithMetadata`: For `timesummary` metrics.\n    - `SourceLatestMetricsWithMetadata`: For `latest` metrics.\n\n    ### Errors:\n    - **400 Bad Request**: Invalid parameters or unexpected errors during processing.\n    - **404 Not Found**: Metrics not found for the specified source or connector plugin issues.\n    - **500 Internal Server Error**: Connector plugin not found or misconfigured.\n\n    ### Example Request:\n    ```http\n    https://api.streamkap.com/sources/67ad6e0af08a2365c729ba79/metrics?time_type=latest&time_interval=2&time_unit=hour&timestamp_from=2025-03-02T07:10:15Z&timestamp_to=2025-03-04T07:10:15Z\n    ```\n    ### Example Response:\n    ```json\n    {\n        \"data\": {\n            \"SnapshotTotalNumberOfEventsSeen\": 20254,\n            \"SnapshotMilliSecondsSinceLastEvent\": 0,\n            \"StreamingMilliSecondsBehindSource\": 0,\n            \"StreamingTotalNumberOfDeleteEventsSeen\": 312,\n            \"StreamingTotalNumberOfUpdateEventsSeen\": 0,\n            \"StreamingTotalNumberOfCreateEventsSeen\": 73,\n            \"StreamingMilliSecondsSinceLastEvent\": 0,\n            \"StreamingLastEvent\": \"position: {ord: 14}, key: {\"id\" : \"\"ceaafb88-2a60-4bd9-8515-719ba64ea05c-close\"\"}\",\n            \"recordRetryTotal\": null,\n            \"byteTotal\": 9018776,\n            \"sourceRecordWriteTotal\": 28977,\n            \"SnapshotRunning\": 0,\n            \"SnapshotCompleted\": 0,\n            \"StreamingConnected\": 1,\n            \"recordSendTotal\": null,\n            \"state\": \"Streaming\",\n            \"streamingState\": \"connected\",\n            \"snapshotStatus\": [\n                {\n                    \"status\": \"completed\",\n                    \"topic_id\": \"source_67a5c35e64af6fd83f4c17a6.Test.test_data1\",\n                    \"submit_timestamp\": null\n                },\n                {\n                    \"status\": \"completed\",\n                    \"topic_id\": \"source_67a5c35e64af6fd83f4c17a6.Test.test_data2\",\n                    \"submit_timestamp\": null\n                }\n            ],\n            \"snapshotState\": \"completed\",\n            \"recordWrittenTotal\": null,\n            \"connector_status\": \"Active\",\n            \"latency\": 0\n        },\n        \"metadata\": {\n            \"state\": {\n                \"name\": \"Enabled State\",\n                \"unit\": \"enum\"\n            },\n            \"streamingState\": {\n                \"name\": \"Streaming State\",\n                \"unit\": \"enum\"\n            },\n            \"snapshotStatus\": {\n                \"name\": \"Snapshot Status\",\n                \"unit\": \"enum\"\n            },\n            \"snapshotState\": {\n                \"name\": \"Snapshot State\",\n                \"unit\": \"enum\"\n            },\n            \"connector_status\": {\n                \"name\": \"Source State\",\n                \"unit\": \"enum\"\n            },\n            \"latency\": {\n                \"name\": \"Source Latency\",\n                \"unit\": \"milliseconds\"\n            },\n            \"byteTotal\": {\n                \"name\": \"Volume\",\n                \"unit\": \"bytes\"\n            },\n            \"recordRetryTotal\": {\n                \"name\": \"Retried\",\n                \"unit\": \"count\"\n            },\n            \"recordSendTotal\": {\n                \"name\": \"Received\",\n                \"unit\": \"count\"\n            },\n            \"recordWrittenTotal\": {\n                \"name\": \"Events Written\",\n                \"unit\": \"count\"\n            },\n            \"SnapshotTotalNumberOfEventsSeen\": {\n                \"name\": \"Events (Snapshot)\",\n                \"unit\": \"count\"\n            },\n            \"SnapshotRunning\": {\n                \"name\": \"Snapshot Running?\",\n                \"unit\": \"boolean\"\n            },\n            \"SnapshotCompleted\": {\n                \"name\": \"Snapshot Completed?\",\n                \"unit\": \"boolean\"\n            },\n            \"SnapshotMilliSecondsSinceLastEvent\": {\n                \"name\": \"Time Since Last Snapshot Event\",\n                \"unit\": \"milliseconds\"\n            },\n            \"StreamingMilliSecondsBehindSource\": {\n                \"name\": \"Latency Behind Source\",\n                \"unit\": \"milliseconds\"\n            },\n            \"StreamingConnected\": {\n                \"name\": \"Streaming Connected?\",\n                \"unit\": \"boolean\"\n            },\n            \"StreamingTotalNumberOfDeleteEventsSeen\": {\n                \"name\": \"Events (Delete)\",\n                \"unit\": \"count\"\n            },\n            \"StreamingTotalNumberOfUpdateEventsSeen\": {\n                \"name\": \"Events (Update)\",\n                \"unit\": \"count\"\n            },\n            \"StreamingTotalNumberOfCreateEventsSeen\": {\n                \"name\": \"Events (Create)\",\n                \"unit\": \"count\"\n            },\n            \"StreamingMilliSecondsSinceLastEvent\": {\n                \"name\": \"Time Since Last Streaming Event\",\n                \"unit\": \"milliseconds\"\n            },\n            \"StreamingLastEvent\": {\n                \"name\": \"Last Streaming Event\",\n                \"unit\": \"id\"\n            },\n            \"sourceRecordWriteTotal\": {\n                \"name\": \"Events Written\",\n                \"unit\": \"count\"\n            }\n        }\n    }\n    ```","operationId":"getSourceMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}},{"name":"time_type","in":"query","required":false,"schema":{"enum":["timeseries","timesummary","latest"],"type":"string","title":"Time Type","description":"Type of the metrics.","examples":["latest"],"default":"latest"},"description":"Type of the metrics."},{"name":"time_interval","in":"query","required":false,"schema":{"type":"integer","title":"Time Interval","description":"The interval between each metrics data point.","examples":[1],"default":1},"description":"The interval between each metrics data point."},{"name":"time_unit","in":"query","required":false,"schema":{"enum":["minute","hour","day","week","month"],"type":"string","title":"Time Unit","description":"The unit of the time interval. Combined with time_interval to determine the interval between each metrics data point. For example, if time_interval=1 and time_unit=hour, the interval between each metrics data point is 1 hour.","examples":["hour"],"default":"hour"},"description":"The unit of the time interval. Combined with time_interval to determine the interval between each metrics data point. For example, if time_interval=1 and time_unit=hour, the interval between each metrics data point is 1 hour."},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start time of the metrics data in UTC timezone. If not provided, start time is set to 24 hours before the current time.","examples":["2025-03-02T07:10:15Z"]},"description":"Start time of the metrics data in UTC timezone. If not provided, start time is set to 24 hours before the current time."},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time of the metrics data in UTC timezone. If not provided, end time is set to the current time.","examples":["2025-03-04T07:10:15Z"]},"description":"End time of the metrics data in UTC timezone. If not provided, end time is set to the current time."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SourceTimeseriesMetricsWithMetadata"},{"$ref":"#/components/schemas/SourceLatestMetricsWithMetadata"},{"$ref":"#/components/schemas/SourceTimesummaryMetricsWithMetadata"}],"title":"Response Getsourcemetrics"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/metrics":{"post":{"tags":["Sources"],"summary":"Get source metrics (POST)","description":"POST alternative for GET /sources/metrics. Use when URL length limits are exceeded (e.g., 100+ IDs). Supports both query parameters and request body. Body parameters take precedence over query parameters.","operationId":"searchSourcesMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Entity identifier to fetch metrics for","title":"Id"},"description":"Entity identifier to fetch metrics for"},{"name":"topic_list_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Starting index for topic list pagination","title":"Topic List From"},"description":"Starting index for topic list pagination"},{"name":"topic_list_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of topics to return in the list","title":"Topic List Size"},"description":"Number of topics to return in the list"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"description":"Starting key for cursor-based pagination","title":"From"},"description":"Starting key for cursor-based pagination"},{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of results to return","title":"Size"},"description":"Number of results to return"},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')","title":"Level"},"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')"},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Page number for pagination","title":"Page"},"description":"Page number for pagination"},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')","title":"Timestamp To"},"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')"},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')","title":"Timestamp From"},"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')"},{"name":"time_unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')","title":"Time Unit"},"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')"},{"name":"time_interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Time interval value for aggregation","title":"Time Interval"},"description":"Time interval value for aggregation"},{"name":"time_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'","title":"Time Type"},"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'"},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of Tenant IDs","title":"Tenant Ids"},"description":"A comma-separated list of Tenant IDs"},{"name":"ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of source IDs","title":"Ids"},"description":"A comma-separated list of source IDs"},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snapshot status filter","title":"Snapshot"},"description":"Snapshot status filter"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field to sort results by","title":"Sort"},"description":"Field to sort results by"},{"name":"sort_dir","in":"query","required":false,"schema":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"description":"Sort direction: 'asc' or 'desc'","title":"Sort Dir"},"description":"Sort direction: 'asc' or 'desc'"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SourceMetricsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceMetricsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Sources"],"summary":"Get Metrics For Sources","operationId":"listSourcesMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Entity identifier to fetch metrics for","title":"Id"},"description":"Entity identifier to fetch metrics for"},{"name":"topic_list_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Starting index for topic list pagination","title":"Topic List From"},"description":"Starting index for topic list pagination"},{"name":"topic_list_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of topics to return in the list","title":"Topic List Size"},"description":"Number of topics to return in the list"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"description":"Starting key for cursor-based pagination","title":"From"},"description":"Starting key for cursor-based pagination"},{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of results to return","title":"Size"},"description":"Number of results to return"},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')","title":"Level"},"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')"},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Page number for pagination","title":"Page"},"description":"Page number for pagination"},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')","title":"Timestamp To"},"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')"},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')","title":"Timestamp From"},"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')"},{"name":"time_unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')","title":"Time Unit"},"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')"},{"name":"time_interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Time interval value for aggregation","title":"Time Interval"},"description":"Time interval value for aggregation"},{"name":"time_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'","title":"Time Type"},"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'"},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of Tenant IDs","title":"Tenant Ids"},"description":"A comma-separated list of Tenant IDs"},{"name":"ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of source IDs","title":"Ids"},"description":"A comma-separated list of source IDs"},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snapshot status filter","title":"Snapshot"},"description":"Snapshot status filter"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field to sort results by","title":"Sort"},"description":"Field to sort results by"},{"name":"sort_dir","in":"query","required":false,"schema":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"description":"Sort direction: 'asc' or 'desc'","title":"Sort Dir"},"description":"Sort direction: 'asc' or 'desc'"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SourceMetricsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceMetricsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/configuration":{"get":{"tags":["Sources"],"summary":"Get Source Configuration","operationId":"getSourceConfiguration","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"connector","in":"query","required":true,"schema":{"type":"string","title":"Connector"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/common_configurations":{"get":{"tags":["Sources"],"summary":"Source Configs","operationId":"listSourceCommonConfigurations","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"mapping_type","in":"query","required":false,"schema":{"anyOf":[{"enum":["config","metrics"],"type":"string"},{"type":"null"}],"title":"Mapping Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/invite":{"post":{"tags":["Sources"],"summary":"Source Invite","operationId":"inviteSourceCollaborator","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceInviteBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/execute_incremental_snapshot":{"post":{"tags":["Sources"],"summary":"Execute Incremental Snapshot","operationId":"executeIncrementalSnapshot","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteSnapshotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/execute_blocking_snapshot":{"post":{"tags":["Sources"],"summary":"Execute Blocking Snapshot","description":"Execute a blocking snapshot for the specified source.\n\nBlocking snapshots pause streaming during the snapshot operation and use\nDebezium's initial snapshot process. They are useful for:\n- Snapshotting keyless tables (which incremental snapshots cannot handle)\n- Snapshotting large tables faster than incremental snapshots\n\nWarning: Streaming will be paused during the snapshot operation.\nNote: additional_conditions filters are not supported for blocking snapshots.","operationId":"executeBlockingSnapshot","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteBlockingSnapshotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/execute_parallel_snapshot":{"post":{"tags":["Sources"],"summary":"Execute Parallel Snapshot","operationId":"executeParallelSnapshot","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteSnapshotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/stop_incremental_snapshot":{"post":{"tags":["Sources"],"summary":"Stop Incremental Snapshot","operationId":"stopIncrementalSnapshot","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteSnapshotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/stop_blocking_snapshot":{"post":{"tags":["Sources"],"summary":"Stop Blocking Snapshot","description":"Stop a blocking snapshot for the specified source.\n\nThis endpoint stops an in-progress blocking snapshot by restarting the connector.\nThe snapshot will be marked as cancelled and streaming will resume.","operationId":"stopBlockingSnapshot","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteBlockingSnapshotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/snapshot":{"post":{"tags":["Sources"],"summary":"Execute Snapshot","description":"Execute a snapshot for the specified source with configurable snapshot type.\n\nThis unified endpoint supports both incremental and blocking snapshots:\n\n- **incremental** (default): Uses watermarking to capture data in chunks while streaming\n  continues. Supports additional_conditions for filtered snapshots. Requires primary keys.\n\n- **blocking**: Pauses streaming during the snapshot operation. Required for keyless\n  tables. Faster for large tables but blocks streaming until complete.\n  Note: additional_conditions filters are not supported for blocking snapshots.\n\nFor stopping/cancelling snapshots, use the cancel_snapshot endpoint which auto-detects\nthe running snapshot type and uses the appropriate cancellation method.","operationId":"executeSnapshot","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnifiedSnapshotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/cancel_snapshot":{"post":{"tags":["Sources"],"summary":"Cancel Snapshot","description":"Cancel an in-progress snapshot with automatic type detection.\n\nThis endpoint automatically detects the type of snapshot currently running\nand uses the appropriate cancellation method:\n\n- **Incremental/Filtered snapshots**: Streaming continues.\n  Progress is preserved and can be resumed later.\n\n- **Blocking snapshots**: Streaming resumes after cancellation.\n  Partial progress is lost - must re-trigger if needed.\n\nReturns 404 if no snapshot is currently running for the specified source.","operationId":"cancelSnapshot","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteSnapshotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/bulk_update":{"put":{"tags":["Sources"],"summary":"Update Bulk Sources","description":"Update tags for multiple sources in bulk.\n\nSupports two modes:\n1. Explicit IDs: Pass a list of source IDs to update\n2. Select all: Set select_all=true with optional filters","operationId":"bulkUpdateSources","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateEntityReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/bulk/delete":{"delete":{"tags":["Sources"],"summary":"Bulk Delete Sources","description":"Delete multiple sources in parallel.\nSupports two modes:\n1. Explicit IDs: Pass a list of source IDs to delete\n2. Select all: Set select_all=true with optional filters to delete all matching sources\n\nReturns partial success results - continues processing even if individual deletes fail.","operationId":"bulkDeleteSources","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/bulk/snapshot":{"post":{"tags":["Sources"],"summary":"Bulk Execute Snapshot Sources","description":"Execute snapshot on multiple sources in parallel.\n\nSupports both incremental (default) and blocking snapshot types via the\nsnapshot_type field:\n\n- **incremental**: Uses watermarking to capture data while streaming continues.\n- **blocking**: Pauses streaming during snapshot. Required for keyless tables.\n  Executed with lower concurrency and staggered timing to avoid overwhelming\n  Kafka Connect.\n\nSupports two modes for source selection:\n1. Explicit IDs: Pass a list of source IDs\n2. Select all: Set select_all=true with optional filters\n\nReturns partial success results - continues processing even if individual snapshots fail\n(e.g. 409 when a snapshot is already running for a source).","operationId":"bulkSnapshotSources","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSnapshotReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/bulk/parallel-snapshot":{"post":{"tags":["Sources"],"summary":"Bulk Parallel Snapshot Sources","description":"spec: /specs/40_Snapshots/spec.md#bulk-parallel-snapshots\n\nExecute Fast Parallel (parallel-chunk) snapshot on multiple sources.\n\nMirrors the per-source ``POST /sources/execute_parallel_snapshot`` semantics\nfanned out across all targeted sources: seeds user intent into\n``Mongo.sources.snapshotting_tables``; the in-process orchestrator picks up\non its next cycle. No KC signal-table writes, no row/table locks.\n\nSupports two modes for source selection:\n1. Explicit IDs: Pass a list of source IDs\n2. Select all: Set select_all=true with optional filters\n\nReturns partial-success results — continues even when individual sources\nfail (e.g. regex source with no ``table.include.list``).","operationId":"bulkParallelSnapshotSources","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/bulk/stop-snapshot":{"post":{"tags":["Sources"],"summary":"Bulk Stop Snapshot Sources","description":"Stop snapshot on multiple sources in parallel.\n\nAutomatically detects the running snapshot type (incremental or blocking)\nand uses the appropriate cancellation method:\n- Incremental: Cancels via signal table, streaming continues\n- Blocking: Restarts the connector, streaming resumes after restart\n\nUses lower concurrency to avoid overwhelming Kafka Connect.\n\nSupports two modes for source selection:\n1. Explicit IDs: Pass a list of source IDs\n2. Select all: Set select_all=true with optional filters\n\nReturns partial success results - continues processing even if individual stop operations fail.","operationId":"bulkStopSnapshotSources","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/bulk/stop":{"put":{"tags":["Sources"],"summary":"Bulk Stop Sources","description":"Stop multiple sources in parallel.\nSupports two modes:\n1. Explicit IDs: Pass a list of source IDs\n2. Select all: Set select_all=true with optional filters\n\nReturns partial success results - continues processing even if individual stops fail.","operationId":"bulkStopSources","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/bulk/reset":{"post":{"tags":["Sources"],"summary":"Bulk Reset Sources","description":"Reset multiple sources in parallel (stops, deletes offsets, resumes).\nSupports two modes:\n1. Explicit IDs: Pass a list of source IDs\n2. Select all: Set select_all=true with optional filters\n\nReturns partial success results - continues processing even if individual resets fail.","operationId":"bulkResetSources","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/bulk/resume":{"put":{"tags":["Sources"],"summary":"Bulk Resume Sources","description":"Resume multiple sources in parallel.\nSupports two modes:\n1. Explicit IDs: Pass a list of source IDs\n2. Select all: Set select_all=true with optional filters\n\nReturns partial success results - continues processing even if individual resumes fail.","operationId":"bulkResumeSources","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkActionReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/sources/{source_id}/pause":{"put":{"tags":["Sources"],"summary":"Pause Existing Source","operationId":"pauseSource","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}/resume":{"put":{"tags":["Sources"],"summary":"Resume Existing Source","operationId":"resumeSource","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}/stop":{"put":{"tags":["Sources"],"summary":"Stop Existing Source","operationId":"stopSource","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}/restart":{"post":{"tags":["Sources"],"summary":"Restart Existing Source","operationId":"restartSource","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}/reset":{"post":{"tags":["Sources"],"summary":"Reset Existing Source","description":"Reset a source connector by stopping it, deleting offsets, and resuming it.\nThis will treat the connector as brand new and perform an initial snapshot.","operationId":"resetSource","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}/restart_task":{"post":{"tags":["Sources"],"summary":"Restart Source Task Api","operationId":"restartSourceTask","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}":{"get":{"tags":["Sources"],"summary":"Get Source","operationId":"getSource","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourcesPaginatedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Sources"],"summary":"Update Existing Source","description":"Update an existing source connector.\n\nThe `config` object contains connector-specific properties using **dot notation**\n(e.g., `table.include.list`, `schema.include.list`, `database.hostname`).\nTo add tables, include the full `table.include.list` value with the new tables appended.\n\nUse the **GET /sources/connectors** endpoint with a `connector_code` query parameter to\nretrieve the full configuration schema for a specific connector type.","operationId":"updateSource","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}},{"name":"secret_returned","in":"query","required":false,"schema":{"type":"boolean","description":"Whether to include secret values in the response","default":false,"title":"Secret Returned"},"description":"Whether to include secret values in the response"},{"name":"wait","in":"query","required":false,"schema":{"type":"boolean","description":"When False, save config and return immediately without waiting for KC update","default":true,"title":"Wait"},"description":"When False, save config and return immediately without waiting for KC update"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSourceReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SourceConnector"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Sources"],"summary":"Delete Existing Source","operationId":"deleteSource","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}},{"name":"wait","in":"query","required":false,"schema":{"type":"boolean","description":"When False, mark for deletion and return immediately without waiting for KC teardown","default":true,"title":"Wait"},"description":"When False, mark for deletion and return immediately without waiting for KC teardown"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}/config-history":{"get":{"tags":["Sources"],"summary":"Get Source Config History","description":"Retrieve configuration change history for a source with AI-generated summaries.","operationId":"getSourceConfigHistory","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Items per page","default":50,"title":"Page Size"},"description":"Items per page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KCConfigChangeHistoryRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/sources/{source_id}/config-history/compare-to-original":{"get":{"tags":["Sources"],"summary":"Get Source Config Comparison","description":"Compare a source's current config against its original recorded config (secret-masked diff).","operationId":"getSourceConfigComparison","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"source_id","in":"path","required":true,"schema":{"type":"string","title":"Source Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KCConfigChangeComparisonRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/search":{"post":{"tags":["Pipelines"],"summary":"Search pipelines (POST)","description":"POST alternative for GET /pipelines. Use when URL length limits are exceeded (e.g., many filter values). Supports both query parameters and request body. Body parameters take precedence over query parameters.","operationId":"searchPipelines","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partial Name"}},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag Ids"}},{"name":"tag_filter_operation","in":"query","required":false,"schema":{"anyOf":[{"enum":["and","or"],"type":"string"},{"type":"null"}],"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags.","default":"or","title":"Tag Filter Operation"},"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, status, recordsLag)","title":"Sort"},"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, status, recordsLag)"},{"name":"sort_dir","in":"query","required":false,"schema":{"type":"string","description":"Sort direction: 'asc' (ascending) or 'desc' (descending)","default":"asc","title":"Sort Dir"},"description":"Sort direction: 'asc' (ascending) or 'desc' (descending)"},{"name":"source_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}},{"name":"destination_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by pipeline status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown","title":"Status"},"description":"Filter by pipeline status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown"},{"name":"latency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by pipeline latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Latency"},"description":"Filter by pipeline latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"lag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by pipeline lag (records behind). Format: 'operator:value' (e.g., 'gt:100', 'lt:50'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Lag"},"description":"Filter by pipeline lag (records behind). Format: 'operator:value' (e.g., 'gt:100', 'lt:50'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"secret_returned","in":"query","required":false,"schema":{"enum":["true","false"],"type":"string","default":"false","title":"Secret Returned"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PipelinesPaginatedReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelinesPaginatedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines":{"get":{"tags":["Pipelines"],"summary":"Get Pipelines","operationId":"listPipelines","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},{"name":"partial_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partial Name"}},{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag Ids"}},{"name":"tag_filter_operation","in":"query","required":false,"schema":{"anyOf":[{"enum":["and","or"],"type":"string"},{"type":"null"}],"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags.","default":"or","title":"Tag Filter Operation"},"description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Page Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, status, recordsLag)","title":"Sort"},"description":"Sort field. Can be a DB field (name, created_at) or a metric field (latency, status, recordsLag)"},{"name":"sort_dir","in":"query","required":false,"schema":{"type":"string","description":"Sort direction: 'asc' (ascending) or 'desc' (descending)","default":"asc","title":"Sort Dir"},"description":"Sort direction: 'asc' (ascending) or 'desc' (descending)"},{"name":"source_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id"}},{"name":"destination_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by pipeline status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown","title":"Status"},"description":"Filter by pipeline status. Comma-separated for multiple statuses (e.g., 'Active', 'Active,Paused'). Valid statuses: Active, Broken, Paused, Stopped, Starting, Unassigned, Unknown"},{"name":"latency","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by pipeline latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Latency"},"description":"Filter by pipeline latency in milliseconds. Format: 'operator:value' (e.g., 'gt:1000', 'lt:500'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"lag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by pipeline lag (records behind). Format: 'operator:value' (e.g., 'gt:100', 'lt:50'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)","title":"Lag"},"description":"Filter by pipeline lag (records behind). Format: 'operator:value' (e.g., 'gt:100', 'lt:50'). Valid operators: gt (>), lt (<), gte (>=), lte (<=), eq (=), ne (!=)"},{"name":"secret_returned","in":"query","required":false,"schema":{"enum":["true","false"],"type":"string","default":"false","title":"Secret Returned"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PipelinesPaginatedReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelinesPaginatedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Pipelines"],"summary":"Create New Pipeline","description":"spec: /specs/30_Topics_Pipelines_Streaming/spec.md#create-pipeline","operationId":"createPipeline","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"secret_returned","in":"query","required":false,"schema":{"type":"boolean","description":"Whether to include secret values in the response","default":false,"title":"Secret Returned"},"description":"Whether to include secret values in the response"},{"name":"wait","in":"query","required":false,"schema":{"type":"boolean","description":"When False, defer destination config update to reconciler instead of calling KC directly","default":true,"title":"Wait"},"description":"When False, defer destination config update to reconciler instead of calling KC directly"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePipelineReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineBasic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/brief":{"get":{"tags":["Pipelines"],"summary":"List All Pipelines Brief","operationId":"listPipelinesBrief","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/pipelines/row-level-audit":{"post":{"tags":["Pipelines"],"summary":"Trigger Pipeline Row Level Audit","description":"spec: /specs/90_Audit_SelfHealing/spec.md#trigger-pipeline-row-level-audit","operationId":"triggerRowLevelAudit","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerRowLevelAuditReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/pipelines/{pipeline_id}/metrics":{"get":{"tags":["Pipelines"],"summary":"Get Metrics For Pipeline","description":"Retrieve metrics for a specific pipeline based on the provided parameters.\n\n        This endpoint returns latest metrics data for a given pipeline ID\n        - timesummary and timeseries will be supported soon, the time interval, and the time range.\n        The response includes metadata about the metrics and is tailored to the specified time type.\n\n        ### Parameters:\n        - **pipeline_id** (path): The unique identifier of the pipeline for which metrics are requested.\n        - **time_interval** (query): The numeric interval between metrics data points (e.g., 1, 2, etc.).\n        - **time_unit** (query): The unit of time for the interval (e.g., minute, hour, day, week, month).\n          Combined with `time_interval` to define the granularity (e.g., 1 hour, 2 days).\n        - **timestamp_from** (query, optional): The start time of the metrics data in UTC (ISO 8601 format, e.g.,\n          `2025-03-02T07:10:15Z`). Defaults to 24 hours before the current time if not provided.\n        - **timestamp_to** (query, optional): The end time of the metrics data in UTC (ISO 8601 format).\n          Defaults to the current time if not provided.\n\n        ### Authentication:\n        - Requires a valid user token with the `read:pipeline_metrics` permission.\n\n        ### Returns:\n        - `PipelineLatestMetricsWithMetadata`: `latest` metrics.\n\n        ### Errors:\n        - **400 Bad Request**: Invalid parameters or unexpected errors during processing.\n        - **404 Not Found**: Metrics not found for the specified pipeline or connector plugin issues.\n        - **500 Internal Server Error**: Connector plugin not found or misconfigured.\n\n        ### Example Request:\n        ```http\n        https://api.streamkap.com/pipelines/67bca128e1519efb914e6b51/metrics?time_interval=2&time_unit=hour&timestamp_from=2025-03-02T07:10:15Z&timestamp_to=2025-03-04T07:10:15Z\n        ```\n        ### Example Response:\n        ```json\n        {\n            \"data\": {\n                \"latency\": 1,\n                \"recordsLag\": 0,\n                \"status\": \"Active\"\n            },\n            \"metadata\": {\n                \"latency\": {\n                    \"name\": \"Pipeline Latency\",\n                    \"unit\": \"milliseconds\"\n                },\n                \"status\": {\n                    \"name\": \"Pipeline Status\",\n                    \"unit\": \"milliseconds\"\n                },\n                \"recordsLag\": {\n                    \"name\": \"Lag in Events\",\n                    \"unit\": \"count\"\n                }\n            }\n        }\n        ```","operationId":"getPipelineMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"string","title":"Pipeline Id"}},{"name":"time_interval","in":"query","required":false,"schema":{"type":"integer","title":"Time Interval","description":"The interval between each metrics data point.","examples":[1],"default":1},"description":"The interval between each metrics data point."},{"name":"time_unit","in":"query","required":false,"schema":{"enum":["minute","hour","day","week","month"],"type":"string","title":"Time Unit","description":"The unit of the time interval. Combined with time_interval to determine the interval between each metrics data point. For example, if time_interval=1 and time_unit=hour, the interval between each metrics data point is 1 hour.","examples":["hour"],"default":"hour"},"description":"The unit of the time interval. Combined with time_interval to determine the interval between each metrics data point. For example, if time_interval=1 and time_unit=hour, the interval between each metrics data point is 1 hour."},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time","description":"Start time of the metrics data in UTC timezone. If not provided, start time is set to 24 hours before the current time.","examples":["2025-03-02T07:10:15Z"]},"description":"Start time of the metrics data in UTC timezone. If not provided, start time is set to 24 hours before the current time."},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time","description":"End time of the metrics data in UTC timezone. If not provided, end time is set to the current time.","examples":["2025-03-04T07:10:15Z"]},"description":"End time of the metrics data in UTC timezone. If not provided, end time is set to the current time."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineLatestMetricsWithMetadata"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/metrics":{"post":{"tags":["Pipelines"],"summary":"Get pipeline metrics (POST)","description":"POST alternative for GET /pipelines/metrics. Use when URL length limits are exceeded (e.g., 100+ IDs). Supports both query parameters and request body. Body parameters take precedence over query parameters.","operationId":"searchPipelinesMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Entity identifier to fetch metrics for","title":"Id"},"description":"Entity identifier to fetch metrics for"},{"name":"topic_list_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Starting index for topic list pagination","title":"Topic List From"},"description":"Starting index for topic list pagination"},{"name":"topic_list_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of topics to return in the list","title":"Topic List Size"},"description":"Number of topics to return in the list"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"description":"Starting key for cursor-based pagination","title":"From"},"description":"Starting key for cursor-based pagination"},{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of results to return","title":"Size"},"description":"Number of results to return"},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')","title":"Level"},"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')"},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Page number for pagination","title":"Page"},"description":"Page number for pagination"},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')","title":"Timestamp To"},"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')"},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')","title":"Timestamp From"},"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')"},{"name":"time_unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')","title":"Time Unit"},"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')"},{"name":"time_interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Time interval value for aggregation","title":"Time Interval"},"description":"Time interval value for aggregation"},{"name":"time_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'","title":"Time Type"},"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'"},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of Tenant IDs","title":"Tenant Ids"},"description":"A comma-separated list of Tenant IDs"},{"name":"ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of pipeline IDs","title":"Ids"},"description":"A comma-separated list of pipeline IDs"},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snapshot status filter","title":"Snapshot"},"description":"Snapshot status filter"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field to sort results by","title":"Sort"},"description":"Field to sort results by"},{"name":"sort_dir","in":"query","required":false,"schema":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"description":"Sort direction: 'asc' or 'desc'","title":"Sort Dir"},"description":"Sort direction: 'asc' or 'desc'"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PipelineMetricsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineMetricsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Pipelines"],"summary":"Get Metrics For Pipelines","operationId":"listPipelinesMetrics","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Entity identifier to fetch metrics for","title":"Id"},"description":"Entity identifier to fetch metrics for"},{"name":"topic_list_from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Starting index for topic list pagination","title":"Topic List From"},"description":"Starting index for topic list pagination"},{"name":"topic_list_size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of topics to return in the list","title":"Topic List Size"},"description":"Number of topics to return in the list"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}],"description":"Starting key for cursor-based pagination","title":"From"},"description":"Starting key for cursor-based pagination"},{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Number of results to return","title":"Size"},"description":"Number of results to return"},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')","title":"Level"},"description":"Metrics aggregation level (e.g., 'connector', 'task', 'topic')"},{"name":"page","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Page number for pagination","title":"Page"},"description":"Page number for pagination"},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')","title":"Timestamp To"},"description":"End timestamp for metrics range (ISO 8601, e.g., '2025-01-15T10:00:00Z')"},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')","title":"Timestamp From"},"description":"Start timestamp for metrics range (ISO 8601, e.g., '2025-01-15T09:00:00Z')"},{"name":"time_unit","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')","title":"Time Unit"},"description":"Time unit for aggregation (e.g., 'minute', 'hour', 'day')"},{"name":"time_interval","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"description":"Time interval value for aggregation","title":"Time Interval"},"description":"Time interval value for aggregation"},{"name":"time_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'","title":"Time Type"},"description":"Type of time-based query: 'timeseries', 'latest', or 'timesummary'"},{"name":"tenant_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of Tenant IDs","title":"Tenant Ids"},"description":"A comma-separated list of Tenant IDs"},{"name":"ids","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of pipeline IDs","title":"Ids"},"description":"A comma-separated list of pipeline IDs"},{"name":"snapshot","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Snapshot status filter","title":"Snapshot"},"description":"Snapshot status filter"},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field to sort results by","title":"Sort"},"description":"Field to sort results by"},{"name":"sort_dir","in":"query","required":false,"schema":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"description":"Sort direction: 'asc' or 'desc'","title":"Sort Dir"},"description":"Sort direction: 'asc' or 'desc'"}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PipelineMetricsReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineMetricsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/logs":{"get":{"tags":["Pipelines"],"summary":"Get Logs For Pipelines","operationId":"listPipelineLogs","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"size","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":1000,"minimum":10},{"type":"null"}],"title":"Size"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"From"}},{"name":"log_level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A comma-separated list of log level. Example: INFO,WARN","title":"Log Level"},"description":"A comma-separated list of log level. Example: INFO,WARN"},{"name":"query_string","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query String"}},{"name":"timestamp_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"Example: 2025-07-30T07:54:13.922","title":"Timestamp To"},"description":"Example: 2025-07-30T07:54:13.922"},{"name":"timestamp_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"description":"Example: 2025-07-30T07:54:13.922","title":"Timestamp From"},"description":"Example: 2025-07-30T07:54:13.922"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineMetricsRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/{pipeline_id}":{"get":{"tags":["Pipelines"],"summary":"Get Pipeline","operationId":"getPipeline","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"type":"string","title":"Pipeline Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelinesPaginatedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Pipelines"],"summary":"Update Existing Pipeline","operationId":"updatePipeline","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pipeline Id"}},{"name":"secret_returned","in":"query","required":false,"schema":{"type":"boolean","description":"Whether to include secret values in the response","default":false,"title":"Secret Returned"},"description":"Whether to include secret values in the response"},{"name":"wait","in":"query","required":false,"schema":{"type":"boolean","description":"When False, defer destination config update to reconciler instead of calling KC directly","default":true,"title":"Wait"},"description":"When False, defer destination config update to reconciler instead of calling KC directly"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePipelineReq"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Pipelines"],"summary":"Delete Existing Pipeline","operationId":"deletePipeline","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"pipeline_id","in":"path","required":true,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pipeline Id"}},{"name":"wait","in":"query","required":false,"schema":{"type":"boolean","description":"When False, defer destination config update to reconciler instead of calling KC directly","default":true,"title":"Wait"},"description":"When False, defer destination config update to reconciler instead of calling KC directly"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pipelines/bulk_update":{"put":{"tags":["Pipelines"],"summary":"Update Bulk Pipelines","description":"Update tags for multiple pipelines in bulk.\n\nSupports two modes:\n1. Explicit IDs: Pass a list of pipeline IDs to update\n2. Select all: Set select_all=true with optional filters","operationId":"bulkUpdatePipelines","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdatePipelineReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/pipelines/bulk/delete":{"delete":{"tags":["Pipelines"],"summary":"Bulk Delete Pipelines","description":"Delete multiple pipelines in parallel.\n\nSupports two modes:\n1. Explicit IDs: Pass a list of pipeline IDs to delete\n2. Select all: Set select_all=true with optional filters to delete all matching pipelines\n\nReturns partial success results - continues processing even if individual deletes fail.","operationId":"bulkDeletePipelines","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDeleteReq"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkOperationRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/kafka-access/kafka-users":{"get":{"tags":["Kafka Access"],"summary":"List Kafka Users","operationId":"listKafkaUsers","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"FronteggHTTPAuthentication":[]}]},"post":{"tags":["Kafka Access"],"summary":"Create New Kafka User","operationId":"createKafkaUser","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKafkaUserBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/kafka-access/kafka-users/{username}":{"put":{"tags":["Kafka Access"],"summary":"Update Kafka User","operationId":"updateKafkaUser","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","title":"Username"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKafkaUserBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Kafka Access"],"summary":"Delete Kafka User","description":"Delete a Kafka user (and its proxy, ACLs, SCRAM credentials).\n\nIf the user is linked to a Project Key the request still succeeds - the Project Key's\nKafka credentials become invalid but the API credentials (if any) keep working. The\nresponse includes a warning message so the caller can surface it to the user. This is\nintentional: the previous 409 created a deadlock for DELETE_FAILED PKs where neither\nthe PK nor its linked Kafka user could be removed.","operationId":"deleteKafkaUser","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string","title":"Username"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project-keys":{"get":{"tags":["Project Keys"],"summary":"List Project Keys","description":"List all Project Keys for the current tenant. Returns summaries with no secrets.","operationId":"listProjectKeys","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ProjectKeySummary"},"type":"array","title":"Response Listprojectkeys"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]},"post":{"tags":["Project Keys"],"summary":"Create Project Key","description":"Create a Project Key with API credentials and optional Kafka access.\n\nReturns a credential file (JSON) with plaintext secrets. This is a one-time delivery -\nsecrets are masked in all subsequent responses. Optionally creates a Kafka user with\nSCRAM credentials, K8s proxy, and ACLs.","operationId":"createProjectKey","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectKeyCredentialFile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/project-keys/{project_key_id}":{"get":{"tags":["Project Keys"],"summary":"Get Project Key","description":"Get Project Key detail including Kafka ACLs and whitelist IPs for edit modal hydration.","operationId":"getProjectKey","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"project_key_id","in":"path","required":true,"schema":{"type":"string","title":"Project Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectKeyDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Project Keys"],"summary":"Update Project Key","description":"Update a Project Key's name, description, roles, tool scoping, or Kafka ACLs.\n\nSupports additive capability transitions:\n- Send `kafka_config` on an API-only PK to add Kafka access. Response will include\n  `new_kafka_credentials` with the plaintext Kafka password (shown once).\n- Send `role_ids` or `permission_ids` on a Kafka-only PK to add API credentials.\n  Response will include `new_api_credentials` with the plaintext client_secret (shown once).\n\nReturns 400 if the key is in creating/deleting/delete_failed state.\nrole_ids and permission_ids are mutually exclusive.","operationId":"updateProjectKey","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"project_key_id","in":"path","required":true,"schema":{"type":"string","title":"Project Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectKeyUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectKeyUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Project Keys"],"summary":"Delete Project Key","description":"Delete a Project Key and all constituent resources (API credential, Kafka user, K8s proxy, ACLs).","operationId":"deleteProjectKey","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"project_key_id","in":"path","required":true,"schema":{"type":"string","title":"Project Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deleteprojectkey"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project-keys/{project_key_id}/mcp-config":{"get":{"tags":["Project Keys"],"summary":"Get Project Key Mcp Config","description":"Returns authoritative MCP tool scoping config for server-side enforcement.\n\nCalled by the MCP server on session start to verify tool_profile, allowed_tools,\nand blocked_tools - preventing credential file tampering.","operationId":"getProjectKeyMcpConfig","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"project_key_id","in":"path","required":true,"schema":{"type":"string","title":"Project Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectKeyMcpConfig"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project-keys/{project_key_id}/enable-agentic":{"post":{"tags":["Project Keys"],"summary":"Enable Project Key Agentic","description":"Toggle agentic use ON for a Project Key (the agentic toggle).\n\nAtomic: rotates the API client credential, encrypts the new credential file\nblob with KMS, stores it on the PK row, sets ``agentic_enabled=True``.\nIdempotent on already-enabled PKs (no double rotation).\n\nRate limit: 5/min/tenant (each call burns one Frontegg credential rotation).\nReturns 429 with ``Retry-After`` on bucket exhaustion.\n\nAudit-logged with action=enable / enable_noop, actor email + sub, old/new\nstate, tenant_id, project_key_id, timestamp.","operationId":"enableProjectKeyAgentic","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"project_key_id","in":"path","required":true,"schema":{"type":"string","title":"Project Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectKeySummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/project-keys/{project_key_id}/disable-agentic":{"post":{"tags":["Project Keys"],"summary":"Disable Project Key Agentic","description":"Toggle agentic use OFF for a Project Key.\n\nErases ``agentic_secret_blob`` and clears the flag. Does NOT rotate the\nAPI credential - the PK keeps working for non-agentic uses (raw API calls,\nKafka). Idempotent on already-disabled PKs.\n\nRate limit: 5/min/tenant. Audit-logged with action=disable / disable_noop.","operationId":"disableProjectKeyAgentic","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"project_key_id","in":"path","required":true,"schema":{"type":"string","title":"Project Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectKeySummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/consumer-groups":{"get":{"tags":["Consumer Groups"],"summary":"List Consumer Groups","description":"List consumer groups for the tenant with pagination.\nExcludes internal/system consumer groups.","operationId":"listConsumerGroups","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Items per page","default":50,"title":"Page Size"},"description":"Items per page"},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by state. Comma-separated for multiple values (e.g., 'Dead,Empty'). Valid states: Stable, Empty, Dead, PreparingRebalance, CompletingRebalance, Unknown","title":"State"},"description":"Filter by state. Comma-separated for multiple values (e.g., 'Dead,Empty'). Valid states: Stable, Empty, Dead, PreparingRebalance, CompletingRebalance, Unknown"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search by group ID (case-insensitive substring match)","title":"Search"},"description":"Search by group ID (case-insensitive substring match)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsumerGroupsPaginatedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/consumer-groups/{group_id}":{"get":{"tags":["Consumer Groups"],"summary":"Get Consumer Group Detail","description":"Get detailed information about a specific consumer group.\n\nReturns all members and paginated topic-partition assignments with member attribution.\nUse include_assignments=false for large consumer groups to skip assignment details.\n\nPagination applies to topics, not members (all members are returned).\n\nSecurity: Consumer groups are tenant-isolated via k8s_namespace. Each tenant has their own\nKafka cluster, so consumer groups from other tenants are not accessible.","operationId":"getConsumerGroup","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number for topics (1-indexed)","default":1,"title":"Page"},"description":"Page number for topics (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Topics per page","default":50,"title":"Page Size"},"description":"Topics per page"},{"name":"include_assignments","in":"query","required":false,"schema":{"type":"boolean","description":"Include partition assignment details (set false for large groups)","default":true,"title":"Include Assignments"},"description":"Include partition assignment details (set false for large groups)"},{"name":"topic_search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search topics by name (case-insensitive substring match)","title":"Topic Search"},"description":"Search topics by name (case-insensitive substring match)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsumerGroupDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/consumer-groups/{group_id}/reset-offsets":{"post":{"tags":["Consumer Groups"],"summary":"Reset Consumer Group Offsets","description":"Reset offsets for selected topics in a consumer group.\n\nSupports multiselect topics and multiple reset strategies:\n- earliest: Reset to beginning of topic\n- latest: Reset to end of topic (skip all messages)\n- timestamp: Reset to specific timestamp\n- offset: Reset to specific offset value","operationId":"resetConsumerGroupOffsets","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetOffsetsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/schema-registry/subjects":{"get":{"tags":["Schema Registry"],"summary":"List Schema Subjects","description":"List schema subjects for the tenant with pagination.\nExcludes internal subjects.\nOptional: include_metadata=true to get latest version info in a single request.","operationId":"listSchemaSubjects","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number (1-indexed)","default":1,"title":"Page"},"description":"Page number (1-indexed)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Items per page","default":50,"title":"Page Size"},"description":"Items per page"},{"name":"include_metadata","in":"query","required":false,"schema":{"type":"boolean","description":"Include latest version metadata for each subject","default":true,"title":"Include Metadata"},"description":"Include latest version metadata for each subject"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search subjects by name (case-insensitive substring match)","title":"Search"},"description":"Search subjects by name (case-insensitive substring match)"},{"name":"schema_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by schema type (AVRO, JSON, PROTOBUF)","title":"Schema Type"},"description":"Filter by schema type (AVRO, JSON, PROTOBUF)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaSubjectsPaginatedRes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/schema-registry/subjects/{subject}/versions":{"get":{"tags":["Schema Registry"],"summary":"List Subject Versions","description":"List all version numbers for a specific schema subject.","operationId":"listSchemaVersions","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"subject","in":"path","required":true,"schema":{"type":"string","title":"Subject"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"integer"},"title":"Response Listschemaversions"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/schema-registry/subjects/{subject}/versions/{version}":{"get":{"tags":["Schema Registry"],"summary":"Get Schema By Version","description":"Get a specific schema version for a subject.\nVersion can be a number or 'latest'.","operationId":"getSchemaByVersion","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"subject","in":"path","required":true,"schema":{"type":"string","title":"Subject"}},{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/schema-registry/schemas/{schema_id}":{"get":{"tags":["Schema Registry"],"summary":"Get Schema By Id","description":"Get a schema by its global ID.","operationId":"getSchemaById","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"schema_id","in":"path","required":true,"schema":{"type":"integer","title":"Schema Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchemaDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tags/search":{"post":{"tags":["Tags"],"summary":"Search tags (POST)","description":"POST alternative for GET /tags. Use when URL length limits are exceeded (e.g., 100+ tag IDs). Supports both query parameters and request body. Body parameters take precedence over query parameters.","operationId":"searchTags","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tag Ids"}},{"name":"tag_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag Name"}},{"name":"tag_type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/TagTypeEnum"}},{"type":"null"}],"title":"Tag Type"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TagsSearchReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Searchtags"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tags":{"get":{"tags":["Tags"],"summary":"Get Tags For Specific Tenant","description":"Get tags by tag_ids and tag_type.","operationId":"listTags","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"tag_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tag Ids"}},{"name":"tag_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag Name"}},{"name":"tag_type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/TagTypeEnum"}},{"type":"null"}],"title":"Tag Type"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TagsSearchReqBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Listtags"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Tags"],"summary":"Create Tag","description":"Create a new tag.","operationId":"createTag","security":[{"FronteggHTTPAuthentication":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomTagCreateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Createtag"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tags/{tag_type}":{"get":{"tags":["Tags"],"summary":"Get Tags By Type","description":"Get tags by tag_type.","operationId":"listTagsByType","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"tag_type","in":"path","required":true,"schema":{"$ref":"#/components/schemas/TagTypeEnum"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Listtagsbytype"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tags/{tag_id}":{"delete":{"tags":["Tags"],"summary":"Delete Tag","description":"Delete a tag.","operationId":"deleteTag","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","title":"Tag Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Tags"],"summary":"Update Tag","description":"Update a tag.","operationId":"updateTag","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"tag_id","in":"path","required":true,"schema":{"type":"string","title":"Tag Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomTagUpdateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Updatetag"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cluster/enabled":{"get":{"tags":["Cluster Scaling"],"summary":"Is Cluster Scaling Enabled","description":"Lightweight capability check for the cluster view.\n\n``enabled``: the current service is BYOC, so the cluster info view is available.\n``scaling_available``: a cluster_configs record also exists, so scale operations are possible.","operationId":"isClusterScalingEnabled","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Isclusterscalingenabled"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/cluster/status":{"get":{"tags":["Cluster Scaling"],"summary":"Get Cluster Status","description":"Get current cluster status by fetching live state from EKS + K8s.\n\nReads tier definitions from the cluster_configs collection,\nthen queries the actual cluster to determine current tier, memory, and replicas.\nBYOC services without a cluster_configs record get a live-only view\n(no tier catalog, ``scaling_available: false``) that degrades to\n'unknown' values instead of failing.","operationId":"getClusterStatus","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterStatusResponse"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/cluster/scale":{"post":{"tags":["Cluster Scaling"],"summary":"Scale Cluster","description":"Create a scaling operation record. The skap-scaling controller picks it up and executes.\n\nOnly one scaling operation can run at a time per service.\nRequires a BYOC service.","operationId":"scaleCluster","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScaleClusterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScaleClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/cluster/scale/{operation_id}":{"get":{"tags":["Cluster Scaling"],"summary":"Get Scale Operation Status","description":"Get the current status of a scaling operation. Frontend polls this every 5 seconds.","operationId":"getScaleOperationStatus","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","title":"Operation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScaleOperationStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cluster/scale/{operation_id}/cancel":{"post":{"tags":["Cluster Scaling"],"summary":"Cancel Scale Operation","description":"Request cancellation. Controller checks between steps and stops if cancelled.\n\nOnly works before step 4 (point of no return - pods already deleted).","operationId":"cancelScaleOperation","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","title":"Operation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScaleClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/jar":{"post":{"tags":["Agents"],"summary":"Deploy Jar Job","description":"Deploy a JAR-based agent.\n\nUpload a JAR file as multipart and specify main_class + optional args.\nForm fields: name, main_class, parallelism (default 1), job_args (JSON string).","operationId":"deployAgentJarJob","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_deployAgentJarJob"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/pyflink":{"post":{"tags":["Agents"],"summary":"Deploy Pyflink Job","description":"Deploy a PyFlink agent.\n\nEither upload a Python file as multipart OR provide inline python_code as a form field.\nForm fields: name, parallelism (default 1), job_args (JSON string), python_code (alternative to file).","operationId":"deployAgentPyFlinkJob","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_deployAgentPyFlinkJob"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/config":{"post":{"tags":["Agents"],"summary":"Create Agent From Config","description":"Create a config-based agent, optionally deploying it.\n\nSet deploy=false to save as draft without deploying.","operationId":"createAgentFromConfig","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"deploy","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Deploy"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAgentConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{job_id}/cancel":{"post":{"tags":["Agents"],"summary":"Cancel Agent","description":"Gracefully cancel a running agent WITH savepoint.\n\nCreates a savepoint before stopping - use this when you want to resume later.\nThe savepoint path is stored and used automatically on redeploy.","operationId":"cancelAgent","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{job_id}/stop":{"post":{"tags":["Agents"],"summary":"Stop Agent","description":"Immediately stop a running agent WITHOUT savepoint.\n\nNo savepoint is created - next deploy starts fresh. Use this when you\ndon't need to preserve state (e.g., after a code change).","operationId":"stopAgent","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{job_id}/redeploy":{"post":{"tags":["Agents"],"summary":"Redeploy Agent","description":"Redeploy a cancelled/failed agent.\n\nRe-uploads stored code to the Flink pod and starts the job.\nSet with_savepoint=true (default) to resume from last savepoint, or false\nto start fresh. Body is optional - omit it to accept defaults.","operationId":"redeployAgent","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/RedeployAgentRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{job_id}/code":{"get":{"tags":["Agents"],"summary":"Get Agent Code","description":"Get the stored code for a PyFlink agent.","operationId":"getAgentCode","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Getagentcode"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Agents"],"summary":"Update Agent Code","description":"Update the stored code for a PyFlink agent and optionally redeploy.","operationId":"updateAgentCode","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Updateagentcode"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{job_id}":{"delete":{"tags":["Agents"],"summary":"Delete Agent","description":"Soft-delete an agent (cancels it first if running).","operationId":"deleteAgent","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deleteagent"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Agents"],"summary":"Get Agent","description":"Get an agent with live status from Flink REST.","operationId":"getAgent","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/prompt-templates":{"get":{"tags":["Agents"],"summary":"Get Agent Prompt Templates","description":"Return the system-prompt templates per agent type.\n\nLets the FE preview the exact string Flink will prepend at runtime (no drift\nrisk from duplicating the strings in frontend constants). Keys mirror\n``AgentTypeEnum``: workflow / react.","operationId":"getAgentPromptTemplates","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Getagentprompttemplates"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/models":{"get":{"tags":["Agents"],"summary":"Get Agent Models","description":"Return the curated LLM model list per provider.\n\nShape: ``{provider: [{\"value\": model_id, \"label\": display_name}, ...]}``.\nFirst-paint fallback for the Deploy form dropdown, before the user enters\nan API key. Once a key is entered, prefer ``POST /agents/models/live`` -\nthat returns the provider's live list including org-enabled models and\nfine-tunes the curated list can't know about.","operationId":"getAgentModels","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Getagentmodels"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/cluster":{"get":{"tags":["Agents"],"summary":"Get Agent Cluster","description":"Return cluster-level Flink info for the agent runtime - slots + version.\n\nPowers the agentic dashboard header (total/available task slots, Flink\nversion). Sourced from Flink REST ``/overview``; kebab-case keys are\ntranslated to the camelCase response contract.\n\nAgents and transforms share the same tenant Flink cluster, so this probe\naccepts either ``read:agents`` or ``read:transforms`` (OR semantics) and\nbacks the cluster-availability note on both deploy surfaces.\n\nWhen the tenant's cluster is not provisioned the upstream REST call 404s;\nthat is reported as ``available=False`` with zeroed fields (HTTP 200) so\nthe dashboard can render a \"cluster not available\" note instead of erroring.\nA tenant with no ``k8s_infras`` row (``BadRequestException`` from\n``get_k8s_infra`` inside ``FlinkClusterClient.create``) means the same\nthing for this probe — no cluster to reach — so it takes the same\n``available=False`` path rather than surfacing a 400. Deploy paths keep\ntheir loud 400: the mapping applies only here.","operationId":"getAgentCluster","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentClusterOverviewResponse"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/models/live":{"post":{"tags":["Agents"],"summary":"List Agent Models Live","description":"Return the provider's live model list using the caller's API key.\n\nThe key is forwarded directly to the provider's ``/v1/models`` endpoint\n(or Ollama's ``/api/tags``) and not persisted. Response shape matches\n``GET /agents/models`` per provider so the FE can swap the static fallback\nfor the live list without changing the dropdown contract.\n\n422 if ``apiKey`` is missing for a non-Ollama provider. 400 with the\nprovider's own error message on invalid key / connection failure.\nPer-tenant rate limit: 30 req/min/bucket -> 429 with ``Retry-After``.","operationId":"listAgentModelsLive","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListProviderModelsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Listagentmodelslive"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/validate-llm":{"post":{"tags":["Agents"],"summary":"Validate Llm Connection","description":"Validate an LLM provider API key and model availability.\n\nTwo callable shapes:\n\n- **Inline** - raw ``apiKey`` + optional ``baseUrl`` supplied directly.\n  Used when the user is pasting a fresh key in the form.\n- **Saved connection** - ``savedConnectionId`` references a stored\n  ``llmConnection``; BE loads the decrypted ``apiKey`` + ``baseUrl`` +\n  ``provider`` server-side so the browser never holds the plaintext.\n\nCalls the provider's free list-models endpoint to check key validity\nand model existence. The \"apiKey required unless ollama or saved\" rule\nis enforced by the request model's ``@model_validator``.\nPer-tenant rate limit: 30 req/min/bucket -> 429 with ``Retry-After``.","operationId":"validateLlmConnection","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateLlmRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Validatellmconnection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/system-prompt-suggestion":{"post":{"tags":["Agents"],"summary":"Suggest Agent System Prompt","description":"Generate a starter ``customInstructions`` block for the wizard.\n\nSame two credential shapes as ``/agents/validate-llm``:\n\n- **Inline** - raw ``apiKey`` (+ optional ``baseUrl``) supplied directly.\n- **Saved connection** - ``savedConnectionId`` references a stored\n  ``llmConnection``; BE loads decrypted ``apiKey`` / ``baseUrl`` /\n  ``provider`` server-side so the browser never holds the plaintext.\n\nComposes a meta-system-prompt + a structured user message describing\nthe agent (type, name, description, topics, fields, tools, output\nschema, optional existing draft) and calls the user's own LLM. The\nruntime ``build_system_prompt`` already emits the per-agentType base\ntemplate + schema field listing + tool signatures at deploy time, so\nthe LLM is constrained to produce only the user-facing instructions\nslot - the meta-prompt enforces that explicitly. Nothing is persisted.\n\nPer-tenant rate limit: dedicated ``BUCKET_PROMPT_SUGGEST`` bucket\n(30/min/tenant) separate from ``validate-llm``, so heavy \"Generate\"\nusage (humans iterating on prompt drafts) doesn't eat into the\ncredential-check budget. Provider failures (timeouts, 4xx, schema\nerrors) surface as 400 with the provider's error message so the FE's\nexisting error-extraction works unchanged.","operationId":"suggestAgentSystemPrompt","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemPromptSuggestionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemPromptSuggestionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/test-run":{"post":{"tags":["Agents"],"summary":"Test Run Agent","description":"Run an agent against a single sample record without deploying to Flink.\n\nSynchronous, hard-capped at 15s wall-clock. Calls the LLM provider\ndirectly + dispatches MCP and HTTP tools live; transform tools and\nmemory are intentionally not exercised (the Flink runtime owns\nthem). Per-tenant rate limit: shares the validate-llm bucket\n(30 req/min/tenant) -> 429.\n\nProvider failures (timeouts, schema errors, unsupported provider) land\nas a structured ``error`` object on the envelope (HTTP still 200) so\nthe FE can render the partial timeline alongside the error context.\nOnly the input-token cap raises (422) - at that point we can't even\nstart the run.","operationId":"testRunAgentOnSampleRecord","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestRunRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestRunResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/sample-record":{"post":{"tags":["Agents"],"summary":"Get Agent Sample Record","description":"Pull the latest record from the topic that matches ``topicPattern``.\n\nUsed by the wizard's persistent test pane to pre-fill the Monaco editor\nwith a concrete sample, so the user doesn't have to hand-craft one.\nReturns 200 in every \"no record\" case (regex matches no topic, every\nmatched topic is empty, deserialization fails) so the FE can render\ninline state without retry logic.\n\n``read:agents`` is the right gate - this is observation, not config\nmutation, and the response is the same record any team member with\nKafka topic-read access could pull manually.\n\nPer-tenant rate limit: 30 req/min/bucket -> 429 with ``Retry-After``.","operationId":"getAgentSampleRecord","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SampleRecordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SampleRecordResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/mcp/tools":{"post":{"tags":["Agents"],"summary":"Discover Mcp Tools","description":"Discover available tools from an MCP server.\n\nThree callable shapes - see ``DiscoverMcpToolsRequest`` docs for full details:\n\n- **Saved-id:** ``{savedConnectionId}`` -> BE reads the stored row and\n  composes headers server-side; the browser never sees the token.\n  ``savedConnectionName`` is accepted as a deprecated alias for one\n  release cycle.\n- **Inline with masked secret:** ``{serverUrl, headers: {...: \"********\"}}`` ->\n  BE matches the serverUrl against saved settings and substitutes the\n  stored secret for every masked header value.\n- **Inline plaintext:** ``{serverUrl, headers}`` - used on first-save\n  \"Test\" click before the row exists.\n\nURL is validated (SSRF guard) on every path. Per-tenant rate limit:\n30 req/min -> 429 with ``Retry-After``. A 300s in-process cache (M10)\nkeyed by ``(serverUrl, headers-hash)`` short-circuits repeat calls;\n``X-MCP-Cache: hit|miss`` is emitted on every response. Cache hits\nstill consume rate-limit budget - the cache is not a bypass.","operationId":"discoverMcpTools","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoverMcpToolsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Discovermcptools"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/connections":{"get":{"tags":["Agents"],"summary":"Get Agent Connections","description":"Get the tenant's saved agent connections.\n\nReturns the bulk shape (LLM / MCP / HTTP connection arrays). Secrets\nare masked (``sk-a****xyzw`` partial mask for apiKey/clientSecret;\n``********`` for bearerToken/headerValue and every value inside a\n``headers`` dict), so ``read:agents`` is the correct gate - a team\nmember with read-only access can see which connections exist to\nreason about agent configuration without being able to mutate them.\nThe unmasked plaintext is only reachable via the internal\n``_load_agent_connections_decrypted`` helper used at deploy time -\nnever via an HTTP endpoint.","operationId":"getAgentConnections","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Getagentconnections"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]},"put":{"tags":["Agents"],"summary":"Update Agent Connections","description":"Bulk save the tenant's agent connections. Secrets are encrypted at rest.\n\nService-layer ``ValueError`` (external MCP URL validation, intra-document\nduplicate id guard) surfaces as 422 with the message so the FE can point\nat the offending row. Unhandled, these would land as 500.","operationId":"updateAgentConnections","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentConnections"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Updateagentconnections"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/connections/llm":{"post":{"tags":["Agents"],"summary":"Create Agent Llm Connection","description":"Create one LLM connection. ``id`` is server-generated.\n\nValidates against the same ``AgentLlmConnection`` model the bulk PUT\nuses; capability-matrix / length / type errors surface as the standard\nFastAPI 422 envelope. Duplicate ``name`` within the tenant returns 409\nwith the same shape the bulk PUT uses for surfaceable conflicts.","operationId":"createAgentLlmConnection","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Createagentllmconnection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/connections/llm/{connection_id}":{"patch":{"tags":["Agents"],"summary":"Patch Agent Llm Connection","description":"Partial-update one LLM connection by id.\n\n``apiKey: \"********\"`` (or partial ``sk-a****xyz``) -> no-op on that\nfield. ``apiKey: null`` -> clear. Other fields merge over the existing\nrow, then the merged row re-validates against ``AgentLlmConnection``.\nReturns the masked persisted shape.","operationId":"patchAgentLlmConnection","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patchagentllmconnection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Agents"],"summary":"Delete Agent Llm Connection","description":"Hard-delete one LLM connection by id.\n\nPer the FE handoff (Option B): no referential check against agents\nusing this connection. Agents that picked it surface a banner on\nnext edit (same idiom as Pinecone destination deletion).","operationId":"deleteAgentLlmConnection","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/connections/mcp":{"post":{"tags":["Agents"],"summary":"Create Agent Mcp Connection","description":"Create one external MCP connection.\n\nStreamkap-source rows are rejected (422): they're managed via the\nProject Key agentic toggle, not Settings. Discriminator (``authMode``)\n+ URL SSRF guard run inline before the row is persisted.","operationId":"createAgentMcpConnection","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Createagentmcpconnection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/connections/mcp/{name}":{"patch":{"tags":["Agents"],"summary":"Patch Agent Mcp Connection","description":"Partial-update one external MCP connection by name.\n\n``name`` is URL-encoded by the FE so quirks like spaces survive.\nSwitching ``authMode`` mid-patch swaps the discriminated-union\nvariant; the merged row re-validates fully so the FE can't end up\nwith an \"unknown\" auth mode mid-flight.","operationId":"patchAgentMcpConnection","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patchagentmcpconnection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Agents"],"summary":"Delete Agent Mcp Connection","description":"Hard-delete one external MCP connection by name.","operationId":"deleteAgentMcpConnection","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/connections/http":{"post":{"tags":["Agents"],"summary":"Create Agent Http Connection","description":"Create one HTTP connection. ``id`` is server-generated.\n\nHeader values are KMS-encrypted at rest and full-mask on response.\n``Authorization`` is allowed in headers (unlike External MCP, which\nowns its own auth shape via ``authMode``).","operationId":"createAgentHttpConnection","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Createagenthttpconnection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/connections/http/{connection_id}":{"patch":{"tags":["Agents"],"summary":"Patch Agent Http Connection","description":"Partial-update one HTTP connection by id.\n\nPer-header masked sentinel preserves the existing encrypted Binary;\na new header value encrypts + replaces. Removing a key from the\nheaders dict in the patch removes it from storage (the merge is\nfield-level, not a deep merge of the headers object).","operationId":"patchAgentHttpConnection","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patchagenthttpconnection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Agents"],"summary":"Delete Agent Http Connection","description":"Hard-delete one HTTP connection by id.","operationId":"deleteAgentHttpConnection","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/connections/vectorStore":{"post":{"tags":["Agents"],"summary":"Create Agent Vector Store Connection","description":"Create one vector store connection. ``id`` is server-generated.","operationId":"createAgentVectorStoreConnection","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Createagentvectorstoreconnection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/connections/vectorStore/{connection_id}":{"patch":{"tags":["Agents"],"summary":"Patch Agent Vector Store Connection","description":"Partial-update one vector store connection by id.","operationId":"patchAgentVectorStoreConnection","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Patchagentvectorstoreconnection"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Agents"],"summary":"Delete Agent Vector Store Connection","description":"Hard-delete one vector store connection by id.","operationId":"deleteAgentVectorStoreConnection","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"connection_id","in":"path","required":true,"schema":{"type":"string","title":"Connection Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents":{"get":{"tags":["Agents"],"summary":"List Agents","description":"List all agents for the current tenant/service.","operationId":"listAgents","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobResponse"},"type":"array","title":"Response Listagents"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/agents/{job_id}/status":{"get":{"tags":["Agents"],"summary":"Get Agent Status","description":"Get lightweight status for an agent (DB + live Flink state only).","operationId":"getAgentStatus","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlinkJobStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{job_id}/logs":{"get":{"tags":["Agents"],"summary":"Get Agent Logs","description":"Tailed ``[AGENT]``-prefixed Flink TM logs + recent job exceptions.\n\nThe ``write:agents`` gate is intentional: agent log lines may contain\ncustomer payloads that flowed through prompts and tool args. Tightening\nthe audit surface here mirrors how the Streamkap MCP project key blob\nis gated.\n\nPer-line scoping is namespace-wide for now - when multiple agents share\na TaskManager, lines from other agents may appear. Documented limitation\nuntil the Java runtime emits per-line agent IDs.\n\n``since`` is an optional ISO 8601 cutoff for incremental polling on the\nunified observability surface. The underlying tail window is Nx4 the\nrequested ``tail`` count; if ``since`` is far enough back that the\nwindow doesn't reach it, the response is still bounded by ``tail`` (the\ncaller can widen ``tail`` to compensate).","operationId":"getAgentLogs","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"tail","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Tail"}},{"name":"level","in":"query","required":false,"schema":{"type":"string","default":"INFO","title":"Level"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentLogsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{job_id}/config":{"get":{"tags":["Agents"],"summary":"Get Agent Config","description":"Get the stored config for a config-based agent.","operationId":"getAgentConfig","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Agents"],"summary":"Update Agent Config","description":"Update a config-based agent's config and redeploy.\n\nMerges the provided fields into the existing config, then triggers\nsavepoint -> cancel -> redeploy with the new config. The caller's email\nis recorded on the paired history row (M3) - for admin-app mode this is\nthe admin's email, not the tenant user's.","operationId":"updateAgentConfig","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAgentConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{job_id}/config/history":{"get":{"tags":["Agents"],"summary":"List Agent Config History","description":"List a config-based agent's config-change history, newest first.\n\nResponse is bounded by the server-side retention window (50 rows per\nagent by default) and carries a per-row ``summary.changedFields`` so\nthe FE sidebar stays cheap - full before/after diffs come from two\n``GET /history/{version}`` detail reads.","operationId":"listAgentConfigHistory","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"before_version","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Before Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentConfigHistoryListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{job_id}/config/history/{version}":{"get":{"tags":["Agents"],"summary":"Get Agent Config History Entry","description":"Return the masked full config for a specific history version.\n\nStored snapshots are re-validated through ``CreateAgentConfigRequest``\non the response path. If the validator has tightened since the snapshot\nwas written, surface the error as 422 so the FE can explain the drift\n- same shape the rollback endpoint uses. Unhandled, the error would\notherwise land as a 500.","operationId":"getAgentConfigHistoryEntry","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"version","in":"path","required":true,"schema":{"type":"integer","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentConfigHistoryDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agents/{job_id}/config/rollback":{"post":{"tags":["Agents"],"summary":"Rollback Agent Config","description":"Roll a config-based agent back to a historical version.\n\nWrites a new version N+1 whose config equals the target's stored\nsnapshot, records ``change_kind='rollback'`` + ``rollback_source_version``\non the new history row, and redeploys the agent. Never a pointer swap,\nnever destructive. If current validators reject the historical config\n(validator tightening between then and now), returns 422 with Pydantic's\nerror text so the FE can highlight the offending fields.","operationId":"rollbackAgentConfig","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RollbackAgentConfigRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-bases/config":{"post":{"tags":["Knowledge Bases"],"summary":"Create Knowledge Base","description":"Create a knowledge base pipeline, optionally deploying it.\n\nSet deploy=false to save as draft without deploying to Flink.","operationId":"createKnowledgeBase","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"deploy","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Deploy"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKnowledgeBaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-bases":{"get":{"tags":["Knowledge Bases"],"summary":"List Knowledge Bases","description":"List all knowledge bases for the current tenant + service.","operationId":"listKnowledgeBases","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/KnowledgeBaseResponse"},"type":"array","title":"Response Listknowledgebases"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/knowledge-bases/{kb_id}":{"get":{"tags":["Knowledge Bases"],"summary":"Get Knowledge Base","description":"Get a single knowledge base by ID.","operationId":"getKnowledgeBase","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Knowledge Bases"],"summary":"Delete Knowledge Base","description":"Soft-delete a knowledge base.","operationId":"deleteKnowledgeBase","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-bases/{kb_id}/cancel":{"post":{"tags":["Knowledge Bases"],"summary":"Cancel Knowledge Base","description":"Cancel a running knowledge base (graceful, with savepoint).","operationId":"cancelKnowledgeBase","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-bases/{kb_id}/stop":{"post":{"tags":["Knowledge Bases"],"summary":"Stop Knowledge Base","description":"Stop a running knowledge base (immediate, no savepoint).","operationId":"stopKnowledgeBase","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeBaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/knowledge-bases/{kb_id}/retrieve":{"post":{"tags":["Knowledge Bases"],"summary":"Retrieve Knowledge Base","description":"Embed ``query`` and return the top-k matching chunks from the KB.\n\nAuth: ``write:agents``. Chunks are customer data, same threat\nmodel as ``/agents/{id}/logs``.\n\nTenant scoping: a ``kb_id`` from another tenant returns 404 just\nlike the read endpoint — no existence leak.\n\nRate limit: ``BUCKET_KB_RETRIEVAL`` at 30 req/min/tenant — same\nbudget as the other outbound-call endpoints (MCP discovery,\nvalidate-llm, models-live).\n\nDual-surface model: this endpoint is one of three KB retrieval\npaths. The Java agent runtime queries Pinecone directly at deploy\ntime via its own mirror (off the hot path through this BE); the\nstreamkap-tools MCP server exposes ``streamkap_kb_retrieve`` and\nproxies through this endpoint for third-party agents.","operationId":"retrieveKnowledgeBase","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"kb_id","in":"path","required":true,"schema":{"type":"string","title":"Kb Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KbRetrieveRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KbRetrieveResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flink_jobs/jar":{"post":{"tags":["Flink Jobs"],"summary":"Deploy Jar Job","description":"Deploy a JAR-based Flink job.\n\nUpload a JAR file as multipart and specify main_class + optional args.\nForm fields: name, main_class, parallelism (default 1), job_args (JSON string).","operationId":"deployFlinkJarJob","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_deployFlinkJarJob"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__flink_jobs_api_models__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/flink_jobs/pyflink":{"post":{"tags":["Flink Jobs"],"summary":"Deploy Pyflink Job","description":"Deploy a PyFlink job.\n\nEither upload a Python file as multipart OR provide inline python_code as a form field.\nForm fields: name, parallelism (default 1), job_args (JSON string), python_code (alternative to file).","operationId":"deployFlinkPyFlinkJob","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_deployFlinkPyFlinkJob"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__flink_jobs_api_models__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/flink_jobs/":{"get":{"tags":["Flink Jobs"],"summary":"List Flink Jobs","description":"List all Flink jobs for the current tenant/service.","operationId":"listFlinkJobs","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/app__models__api__flink_jobs_api_models__FlinkJobResponse"},"type":"array","title":"Response Listflinkjobs"}}}}},"security":[{"FronteggHTTPAuthentication":[]}]}},"/flink_jobs/{job_id}":{"get":{"tags":["Flink Jobs"],"summary":"Get Flink Job","description":"Get a Flink job with live status from Flink REST.","operationId":"getFlinkJob","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__flink_jobs_api_models__FlinkJobDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Flink Jobs"],"summary":"Delete Flink Job","description":"Soft-delete a Flink job (cancels it first if running).","operationId":"deleteFlinkJob","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deleteflinkjob"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flink_jobs/{job_id}/status":{"get":{"tags":["Flink Jobs"],"summary":"Get Flink Job Status","description":"Get lightweight status for a Flink job (DB + live Flink state only).","operationId":"getFlinkJobStatus","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlinkJobStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flink_jobs/{job_id}/cancel":{"post":{"tags":["Flink Jobs"],"summary":"Cancel Flink Job","description":"Cancel a running Flink job.","operationId":"cancelFlinkJob","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__flink_jobs_api_models__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/flink_jobs/{job_id}/restart":{"post":{"tags":["Flink Jobs"],"summary":"Restart Flink Job","description":"Restart a cancelled or failed Flink job.","operationId":"restartFlinkJob","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/app__models__api__flink_jobs_api_models__FlinkJobResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/agents":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Agents","description":"Agent activity rollup over the selected window (default last 24h).\n\nOne row per Streamkap agent (joined with MongoDB ``agents`` for the friendly\nname) plus one per ``(project_key_id, client_id)`` external pseudo-agent.\nStreamkap counts combine MCP-server calls (``streamkap_mcp_log``) with\nagent-runtime trace activity (``agent_traces``), so an agent that only\nprocesses records still surfaces a real count. The FE passes its selected\nrange so the sidebar matches the active view. Sorted newest-active-first.","operationId":"getAgenticObservabilityAgents","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range start (ISO 8601); default last 24h","title":"From"},"description":"Time range start (ISO 8601); default last 24h"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range end (ISO 8601)","title":"To"},"description":"Time range end (ISO 8601)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ObservabilityAgentRollupItem"},"title":"Response Getagenticobservabilityagents"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/sessions":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Sessions","description":"Cursor-paginated sessions list.\n\nFilter precedence:\n  1. ``agent_id`` (Streamkap or external:pk:cid synthetic form)\n  2. ``project_key_id`` + ``client_id`` (external pseudo-agent)\n  3. No entity filter - all-tenant-activity pseudo-row.\n\nThe FE never sends both flavours - but if it does, ``agent_id`` wins.\n\n``kind`` and ``entity_kind`` are reserved-slot dispatch params: today only\n``kind=tool_call`` against ``entity_kind=streamkap|external`` returns data.\nOther valid combinations return an empty page until their backing tables /\nemitters land. Unknown values raise 400.","operationId":"getAgenticObservabilitySessions","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"agent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Streamkap agent id (Mongo ObjectId or external:pk:cid)","title":"Agent Id"},"description":"Streamkap agent id (Mongo ObjectId or external:pk:cid)"},{"name":"project_key_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"External pseudo-agent: project_key_id","title":"Project Key Id"},"description":"External pseudo-agent: project_key_id"},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"External pseudo-agent: client_id","title":"Client Id"},"description":"External pseudo-agent: client_id"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range start (ISO 8601)","title":"From"},"description":"Time range start (ISO 8601)"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range end (ISO 8601)","title":"To"},"description":"Time range end (ISO 8601)"},{"name":"tool","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tool name","title":"Tool"},"description":"Filter by tool name"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"success | error | denied","title":"Status"},"description":"success | error | denied"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor - last page's next_cursor","title":"Cursor"},"description":"Pagination cursor - last page's next_cursor"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Max items","default":50,"title":"Limit"},"description":"Max items"},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Row kind: tool_call (default) | log | llm_call | transcript_event | kb_ingestion","title":"Kind"},"description":"Row kind: tool_call (default) | log | llm_call | transcript_event | kb_ingestion"},{"name":"entity_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Entity scope: streamkap | external | kb","title":"Entity Kind"},"description":"Entity scope: streamkap | external | kb"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilitySessionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/sessions/{session_id}":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Session Spans","description":"All spans within one session, ordered by ``(timestamp, call_sequence)``.\n\nTenant + service scoping happens via the WHERE clause - there's no\nseparate pre-check because a session_id from another tenant or sibling\nservice simply returns 0 rows (empty list), which the FE treats the\nsame as \"session not found / expired\". No leak.","operationId":"getAgenticObservabilitySessionSpans","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ObservabilitySpan"},"title":"Response Getagenticobservabilitysessionspans"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/sessions/{session_id}/transcript":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Session Transcript","description":"Full transcript timeline for one session.\n\nReads ``streamkap_agent_transcript`` (the Flink-runtime transcript\nstream). A row is one chat call, tool call, or final output emission;\nthey share an ``iteration_id`` when they belong to the same input\nrecord's processing chain. Rows are returned oldest-first.\n\nTenant + service scoping enforced at the query layer — a session id\nthat belongs to another tenant or sibling service simply returns an\nempty ``rows`` list, identical to \"session not found / expired\".\nNo existence leak across tenants.","operationId":"getAgenticObservabilitySessionTranscript","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityTranscriptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/tools":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Tools","description":"Distinct ``tool_name`` values within the requested filter scope.\n\nPowers the FE TraceHeader tool-filter dropdown. Without this endpoint,\nthe FE has to derive available tools from spans the user has manually\nexpanded — most users never expanded enough sessions to see the filter\npopulate. Returns a flat sorted list capped server-side.\n\nSame filter precedence as ``/sessions`` (``agent_id`` wins; else\n``(project_key_id, client_id)``; else fleet-wide). Default range is the\nlast 24h, matching the rollup window.","operationId":"getAgenticObservabilityTools","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"agent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Streamkap agent id (Mongo ObjectId or external:pk:cid)","title":"Agent Id"},"description":"Streamkap agent id (Mongo ObjectId or external:pk:cid)"},{"name":"project_key_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"External pseudo-agent: project_key_id","title":"Project Key Id"},"description":"External pseudo-agent: project_key_id"},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"External pseudo-agent: client_id","title":"Client Id"},"description":"External pseudo-agent: client_id"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range start (ISO 8601)","title":"From"},"description":"Time range start (ISO 8601)"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range end (ISO 8601)","title":"To"},"description":"Time range end (ISO 8601)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityToolsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/external/verify":{"get":{"tags":["Agents Observability"],"summary":"Get Observability External Verify","description":"First call newer than ``since``, or ``{pending: true}`` if none.\n\n``since`` is REQUIRED - without it the query would match any historical\ncall from this PK+client and immediately mark verify as successful for\na returning user reconnecting. The FE sets ``since`` to the timestamp\nat which the user clicked into the verify step.","operationId":"getAgenticObservabilityExternalVerify","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"project_key_id","in":"query","required":true,"schema":{"type":"string","description":"Project key id (tenant-scoped)","title":"Project Key Id"},"description":"Project key id (tenant-scoped)"},{"name":"client_id","in":"query","required":true,"schema":{"type":"string","description":"API client id minted under the project key","title":"Client Id"},"description":"API client id minted under the project key"},{"name":"since","in":"query","required":true,"schema":{"type":"string","description":"ISO 8601 - only matches rows newer than this are reported","title":"Since"},"description":"ISO 8601 - only matches rows newer than this are reported"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ObservabilityVerifyHit"},{"$ref":"#/components/schemas/ObservabilityVerifyPending"}],"title":"Response Getagenticobservabilityexternalverify"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/iterations":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Iterations","description":"Per-iteration trace rollup, newest-first (reads ``agent_traces``).\n\nOne row per ``iteration_id`` — all operations of one input-record's\nprocessing chain. ``agent_traces`` is Streamkap-agent only (no external\npseudo-agents), so ``agent_id`` passes straight through with no entity\nresolution. Tenant scoping at the WHERE layer; a cross-tenant agent_id\nreturns an empty page, not a leak.","operationId":"getAgenticObservabilityIterations","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"agent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Streamkap agent id (Mongo ObjectId)","title":"Agent Id"},"description":"Streamkap agent id (Mongo ObjectId)"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range start (ISO 8601)","title":"From"},"description":"Time range start (ISO 8601)"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range end (ISO 8601)","title":"To"},"description":"Time range end (ISO 8601)"},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor — last page's next_cursor","title":"Cursor"},"description":"Pagination cursor — last page's next_cursor"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityIterationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/iterations/histogram":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Iterations Histogram","description":"Operation-volume histogram over the trace stream. Default range 24h.\n\nStatus-stacked bucket shape matches the MCP histogram so the FE reuses one\nrenderer; ``agent_traces`` has no ``denied`` status (always 0).","operationId":"getAgenticObservabilityIterationsHistogram","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"agent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Streamkap agent id (Mongo ObjectId)","title":"Agent Id"},"description":"Streamkap agent id (Mongo ObjectId)"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range start (ISO 8601)","title":"From"},"description":"Time range start (ISO 8601)"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range end (ISO 8601)","title":"To"},"description":"Time range end (ISO 8601)"},{"name":"buckets","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":30,"title":"Buckets"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityHistogramResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/iterations/{iteration_id}":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Iteration Detail","description":"Ordered operations for one trace iteration (reads ``agent_traces``).\n\nOrdered by ``timestamp`` then a chat → tool_call → output tiebreak\n(``sequence_number`` is not yet emitted). Tenant scoping makes a\ncross-tenant ``iteration_id`` return an empty list — same as \"not found\",\nno existence leak.","operationId":"getAgenticObservabilityIterationDetail","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"iteration_id","in":"path","required":true,"schema":{"type":"string","title":"Iteration Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityIterationDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/histogram":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Histogram","description":"Status-stacked call-rate histogram.\n\nSame filter shape as ``/sessions``. Default range is last 24h.","operationId":"getAgenticObservabilityHistogram","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"agent_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"}},{"name":"project_key_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Key Id"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range start (ISO 8601)","title":"From"},"description":"Time range start (ISO 8601)"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range end (ISO 8601)","title":"To"},"description":"Time range end (ISO 8601)"},{"name":"tool","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"buckets","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":30,"title":"Buckets"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Row kind dispatch — see /sessions for the enum","title":"Kind"},"description":"Row kind dispatch — see /sessions for the enum"},{"name":"entity_kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Entity scope dispatch — see /sessions for the enum","title":"Entity Kind"},"description":"Entity scope dispatch — see /sessions for the enum"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityHistogramResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/logs":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Logs","description":"Per-job log lines for one agent or KB.\n\nReplaces the namespace-scoped kubectl tail with a per-``job_name``\nClickHouse query. ``agent_id`` resolves to the prefix\n``agent_<id>_`` or ``kb_<id>_`` via the doc's ``job_type``; the\nprefix LIKE catches every redeploy version of the entity so log\nhistory survives re-deploys.\n\nReturns 404 when the id doesn't belong to this tenant + service (or\nthe doc's ``job_type`` isn't agent / KB). Returns 503 with a\nstructured ``kind`` when the ``flink_logs`` table is missing or\na column has drifted.","operationId":"getAgenticObservabilityLogs","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","description":"Agent or knowledge base id (Mongo ObjectId)","title":"Agent Id"},"description":"Agent or knowledge base id (Mongo ObjectId)"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range start (ISO 8601)","title":"From"},"description":"Time range start (ISO 8601)"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range end (ISO 8601)","title":"To"},"description":"Time range end (ISO 8601)"},{"name":"level","in":"query","required":false,"schema":{"type":"string","description":"Floor level — DEBUG | INFO | WARN | ERROR (used when `levels` is absent)","default":"INFO","title":"Level"},"description":"Floor level — DEBUG | INFO | WARN | ERROR (used when `levels` is absent)"},{"name":"levels","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Explicit comma-separated level set (e.g. 'WARN,ERROR'). Overrides the `level` floor when present.","title":"Levels"},"description":"Explicit comma-separated level set (e.g. 'WARN,ERROR'). Overrides the `level` floor when present."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Substring filter on the log column","title":"Search"},"description":"Substring filter on the log column"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"description":"Max lines per call","default":200,"title":"Limit"},"description":"Max lines per call"},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Live-tail cursor — only rows newer than this ISO 8601 ts","title":"Since"},"description":"Live-tail cursor — only rows newer than this ISO 8601 ts"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityLogsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/logs/histogram":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Logs Histogram","description":"Level-stacked log histogram for one agent or KB.\n\nSame scope rules as :func:`get_observability_logs` (404 on\ncross-scope id, 503 when the table isn't deployed). The histogram\nsurfaces all four levels regardless of the line viewer's current\nlevel filter — the user is meant to see the full level distribution\nso they can pick a filter floor.","operationId":"getAgenticObservabilityLogsHistogram","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","description":"Agent or knowledge base id","title":"Agent Id"},"description":"Agent or knowledge base id"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range start (ISO 8601)","title":"From"},"description":"Time range start (ISO 8601)"},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time range end (ISO 8601)","title":"To"},"description":"Time range end (ISO 8601)"},{"name":"buckets","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":30,"title":"Buckets"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityLogHistogramResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/agentic/observability/logs/exceptions":{"get":{"tags":["Agents Observability"],"summary":"Get Observability Logs Exceptions","description":"Recent Flink-side exceptions for the entity's current job.\n\nPulls from the Flink REST ``/jobs/{jid}/exceptions`` endpoint, not\nClickHouse — exceptions are JM state, not a log row stream.\nReturns ``exceptions=[]`` (NOT 404) when the entity has no live\nFlink job — a draft agent / KB and a recently-cancelled one are\nboth valid scopes with nothing to surface.","operationId":"getAgenticObservabilityLogsExceptions","security":[{"FronteggHTTPAuthentication":[]}],"parameters":[{"name":"agent_id","in":"query","required":true,"schema":{"type":"string","description":"Agent or knowledge base id","title":"Agent Id"},"description":"Agent or knowledge base id"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityFlinkExceptionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AccessToken":{"properties":{"expires":{"type":"string","title":"Expires"},"expiresIn":{"type":"integer","title":"Expiresin"},"accessToken":{"type":"string","title":"Accesstoken"},"refreshToken":{"type":"string","title":"Refreshtoken"}},"additionalProperties":true,"type":"object","required":["expires","expiresIn","accessToken","refreshToken"],"title":"AccessToken"},"ActiveSnapshotRes":{"properties":{"source_id":{"type":"string","title":"Source Id","description":"Source entity ID"},"source_name":{"type":"string","title":"Source Name","description":"Source display name"},"topic_count":{"type":"integer","title":"Topic Count","description":"Total number of topics in the snapshot","default":0},"completed_count":{"type":"integer","title":"Completed Count","description":"Number of topics that have completed snapshotting","default":0}},"additionalProperties":true,"type":"object","required":["source_id","source_name"],"title":"ActiveSnapshotRes","description":"A source with an active snapshot in progress."},"AdditionalCondition":{"properties":{"data_collection":{"type":"string","title":"Data Collection","description":"The data collection (e.g., table or collection name) to apply the filter to."},"filter":{"type":"string","title":"Filter","description":"The filter expression to apply to the data collection (e.g., createdAt > '2023-01-01')."}},"type":"object","required":["data_collection","filter"],"title":"AdditionalCondition","description":"Condition for restricting an incremental snapshot"},"AgentClusterOverviewResponse":{"properties":{"available":{"type":"boolean","title":"Available","description":"False when the tenant's Flink cluster is not provisioned or unreachable; other fields are zeroed.","default":true},"taskmanagers":{"type":"integer","title":"Taskmanagers","description":"Registered TaskManagers","default":0},"slotsTotal":{"type":"integer","title":"Slotstotal","description":"Total task slots across all TaskManagers","default":0},"slotsAvailable":{"type":"integer","title":"Slotsavailable","description":"Idle task slots available for new deployments","default":0},"flinkVersion":{"type":"string","title":"Flinkversion","description":"Flink runtime version","default":"unknown"}},"additionalProperties":true,"type":"object","title":"AgentClusterOverviewResponse","description":"Cluster-level Flink info powering the agentic dashboard header."},"AgentConfigHistoryDetailResponse":{"properties":{"version":{"type":"integer","minimum":0.0,"title":"Version"},"changedByEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changedbyemail"},"changedTimestamp":{"type":"string","format":"date-time","title":"Changedtimestamp"},"changeKind":{"type":"string","enum":["create","update","rollback"],"title":"Changekind"},"rollbackSourceVersion":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rollbacksourceversion"},"changeNote":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changenote"},"agentConfig":{"$ref":"#/components/schemas/CreateAgentConfigRequest","description":"Historical agent_config at this version, masked"}},"additionalProperties":true,"type":"object","required":["version","changedTimestamp","changeKind","agentConfig"],"title":"AgentConfigHistoryDetailResponse","description":"Response for ``GET /agents/{id}/config/history/{version}``.\n\nSame masking rules as ``AgentConfigResponse`` - partial ``sk-a****xyzw``\nfor ``apiKey`` / ``clientSecret``, full ``********`` for\n``bearerToken`` / ``headerValue`` / any ``headers`` dict value."},"AgentConfigHistoryItem":{"properties":{"version":{"type":"integer","minimum":0.0,"title":"Version"},"changedByEmail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Changedbyemail","description":"Admin's email in admin-app mode; tenant user's otherwise. ``None`` when the row predates author capture (legacy / migrated)."},"changedTimestamp":{"type":"string","format":"date-time","title":"Changedtimestamp"},"changeKind":{"type":"string","enum":["create","update","rollback"],"title":"Changekind"},"rollbackSourceVersion":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rollbacksourceversion","description":"For change_kind='rollback': the version whose config was copied. None otherwise."},"changeNote":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Changenote"},"summary":{"$ref":"#/components/schemas/AgentConfigHistorySummary"}},"additionalProperties":false,"type":"object","required":["version","changedTimestamp","changeKind"],"title":"AgentConfigHistoryItem","description":"One row in the ``GET /agents/{id}/config/history`` list response."},"AgentConfigHistoryListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AgentConfigHistoryItem"},"type":"array","title":"Items"},"total":{"type":"integer","minimum":0.0,"title":"Total","description":"Total rows for this agent (bounded by retention)"},"nextBeforeVersion":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Nextbeforeversion","description":"Cursor for the next page - pass as ``?before_version=…``. Null if no more rows."}},"additionalProperties":false,"type":"object","required":["total"],"title":"AgentConfigHistoryListResponse","description":"Response for ``GET /agents/{id}/config/history``."},"AgentConfigHistorySummary":{"properties":{"changedFields":{"items":{"type":"string"},"type":"array","title":"Changedfields","description":"Sorted depth-2 dotted paths that differ from the previous version"}},"additionalProperties":false,"type":"object","title":"AgentConfigHistorySummary","description":"Cheap diff preview stored on every history row at write time.\n\nThe list endpoint returns this without shipping the full config blobs.\n``changedFields`` is a sorted list of dotted paths at depth ≤ 2\n(e.g. ``[\"prompts.customInstructions\", \"tools\"]``). A deeper change\ninside ``tools[].config.headers`` collapses to ``\"tools\"``. The FE\ncomputes a full before/after diff from two ``GET /history/{version}``\ndetail reads when the user opens a specific version."},"AgentConfigResponse":{"properties":{"_id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"agent_config":{"$ref":"#/components/schemas/CreateAgentConfigRequest","description":"The full stored agentConfig"}},"additionalProperties":true,"type":"object","required":["_id","name","agent_config"],"title":"AgentConfigResponse","description":"Response for GET /agents/{id}/config - returns the stored agent config.\n\n``agent_config`` is a fully-typed ``CreateAgentConfigRequest`` rather than an\nopaque dict so OpenAPI emits the complete schema and TypeScript clients can\ndeserialize without guessing field names. Secret values (e.g. ``apiKey``)\ncome back masked (``sk-a****xyzw``), and every value inside any\n``mcpServer.headers`` / ``tool.config.headers`` dict comes back as\n``********`` - both satisfy the ``min_length=1`` constraint on the\nunderlying field.\n\nNote: stored configs must remain valid under the *current* validators -\nre-using ``CreateAgentConfigRequest`` re-runs all its validators\n(per-type tool invariants, length caps, etc.) on every read. If validators\ntighten over time, evolve stored configs via an explicit migration rather\nthan relying on response-time tolerance."},"AgentConnections":{"properties":{"llmConnections":{"items":{"$ref":"#/components/schemas/AgentLlmConnection"},"type":"array","title":"Llmconnections","description":"Saved LLM connections - credentials + default tuning. Reusable across many agents."},"mcpConnections":{"items":{"oneOf":[{"$ref":"#/components/schemas/StreamkapMcpConnection"},{"$ref":"#/components/schemas/ExternalMcpNoneConnection"},{"$ref":"#/components/schemas/ExternalMcpBearerConnection"},{"$ref":"#/components/schemas/ExternalMcpHeaderConnection"}]},"type":"array","title":"Mcpconnections","description":"Saved MCP connections (external-source only)"},"httpConnections":{"items":{"$ref":"#/components/schemas/AgentHttpConnection"},"type":"array","title":"Httpconnections","description":"Saved HTTP API connections. Referenced by HTTP tool rows via ``connectionId`` to inherit baseUrl + headers without duplicating them per tool."},"vectorStoreConnections":{"items":{"$ref":"#/components/schemas/AgentVectorStoreConnection"},"type":"array","title":"Vectorstoreconnections","description":"Lightweight vector store credentials (apiKey + endpoint). Used by KBs and agent long-term memory."}},"additionalProperties":false,"type":"object","title":"AgentConnections","description":"Tenant-scoped saved agent connections. Stored in MongoDB agent_connections collection.\n\nThe bulk shape behind ``GET /agents/connections`` and\n``PUT /agents/connections``: per-tenant lists of LLM, MCP, and HTTP\nconnection profiles that agents reference at deploy time.\n\nThe Mongo collection is ``agent_connections``; per-row CRUD lives at\n``/agents/connections/{kind}`` (see\n``app.services.agent_connections_service``)."},"AgentFlinkException":{"properties":{"timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp","description":"ISO8601 timestamp (Flink millis-since-epoch normalised)"},"exception":{"type":"string","title":"Exception","description":"Stack trace or exception text"},"task":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task","description":"Flink task name when available"}},"additionalProperties":false,"type":"object","required":["exception"],"title":"AgentFlinkException","description":"A single Flink job exception entry."},"AgentHttpConnection":{"properties":{"id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Id","description":"Server-generated UUID - stable across renames. Null on first create, BE assigns."},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"User-facing name; unique per tenant by FE convention (e.g. 'Stripe API')"},"baseUrl":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Baseurl","description":"Base URL prepended to a referencing tool's relative URL. Tools with an absolute URL ignore this. Optional - a connection can be header-only (e.g. shared auth across hosts)."},"headers":{"additionalProperties":{"type":"string"},"type":"object","maxProperties":32,"title":"Headers","description":"HTTP headers merged into every referencing tool's request. Values are KMS-encrypted at rest and full-masked on GET."},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Optional human-readable context for the connection"}},"additionalProperties":false,"type":"object","required":["name"],"title":"AgentHttpConnection","description":"A saved HTTP API connection. Reusable across multiple HTTP tools.\n\nSolves the duplication problem when several HTTP tools target the same\nupstream API (e.g. five tools hitting the Stripe API): instead of\npasting auth headers into every tool row, the customer saves one\nconnection here and references it from each tool by ``id``.\n\nIdentical encryption + masking guarantees as MCP saved connections.\nHeader values are KMS-wrapped at rest and full-mask on GET; the\nencrypt walker recurses into ``headers`` so we get this for free.\n\nThe ``baseUrl`` is prepended to a tool's relative ``url`` at deploy\ntime; if the tool ships an absolute URL, ``baseUrl`` is ignored\n(lets a tool override the connection's base for one-off endpoints)."},"AgentInputConfig":{"properties":{"topicPattern":{"type":"string","maxLength":1024,"minLength":1,"title":"Topicpattern","description":"Regex pattern for input topics, e.g. '^(orders)$'"},"inputSerialization":{"$ref":"#/components/schemas/AgentSerializationEnum","description":"Input deserialization format","default":"JsonConfluent"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields","description":"Column-level filter - only these fields sent to LLM"},"createTableSQL":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Createtablesql","description":"Flink SQL CREATE TABLE (required if filterSQL is set)"},"filterSQL":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Filtersql","description":"WHERE clause predicate for row-level filtering"}},"additionalProperties":false,"type":"object","required":["topicPattern"],"title":"AgentInputConfig","description":"Input configuration for the agent."},"AgentKnowledgeBaseRef":{"properties":{"id":{"type":"string","maxLength":64,"minLength":1,"title":"Id","description":"Knowledge base entity ID"},"name":{"type":"string","maxLength":200,"title":"Name","description":"Display name (denormalized for UI)","default":""}},"additionalProperties":false,"type":"object","required":["id"],"title":"AgentKnowledgeBaseRef","description":"Reference to a Knowledge Base that an agent can query at runtime for RAG.\n\nStored on the agent config. At deploy time, the BE resolves each ref to the\nKB's vector store + embedding credentials and injects them into the Flink\nagentConfig JSON."},"AgentLlmConfig":{"properties":{"provider":{"$ref":"#/components/schemas/AgentLlmProviderEnum","description":"LLM provider"},"model":{"type":"string","minLength":1,"title":"Model","description":"Model name, e.g. claude-sonnet-4-20250514"},"apiKey":{"type":"string","maxLength":512,"title":"Apikey","description":"API key - use '${SECRET:ENV_VAR_NAME}' for env var resolution. Empty when llmConnectionId is set.","default":""},"llmConnectionId":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Llmconnectionid","description":"Tenant-scoped reference to ``agent_connections.llmConnections[].id``. When set with an empty ``apiKey``, the BE resolves the real key server-side at deploy and at test-run."},"baseUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseurl","description":"Base URL for OpenAI-compatible proxies"},"temperature":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Temperature","description":"Sampling temperature (null = matrix-skipped)"},"maxTokens":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":1.0},{"type":"null"}],"title":"Maxtokens","description":"Max output tokens (null = matrix-skipped)"},"timeout":{"anyOf":[{"type":"integer","maximum":600.0,"minimum":1.0},{"type":"null"}],"title":"Timeout","description":"Request timeout in seconds (null = matrix-skipped)"},"reasoningEffort":{"anyOf":[{"type":"string","enum":["none","minimal","low","medium","high","xhigh"]},{"type":"null"}],"title":"Reasoningeffort","description":"OpenAI / GPT-5 reasoning effort. The accepted set is per-model: the matrix in app/utils/llm_capabilities.py rejects values not in caps.reasoning_effort_values for the chosen provider+model."},"thinkingBudgetTokens":{"anyOf":[{"type":"integer","maximum":64000.0,"minimum":0.0},{"type":"null"}],"title":"Thinkingbudgettokens","description":"Anthropic Claude 4 extended-thinking budget (tokens). Non-null enables thinking."},"ollamaThink":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ollamathink","description":"Ollama 'think' toggle for reasoning models"},"maxRetries":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Maxretries","description":"Universal — max retry attempts on LLM call. Accepted by every provider."},"region":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Region","description":"Bedrock: AWS region (e.g. us-east-1). Ignored for non-bedrock providers."},"strict":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Strict","description":"openai-responses: enable JSON-schema strict mode."},"store":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Store","description":"openai-responses: server-side response storage flag."},"instructions":{"anyOf":[{"type":"string","maxLength":8192},{"type":"null"}],"title":"Instructions","description":"openai-responses: system-level instructions passed as a top-level Responses param."},"additionalKwargs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Additionalkwargs","description":"openai-responses / azure-openai: free-form extra request params forwarded verbatim by the runtime."},"apiVersion":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Apiversion","description":"azure-openai: Azure OpenAI API version (e.g. '2024-02-01'). Required for azure-openai."},"azureEndpoint":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Azureendpoint","description":"azure-openai: Azure resource endpoint (e.g. https://<resource>.openai.azure.com). Required."},"azureUrlPathMode":{"anyOf":[{"type":"string","enum":["AUTO","LEGACY","UNIFIED"]},{"type":"null"}],"title":"Azureurlpathmode","description":"azure-openai: URL path resolution — AUTO / LEGACY / UNIFIED. Optional."}},"additionalProperties":false,"type":"object","required":["provider","model"],"title":"AgentLlmConfig","description":"Inline LLM configuration embedded on the agent.\n\nCarries provider, credentials, model, and tuning controls as a single\nblob. The FE prefills the form from a saved :class:`AgentLlmConnection`\n(which now carries default model + tuning + reasoning controls) and\nthe user can override per-agent before save; the resulting blob is\nstored verbatim and shipped to the Flink runtime at deploy.\n\nTwo credential shapes (XOR, mirrors :class:`ValidateLlmRequest`):\n\n1. **Inline** - ``apiKey`` is filled directly. The BE KMS-encrypts it\n   at save and decrypts it at deploy / test-run.\n2. **Linked** - ``llmConnectionId`` references a row in\n   ``agent_connections.llmConnections`` and ``apiKey`` is left empty.\n   The BE resolves the real key server-side at deploy and at test-run\n   via :func:`agents_service.resolve_saved_llm_credentials`, so the\n   browser never needs to hold (or re-paste) the stored plaintext when\n   editing an existing agent.\n\n``provider == ollama`` accepts an empty key without a link (the\nruntime is local and unauthenticated)."},"AgentLlmConnection":{"properties":{"id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Id","description":"Server-generated UUID — stable across renames. Null on first create, BE assigns."},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"User-facing name; unique per tenant by FE convention"},"provider":{"$ref":"#/components/schemas/AgentLlmProviderEnum","description":"LLM provider"},"apiKey":{"type":"string","maxLength":512,"title":"Apikey","description":"API key — KMS-wrapped at rest, masked on GET","default":""},"baseUrl":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Baseurl","description":"Base URL for Ollama / Azure / self-deployed OpenAI- or Anthropic-compatible servers (vLLM, LocalAI, TGI, LM Studio, LiteLLM gateways)"},"capabilities":{"items":{"$ref":"#/components/schemas/ConnectionCapability"},"type":"array","minItems":1,"title":"Capabilities","description":"Non-empty list of capabilities this connection powers. Each entry must be allowed by the provider per ``PROVIDER_CAPABILITIES``, and each listed capability must have its defaults block populated."},"chat":{"anyOf":[{"$ref":"#/components/schemas/ChatDefaults"},{"type":"null"}],"description":"Chat-capability defaults. Required iff ``'chat' in capabilities``."},"embedding":{"anyOf":[{"$ref":"#/components/schemas/EmbeddingDefaults"},{"type":"null"}],"description":"Embedding-capability defaults. Required iff ``'embedding' in capabilities``."},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Optional human-readable context for the connection"}},"additionalProperties":false,"type":"object","required":["name","provider","capabilities"],"title":"AgentLlmConnection","description":"Credentials + per-capability default tuning for a saved LLM connection.\n\nOne row per (provider, baseUrl) carries a single credential bundle plus\na non-empty ``capabilities`` set declaring which jobs the connection\npowers — ``chat`` for agents, ``embedding`` for knowledge bases, or\nboth when the provider supports both. Defaults blocks (``chat`` /\n``embedding``) are populated for the capabilities the row covers and\n``None`` for the ones it doesn't.\n\n``apiKey`` defaults to ``\"\"`` so users can save a row creds-empty and\ntest later; the same goes for each defaults block's ``model``. Ollama\nruns auth-less so its rows can legitimately stay apiKey-empty."},"AgentLlmProviderEnum":{"type":"string","enum":["anthropic","openai","openai-responses","ollama","azure","azure-openai","bedrock","qwen","openai-compatible"],"title":"AgentLlmProviderEnum","description":"Unified LLM provider enum.\n\nA single ``AgentLlmConnection`` row carries one provider and a set of\ncapabilities (chat / embedding). ``PROVIDER_CAPABILITIES`` below pins\nwhich capabilities each provider can serve — picked by the FE Connections\ndrawer and re-validated server-side on every write."},"AgentLogLine":{"properties":{"timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timestamp","description":"Line timestamp as emitted by the Flink logger"},"level":{"type":"string","title":"Level","description":"Log level — DEBUG, INFO, WARN, ERROR","default":"INFO"},"message":{"type":"string","title":"Message","description":"Log message body"}},"additionalProperties":false,"type":"object","required":["message"],"title":"AgentLogLine","description":"A single ``[AGENT]``-prefixed Flink TaskManager log line."},"AgentLogsResponse":{"properties":{"lines":{"items":{"$ref":"#/components/schemas/AgentLogLine"},"type":"array","title":"Lines"},"flinkExceptions":{"items":{"$ref":"#/components/schemas/AgentFlinkException"},"type":"array","title":"Flinkexceptions"},"scope":{"type":"string","enum":["namespace","agent"],"title":"Scope","description":"Per-line scoping of returned lines. ``namespace`` means lines may include [AGENT] entries from other agents sharing a TaskManager (current limitation). ``agent`` will be returned once the Java runtime emits per-line agent IDs.","default":"namespace"}},"additionalProperties":false,"type":"object","title":"AgentLogsResponse","description":"Combined response for ``GET /agents/{id}/logs``.\n\n``lines`` are tailed and parsed agent log lines from the Flink TaskManager\npods in the tenant's namespace; see :class:`FlinkClusterClient.get_taskmanager_logs`\nfor per-line scoping caveats. ``flink_exceptions`` are pulled from the\nFlink REST ``/jobs/{jid}/exceptions`` endpoint when the job is live."},"AgentLongTermMemoryConfig":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Enable long-term memory","default":false},"vectorStoreConnectionId":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Vectorstoreconnectionid","description":"Reference to a saved AgentVectorStoreConnection. Resolved at deploy time."},"namespace":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Namespace","description":"Per-agent namespace override (falls back to connection's defaultNamespace)"},"destinationId":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Destinationid","description":"(Legacy) ObjectId of a Pinecone destination connector. Prefer vectorStoreConnectionId."}},"additionalProperties":false,"type":"object","title":"AgentLongTermMemoryConfig","description":"Long-term (vector store) memory config.\n\nReferences a saved ``AgentVectorStoreConnection`` by id. At deploy time\nthe resolver reads the connection's ``apiKey`` + ``endpoint`` and composes\nthe inline ``vectorStore`` block the Java runtime expects.\n\nLegacy agents may still carry ``destinationId`` (a Pinecone destination\nconnector from the old flow). The deploy resolver handles both: if\n``vectorStoreConnectionId`` is set it wins; otherwise it falls back to\nthe legacy ``destinationId`` path. New agents created through the FE\nalways use ``vectorStoreConnectionId``."},"AgentMcpServerConfig":{"properties":{"projectKeyId":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Projectkeyid","description":"ID of an agentic-enabled Project Key. When set, deploy-time resolves the Streamkap MCP serverUrl + auth header from the PK row. Mutually exclusive with serverUrl - one or the other, never both."},"serverUrl":{"anyOf":[{"type":"string","maxLength":2048,"minLength":1},{"type":"null"}],"title":"Serverurl","description":"External MCP server URL. Required when projectKeyId is unset. Server-stamped from the PK row when projectKeyId is set."},"headers":{"additionalProperties":{"type":"string"},"type":"object","maxProperties":32,"title":"Headers","description":"Auth headers for MCP server"}},"additionalProperties":false,"type":"object","title":"AgentMcpServerConfig","description":"Top-level MCP server config shared across all MCP tools.\n\nTwo shapes (hard cutover):\n\n- **Streamkap MCP** (internal toolbelt): ``projectKeyId`` set, ``serverUrl``\n  and ``headers`` resolved server-side at deploy time from the agentic-enabled\n  Project Key. The legacy \"saved Streamkap MCP card\" path (match-by-serverUrl\n  against ``agent_connections.mcpConnections[source==streamkap]``) is gone.\n- **External MCP**: ``serverUrl`` + ``headers`` set inline; ``projectKeyId``\n  omitted. Headers are still composed at deploy time from the matching\n  saved external connection (bearer / custom-header)."},"AgentMemoryConfig":{"properties":{"keyField":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Keyfield","description":"Field to partition memory by (e.g. 'customer_id'). Default: topic key"},"shortTerm":{"$ref":"#/components/schemas/AgentShortTermMemoryConfig","description":"Short-term conversation memory"},"longTerm":{"$ref":"#/components/schemas/AgentLongTermMemoryConfig","description":"Long-term vector store memory"}},"additionalProperties":false,"type":"object","title":"AgentMemoryConfig","description":"Memory configuration for the agent."},"AgentOutputConfig":{"properties":{"topic":{"type":"string","maxLength":249,"minLength":1,"title":"Topic","description":"Fixed output topic name"},"deadLetterTopic":{"anyOf":[{"type":"string","maxLength":249},{"type":"null"}],"title":"Deadlettertopic","description":"DLQ topic name"},"outputSerialization":{"$ref":"#/components/schemas/AgentSerializationEnum","description":"Output serialization format","default":"JsonConfluent"},"schema":{"additionalProperties":{"$ref":"#/components/schemas/AgentOutputSchemaTypeEnum"},"type":"object","title":"Schema","description":"Output schema: {field_name: TYPE_STRING}"}},"additionalProperties":false,"type":"object","required":["topic"],"title":"AgentOutputConfig","description":"Output configuration for the agent."},"AgentOutputSchemaTypeEnum":{"type":"string","enum":["STRING","DOUBLE","INT32","INT64","BOOLEAN"],"title":"AgentOutputSchemaTypeEnum"},"AgentProcessingConfig":{"properties":{"parallelism":{"type":"integer","maximum":128.0,"minimum":1.0,"title":"Parallelism","description":"Parallelism","default":1},"checkpointIntervalMin":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Checkpointintervalmin","description":"Checkpoint interval in minutes","default":5},"maxIterations":{"type":"integer","maximum":25.0,"minimum":1.0,"title":"Maxiterations","description":"Max tool-call iterations per record (react type only)","default":10},"maxTokensPerHour":{"type":"integer","minimum":0.0,"title":"Maxtokensperhour","description":"Per-TaskManager rolling-hour token budget. 0 = unlimited. When exceeded, records pass through with a `_budget_exceeded: true` marker.","default":0}},"additionalProperties":false,"type":"object","title":"AgentProcessingConfig","description":"Processing configuration for the agent."},"AgentPromptConfig":{"properties":{"system":{"type":"string","maxLength":8000,"title":"System","description":"Assembled system prompt (auto-generated by backend)","default":""},"customInstructions":{"type":"string","maxLength":8000,"title":"Custominstructions","description":"User-provided instructions appended to the auto-generated prompt","default":""},"user":{"type":"string","maxLength":2000,"title":"User","description":"User prompt template - {input_json} is replaced with the input record","default":"<record>{input_json}</record>"}},"additionalProperties":false,"type":"object","title":"AgentPromptConfig","description":"Prompt configuration for the agent.\n\nThe final system prompt is auto-assembled by ``build_system_prompt()`` from the\nagent type template + output schema + tool descriptions + custom_instructions.\nThe ``system`` field stores the assembled result (set by the backend, not the user)."},"AgentSerializationEnum":{"type":"string","enum":["JsonConfluent","AvroConfluent"],"title":"AgentSerializationEnum"},"AgentShortTermMemoryConfig":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Enable short-term memory","default":false},"ttlMs":{"type":"integer","minimum":0.0,"title":"Ttlms","description":"Time-to-live in milliseconds (default: 1 hour)","default":3600000},"maxEntries":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Maxentries","description":"Max conversation entries per key","default":20}},"additionalProperties":false,"type":"object","title":"AgentShortTermMemoryConfig","description":"Short-term (conversation) memory config."},"AgentToolConfig":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Tool name (must be unique)"},"type":{"$ref":"#/components/schemas/AgentToolTypeEnum","description":"Tool type: http, transform, or mcp"},"description":{"type":"string","maxLength":2000,"title":"Description","description":"Tool description for the LLM","default":""},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Type-specific configuration"},"parameters":{"items":{"$ref":"#/components/schemas/AgentToolParameterConfig"},"type":"array","title":"Parameters","description":"Tool parameters the LLM can provide"}},"additionalProperties":false,"type":"object","required":["name","type"],"title":"AgentToolConfig","description":"A single tool definition in the agent config.\n\n``name`` and ``description`` are concatenated into the assembled system\nprompt by ``build_system_prompt()`` and shipped to Flink as part of the\n``--agentConfig`` CLI argument. Length caps here keep the worst-case\nserialized agentConfig within the Flink CLI ~64KB single-arg budget even\nwith many tools configured."},"AgentToolParameterConfig":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Parameter name"},"type":{"type":"string","maxLength":50,"title":"Type","description":"Parameter type (string, number, boolean)","default":"string"},"description":{"type":"string","maxLength":2000,"title":"Description","description":"Parameter description for the LLM","default":""}},"additionalProperties":false,"type":"object","required":["name"],"title":"AgentToolParameterConfig","description":"A single parameter for a tool."},"AgentToolTypeEnum":{"type":"string","enum":["http","transform","mcp"],"title":"AgentToolTypeEnum"},"AgentTypeEnum":{"type":"string","enum":["workflow","react"],"title":"AgentTypeEnum"},"AgentVectorStoreConnection":{"properties":{"id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Id","description":"Server-generated UUID. Null on first create, BE assigns."},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"User-facing name"},"provider":{"$ref":"#/components/schemas/VectorStoreProviderEnum","description":"Vector store provider"},"apiKey":{"type":"string","maxLength":512,"title":"Apikey","description":"Pinecone API key — KMS-wrapped at rest, masked on GET","default":""},"endpoint":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Endpoint","description":"Pinecone index host URL"},"defaultNamespace":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Defaultnamespace","description":"Default namespace / collection (overridable per KB or agent)"},"allowHashFallback":{"type":"boolean","title":"Allowhashfallback","description":"Opt in to the non-semantic hash-embedding fallback when the vector index lacks integrated inference. Default False = fail-hard (throws instead of silently degrading recall).","default":false},"jdbcUrl":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Jdbcurl","description":"pgvector: `jdbc:postgresql://host:port/db`. Never embed userinfo here; put credentials in `username` / `password`."},"username":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Username","description":"pgvector username. Supports `${SECRET:...}` template."},"password":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Password","description":"pgvector password. Supports `${SECRET:...}` template."},"table":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Table","description":"pgvector table name used as the vector collection."},"dims":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Dims","description":"pgvector: embedding output dimensions. `0`/unset inherits from the embedding model. Must match the embedding model's output."},"metric":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Metric","description":"pgvector distance metric. Only `cosine` is currently supported."},"properties":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Properties","description":"Free-form `Map<String, Object>` for pass-through providers. Copied straight into the framework's `ResourceDescriptor.addInitialArgument` pairs at deploy time. Framework validates required keys at open-time. Not used for `pinecone` or `pgvector` (they have named typed fields)."},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Optional human-readable context"}},"additionalProperties":false,"type":"object","required":["name","provider"],"title":"AgentVectorStoreConnection","description":"Lightweight saved vector store connection — credentials + endpoint info.\n\nTwo provider shapes are supported (integration guide §3b.4):\n\n- ``pinecone`` — ``apiKey`` + ``endpoint`` (index host).\n- ``pgvector`` — ``jdbcUrl`` + ``username`` + ``password`` + ``table``,\n  plus optional ``dims`` and ``metric``.\n\nPer-provider required fields are enforced by ``_validate_provider_shape``;\nfields for the other provider stay ``None`` on GET."},"Body_deployAgentJarJob":{"properties":{"jar_file":{"type":"string","contentMediaType":"application/octet-stream","title":"Jar File"}},"type":"object","required":["jar_file"],"title":"Body_deployAgentJarJob"},"Body_deployAgentPyFlinkJob":{"properties":{"python_file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"Python File"}},"type":"object","title":"Body_deployAgentPyFlinkJob"},"Body_deployFlinkJarJob":{"properties":{"jar_file":{"type":"string","contentMediaType":"application/octet-stream","title":"Jar File"}},"type":"object","required":["jar_file"],"title":"Body_deployFlinkJarJob"},"Body_deployFlinkPyFlinkJob":{"properties":{"python_file":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"Python File"}},"type":"object","title":"Body_deployFlinkPyFlinkJob"},"Body_getAccessToken":{"properties":{"client_id":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Client Id"},"secret":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Secret"},"project_key":{"anyOf":[{"type":"string","maxLength":8192},{"type":"null"}],"title":"Project Key"}},"type":"object","title":"Body_getAccessToken"},"Body_refreshAccessToken":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"Body_refreshAccessToken"},"BriefDestinationConnector":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"User-defined connector name"},"connector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector","description":"Connector type (e.g., 'snowflake', 'bigquery')"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier"}},"additionalProperties":true,"type":"object","title":"BriefDestinationConnector","description":"Brief destination connector summary for list views."},"BriefSourceConnector":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"User-defined connector name"},"connector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector","description":"Connector type (e.g., 'postgresql', 'mysql')"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier"}},"additionalProperties":true,"type":"object","title":"BriefSourceConnector","description":"Brief source connector summary for list views."},"BriefTransform":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"connector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"}},"additionalProperties":true,"type":"object","title":"BriefTransform","description":"Basic transform details."},"BrokenConnectorRes":{"properties":{"id":{"type":"string","title":"Id","description":"Connector entity ID"},"name":{"type":"string","title":"Name","description":"Connector display name"},"type":{"type":"string","title":"Type","description":"Connector type: 'source' or 'destination'"}},"additionalProperties":true,"type":"object","required":["id","name","type"],"title":"BrokenConnectorRes","description":"A connector that is in a broken/failed state."},"BulkActionReq":{"properties":{"ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ids","description":"List of entity IDs to perform the action on. Omit if using select_all=true."},"select_all":{"type":"boolean","title":"Select All","description":"If true, select all entities matching the filters","default":false},"filters":{"anyOf":[{"$ref":"#/components/schemas/BulkSelectionFilter"},{"type":"null"}],"description":"Optional filters when select_all=true"}},"additionalProperties":true,"type":"object","title":"BulkActionReq","description":"Request model for bulk state-change operations (stop, resume, reset, snapshot)."},"BulkCloneItem":{"properties":{"id":{"type":"string","title":"Id","description":"ID of the entity to clone"},"name":{"type":"string","title":"Name","description":"Name for the cloned entity"}},"additionalProperties":true,"type":"object","required":["id","name"],"title":"BulkCloneItem","description":"Single item for bulk clone operation."},"BulkCloneReq":{"properties":{"items":{"anyOf":[{"items":{"$ref":"#/components/schemas/BulkCloneItem"},"type":"array"},{"type":"null"}],"title":"Items","description":"List of entities to clone with their new names. Omit if using select_all=true."},"select_all":{"type":"boolean","title":"Select All","description":"If true, select all entities matching the filters","default":false},"filters":{"anyOf":[{"$ref":"#/components/schemas/BulkSelectionFilter"},{"type":"null"}],"description":"Optional filters when select_all=true"},"name_suffix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Suffix","description":"Suffix to append to original names when using select_all. Default: ' (Copy)'","default":" (Copy)"}},"additionalProperties":true,"type":"object","title":"BulkCloneReq","description":"Request model for bulk clone operations.\n\nSupports two modes:\n1. Explicit items: Provide list of items with id and name for each clone\n2. Select all: Set select_all=true with optional filters and name_suffix"},"BulkDeleteReq":{"properties":{"ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ids","description":"List of entity IDs to delete. Omit if using select_all=true."},"select_all":{"type":"boolean","title":"Select All","description":"If true, select all entities matching the filters","default":false},"filters":{"anyOf":[{"$ref":"#/components/schemas/BulkSelectionFilter"},{"type":"null"}],"description":"Optional filters when select_all=true"}},"additionalProperties":true,"type":"object","title":"BulkDeleteReq","description":"Request model for bulk delete operations."},"BulkOperationRes":{"properties":{"results":{"items":{"$ref":"#/components/schemas/BulkOperationResult"},"type":"array","title":"Results","description":"Detailed results for each entity"},"summary":{"$ref":"#/components/schemas/BulkOperationSummary","description":"Summary statistics"}},"additionalProperties":true,"type":"object","required":["results","summary"],"title":"BulkOperationRes","description":"Response model for bulk operations."},"BulkOperationResult":{"properties":{"id":{"type":"string","title":"Id","description":"Entity ID"},"success":{"type":"boolean","title":"Success","description":"Whether the operation succeeded"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Success message or error details"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Optional data returned by the operation"}},"additionalProperties":true,"type":"object","required":["id","success"],"title":"BulkOperationResult","description":"Result for a single entity in a bulk operation."},"BulkOperationSummary":{"properties":{"total":{"type":"integer","title":"Total","description":"Total number of entities processed"},"succeeded":{"type":"integer","title":"Succeeded","description":"Number of successful operations"},"failed":{"type":"integer","title":"Failed","description":"Number of failed operations"}},"additionalProperties":true,"type":"object","required":["total","succeeded","failed"],"title":"BulkOperationSummary","description":"Summary statistics for a bulk operation."},"BulkSelectionFilter":{"properties":{"source_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Id","description":"Filter by source ID (for pipelines/destinations)"},"destination_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Destination Id","description":"Filter by destination ID (for pipelines/destinations)"}},"additionalProperties":true,"type":"object","title":"BulkSelectionFilter","description":"Optional filters for bulk operations when using 'select_all'.\n\nSupports filtering by source_id and destination_id for pipeline-related operations."},"BulkSnapshotReq":{"properties":{"ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ids","description":"List of entity IDs to perform the action on. Omit if using select_all=true."},"select_all":{"type":"boolean","title":"Select All","description":"If true, select all entities matching the filters","default":false},"filters":{"anyOf":[{"$ref":"#/components/schemas/BulkSelectionFilter"},{"type":"null"}],"description":"Optional filters when select_all=true"},"snapshot_type":{"type":"string","enum":["incremental","blocking"],"title":"Snapshot Type","description":"Type of snapshot to execute. 'incremental' (default) uses watermarking while streaming continues. 'blocking' pauses streaming during snapshot - required for keyless tables.","default":"incremental"}},"additionalProperties":true,"type":"object","title":"BulkSnapshotReq","description":"Request model for bulk snapshot operations with configurable snapshot type."},"BulkTopicSnapshotReq":{"properties":{"topic_ids":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Topic Ids","description":"List of topic DB IDs (_id) to operate on."},"snapshot_type":{"type":"string","enum":["incremental","blocking"],"title":"Snapshot Type","description":"Type of snapshot to execute. 'incremental' (default) uses watermarking while streaming continues. 'blocking' pauses streaming during snapshot - required for keyless tables.","default":"incremental"}},"additionalProperties":true,"type":"object","required":["topic_ids"],"title":"BulkTopicSnapshotReq","description":"Request model for bulk snapshot operations at the topic level.\n\nAccepts topic DB IDs, groups them by their source connector, and triggers\nper-source snapshots with the selected topics only."},"BulkTopicStopSnapshotReq":{"properties":{"topic_ids":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Topic Ids","description":"List of topic DB IDs (_id) to operate on."}},"additionalProperties":true,"type":"object","required":["topic_ids"],"title":"BulkTopicStopSnapshotReq","description":"Request model for bulk stop-snapshot operations at the topic level.\n\nAccepts topic DB IDs to identify the source connectors whose snapshots should be stopped.\nBecause a snapshot runs at the source level, stopping affects all topics for that source,\nnot just the selected ones."},"BulkUpdateEntityReq":{"properties":{"ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ids","description":"List of entity IDs to update"},"select_all":{"type":"boolean","title":"Select All","description":"If true, select all entities matching the filters","default":false},"filters":{"anyOf":[{"$ref":"#/components/schemas/BulkSelectionFilter"},{"type":"null"}],"description":"Optional filters when using select_all"},"payload":{"$ref":"#/components/schemas/BulkUpdatePayload"}},"additionalProperties":true,"type":"object","required":["payload"],"title":"BulkUpdateEntityReq","description":"Generic bulk update request for tags on any entity type.\n\nSupports two modes:\n1. Explicit IDs: Pass a list of entity IDs to update\n2. Select all: Set select_all=true with optional filters"},"BulkUpdatePayload":{"properties":{"tags":{"items":{"type":"string"},"type":"array","title":"Tags"}},"additionalProperties":true,"type":"object","required":["tags"],"title":"BulkUpdatePayload","description":"Payload for bulk tag updates across entity types."},"BulkUpdatePipelineReq":{"properties":{"ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Ids","description":"List of pipeline IDs to update"},"select_all":{"type":"boolean","title":"Select All","description":"If true, select all pipelines matching the filters","default":false},"filters":{"anyOf":[{"$ref":"#/components/schemas/BulkSelectionFilter"},{"type":"null"}],"description":"Optional filters when using select_all"},"payload":{"$ref":"#/components/schemas/BulkUpdatePayload"}},"additionalProperties":true,"type":"object","required":["payload"],"title":"BulkUpdatePipelineReq","description":"Bulk update pipeline request.\n\nSupports two modes:\n1. Explicit IDs: Pass a list of pipeline IDs to update\n2. Select all: Set select_all=true with optional filters"},"CallerIdentity":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"service_id":{"type":"string","title":"Service Id"},"sub":{"type":"string","title":"Sub"},"project_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Key Id"},"token_type":{"type":"string","title":"Token Type"}},"additionalProperties":true,"type":"object","required":["tenant_id","service_id","sub","token_type"],"title":"CallerIdentity","description":"Verified caller identity returned by GET /auth/whoami."},"ChatDefaults":{"properties":{"model":{"type":"string","maxLength":200,"title":"Model","description":"Default chat model, e.g. claude-sonnet-4-20250514. Empty = fill at agent creation.","default":""},"temperature":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Temperature","description":"Default sampling temperature (null = matrix-skipped)","default":0.1},"maxTokens":{"anyOf":[{"type":"integer","maximum":100000.0,"minimum":1.0},{"type":"null"}],"title":"Maxtokens","description":"Default max output tokens (null = matrix-skipped)","default":1024},"timeout":{"anyOf":[{"type":"integer","maximum":600.0,"minimum":1.0},{"type":"null"}],"title":"Timeout","description":"Default request timeout (seconds, null = matrix-skipped)","default":120},"reasoningEffort":{"anyOf":[{"type":"string","enum":["none","minimal","low","medium","high","xhigh"]},{"type":"null"}],"title":"Reasoningeffort","description":"Default reasoning effort. Accepted set is per-model — the matrix in ``app/utils/llm_capabilities.py`` rejects values not in ``caps.reasoning_effort_values`` for the picked (provider, model)."},"thinkingBudgetTokens":{"anyOf":[{"type":"integer","maximum":64000.0,"minimum":0.0},{"type":"null"}],"title":"Thinkingbudgettokens","description":"Default Anthropic Claude 4 extended-thinking budget (tokens). Non-null enables thinking."},"ollamaThink":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ollamathink","description":"Default Ollama 'think' toggle for reasoning models"},"maxRetries":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Maxretries","description":"Universal — max retry attempts on LLM call. Accepted by every provider."},"region":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Region","description":"Bedrock chat: AWS region (e.g. us-east-1). Ignored for non-bedrock providers."},"strict":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Strict","description":"openai-responses: enable JSON-schema strict mode. Ignored for other providers."},"store":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Store","description":"openai-responses: server-side response storage flag. Ignored for other providers."},"instructions":{"anyOf":[{"type":"string","maxLength":8192},{"type":"null"}],"title":"Instructions","description":"openai-responses: system-level instructions passed as a top-level Responses param."},"additionalKwargs":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Additionalkwargs","description":"openai-responses / azure-openai: free-form extra request params forwarded verbatim by the runtime. Use for provider-specific fields not modelled above."},"apiVersion":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Apiversion","description":"azure-openai: Azure OpenAI API version (e.g. '2024-02-01'). Required for azure-openai."},"azureEndpoint":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Azureendpoint","description":"azure-openai: Azure resource endpoint (e.g. https://<resource>.openai.azure.com). Required."},"azureUrlPathMode":{"anyOf":[{"type":"string","enum":["AUTO","LEGACY","UNIFIED"]},{"type":"null"}],"title":"Azureurlpathmode","description":"azure-openai: URL path resolution — AUTO / LEGACY / UNIFIED. Optional."}},"additionalProperties":false,"type":"object","title":"ChatDefaults","description":"Default tuning for the ``chat`` capability of a saved LLM connection.\n\nCarries the same shape as ``AgentLlmConfig`` (the inline per-agent\nblob): model + sampling controls + reasoning controls. The wizard\nprefills these into ``agentConfig.llm`` and the user can override\nper-agent. ``None`` on any optional field means \"use the matrix\ndefault at the picked model\" so reasoning-only OpenAI models with no\ntemperature don't 422 on save."},"CleanupPolicyEnum":{"type":"string","enum":["delete","compact","delete,compact"],"title":"CleanupPolicyEnum"},"ClientCredential":{"properties":{"created_by_user":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"client_id":{"type":"string","title":"Client Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"roles":{"items":{"$ref":"#/components/schemas/Role"},"type":"array","title":"Roles"},"service_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Id"},"secret":{"type":"string","title":"Secret"}},"type":"object","required":["created_by_user","client_id","roles","service_id","secret"],"title":"ClientCredential"},"ClientCredentialCreateReq":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"service_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Id"},"role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Role Ids"},"permission_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Permission Ids"}},"additionalProperties":true,"type":"object","title":"ClientCredentialCreateReq"},"ClientCredentialUpdateReq":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Role Ids"},"permission_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Permission Ids"}},"additionalProperties":true,"type":"object","title":"ClientCredentialUpdateReq"},"CloneTransformReq":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"additionalProperties":true,"type":"object","title":"CloneTransformReq"},"ClusterStatusResponse":{"properties":{"current_tier":{"type":"string","title":"Current Tier","description":"Currently active tier name (matched from K8s StatefulSet specs)."},"kafka_memory":{"type":"string","title":"Kafka Memory"},"kafka_connect_memory":{"type":"string","title":"Kafka Connect Memory"},"kafka_connect_replicas":{"type":"integer","title":"Kafka Connect Replicas"},"kafka_connect_statefulsets":{"items":{"$ref":"#/components/schemas/KafkaConnectStatefulSetStatus"},"type":"array","title":"Kafka Connect Statefulsets","description":"Per-StatefulSet live specs. One entry for single-KC tenants; multiple for KC-0 + KC-1 + ... tenants."},"tiers":{"items":{"$ref":"#/components/schemas/TierSpec"},"type":"array","title":"Tiers","description":"Every tier defined in the cluster_config, ordered ascending by 'order'."},"active_operation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Operation Id","description":"Operation ID if a scaling operation is in progress"},"scaling_available":{"type":"boolean","title":"Scaling Available","description":"Whether scale operations are possible (a cluster_configs record exists). False for BYOC services rendered from live K8s state only.","default":true},"live_node_groups":{"items":{"$ref":"#/components/schemas/TierNodeGroup"},"type":"array","title":"Live Node Groups","description":"Node groups read live from EKS/EC2 (with EBS volumes attached to the Kafka NG). Populated only on the config-less path, where no tier catalog exists."}},"additionalProperties":true,"type":"object","required":["current_tier","kafka_memory","kafka_connect_memory","kafka_connect_replicas"],"title":"ClusterStatusResponse"},"ConnectionCapability":{"type":"string","enum":["chat","embedding"],"title":"ConnectionCapability","description":"What a saved LLM connection can power.\n\n``chat`` covers agent runtime + system-prompt suggestion + test-run.\n``embedding`` covers knowledge-base embedding generation.\n\nA single connection can carry both when the provider supports both\n(OpenAI / Azure / Ollama) — one saved credential, two capabilities."},"ConsumerGroupDetail":{"properties":{"group_id":{"type":"string","title":"Group Id","description":"Consumer group ID"},"state":{"type":"string","title":"State","description":"Group state"},"is_simple_consumer_group":{"type":"boolean","title":"Is Simple Consumer Group","description":"Whether this is a simple (legacy) consumer group"},"partition_assignor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Partition Assignor","description":"Partition assignment strategy"},"members":{"items":{"$ref":"#/components/schemas/ConsumerGroupMember"},"type":"array","title":"Members","description":"List of all members"},"total_members":{"type":"integer","title":"Total Members","description":"Total number of members"},"topics":{"items":{"$ref":"#/components/schemas/TopicPartitionAssignment"},"type":"array","title":"Topics","description":"Paginated list of topic-partition assignments"},"total_topics":{"type":"integer","title":"Total Topics","description":"Total number of topic-partition assignments"},"page":{"type":"integer","title":"Page","description":"Current page number (for topics pagination)"},"page_size":{"type":"integer","title":"Page Size","description":"Topics per page (for pagination)"},"total_lag":{"type":"integer","title":"Total Lag","description":"Total lag across all partitions","default":0},"coordinator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Coordinator","description":"Group coordinator broker"}},"additionalProperties":true,"type":"object","required":["group_id","state","is_simple_consumer_group","total_members","total_topics","page","page_size"],"title":"ConsumerGroupDetail","description":"Detailed consumer group information with paginated topics."},"ConsumerGroupListItem":{"properties":{"group_id":{"type":"string","title":"Group Id","description":"Consumer group ID"},"state":{"type":"string","title":"State","description":"Group state (e.g., Stable, Empty, Dead)"},"member_count":{"type":"integer","title":"Member Count","description":"Number of active members","default":0}},"additionalProperties":true,"type":"object","required":["group_id","state"],"title":"ConsumerGroupListItem","description":"Basic consumer group information for list view."},"ConsumerGroupMember":{"properties":{"member_id":{"type":"string","title":"Member Id","description":"Unique member ID"},"client_id":{"type":"string","title":"Client Id","description":"Client application ID"},"host":{"type":"string","title":"Host","description":"Consumer host"}},"additionalProperties":true,"type":"object","required":["member_id","client_id","host"],"title":"ConsumerGroupMember","description":"Consumer group member information."},"ConsumerGroupsPaginatedRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number"},"page_size":{"type":"integer","title":"Page Size","description":"Items per page"},"total":{"type":"integer","title":"Total","description":"Total number of consumer groups"},"result":{"items":{"$ref":"#/components/schemas/ConsumerGroupListItem"},"type":"array","title":"Result","description":"List of consumer groups"}},"additionalProperties":true,"type":"object","required":["page","page_size","total","result"],"title":"ConsumerGroupsPaginatedRes","description":"Paginated consumer groups list response."},"CreateAgentConfigRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Agent display name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Human-readable context for the agent"},"enabled":{"type":"boolean","title":"Enabled","description":"Kill switch. When false, the Flink runtime accepts the deploy but stops emitting output — used by support to disable a runaway tenant agent without a full cancel/redeploy.","default":true},"agentType":{"$ref":"#/components/schemas/AgentTypeEnum","description":"Agent type — derived from the tool list post-validation; client-supplied value is overwritten","default":"workflow"},"input":{"$ref":"#/components/schemas/AgentInputConfig"},"output":{"$ref":"#/components/schemas/AgentOutputConfig"},"llm":{"$ref":"#/components/schemas/AgentLlmConfig"},"prompts":{"$ref":"#/components/schemas/AgentPromptConfig"},"mcpServer":{"anyOf":[{"$ref":"#/components/schemas/AgentMcpServerConfig"},{"type":"null"}],"description":"Shared MCP server config for all MCP tools"},"tools":{"items":{"$ref":"#/components/schemas/AgentToolConfig"},"type":"array","title":"Tools","description":"Agent tools (MCP, HTTP, transform)"},"memory":{"anyOf":[{"$ref":"#/components/schemas/AgentMemoryConfig"},{"type":"null"}],"description":"Memory config (short-term + long-term)"},"knowledgeBases":{"items":{"$ref":"#/components/schemas/AgentKnowledgeBaseRef"},"type":"array","maxItems":10,"title":"Knowledgebases","description":"Knowledge bases this agent can query at runtime for RAG"},"processing":{"$ref":"#/components/schemas/AgentProcessingConfig"}},"additionalProperties":false,"type":"object","required":["name","input","output","llm","prompts"],"title":"CreateAgentConfigRequest","description":"Request body for POST /agents/config - create a config-based agent."},"CreateDestinationReq":{"properties":{"name":{"type":"string","title":"Name","description":"Display name for the destination connector."},"connector":{"type":"string","title":"Connector","description":"Connector type identifier (e.g., 'snowflake', 'bigquery', 'clickhouse', 'postgresql', 's3')."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Connector-specific configuration properties using dot notation. Use the GET /destinations/connectors endpoint with a connector_code query parameter to retrieve the full configuration schema for a specific connector type."},"created_from":{"anyOf":[{"$ref":"#/components/schemas/EntityOriginEnum"},{"type":"null"}],"description":"Origin of the entity creation.","default":"api"},"desired_state":{"anyOf":[{"$ref":"#/components/schemas/DesiredStateEnum"},{"type":"null"}],"description":"Desired operational state of the destination."},"kc_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kc Cluster Id","description":"KC cluster to deploy this connector to. Omit for default cluster."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs to assign to this destination"}},"additionalProperties":true,"type":"object","required":["name","connector","config"],"title":"CreateDestinationReq","description":"Request body for creating a new destination connector."},"CreateKafkaUserBody":{"properties":{"username":{"type":"string","maxLength":64,"minLength":3,"pattern":"^[a-zA-Z0-9_-]+$","title":"Username"},"whitelist_ips":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Whitelist Ips"},"kafka_acls":{"items":{"$ref":"#/components/schemas/KafkaAclModel"},"type":"array","title":"Kafka Acls","default":[]},"password":{"type":"string","maxLength":128,"minLength":12,"title":"Password"},"is_create_schema_registry":{"type":"boolean","title":"Is Create Schema Registry","default":false}},"additionalProperties":true,"type":"object","required":["username","password"],"title":"CreateKafkaUserBody","description":"Create Kafka User Body"},"CreateKnowledgeBaseRequest":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Knowledge base display name"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Human-readable context"},"source":{"$ref":"#/components/schemas/KBSourceConfig"},"text":{"$ref":"#/components/schemas/KBTextConfig","description":"Text template configuration"},"embedding":{"$ref":"#/components/schemas/KBEmbeddingConfig"},"vectorStore":{"$ref":"#/components/schemas/KBVectorStoreConfig"},"processing":{"$ref":"#/components/schemas/KBProcessingConfig"}},"additionalProperties":false,"type":"object","required":["name","source","embedding","vectorStore"],"title":"CreateKnowledgeBaseRequest","description":"Request body for POST /knowledge-bases/config — create a knowledge base pipeline."},"CreatePipelineReq":{"properties":{"name":{"type":"string","title":"Name"},"snapshot_new_tables":{"type":"boolean","title":"Snapshot New Tables","default":false},"destination":{"$ref":"#/components/schemas/PipelineDestinationConnector"},"source":{"$ref":"#/components/schemas/PipelineSourceConnector"},"transforms":{"anyOf":[{"items":{"$ref":"#/components/schemas/PipelineTransformConnector"},"type":"array"},{"type":"null"}],"title":"Transforms"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"topic_auto_discovery_transforms":{"items":{"$ref":"#/components/schemas/TopicAutoDiscoveryTransform"},"type":"array","title":"Topic Auto Discovery Transforms","default":[]},"created_from":{"anyOf":[{"$ref":"#/components/schemas/EntityOriginEnum"},{"type":"null"}],"default":"api"}},"additionalProperties":true,"type":"object","required":["name","destination","source","tags"],"title":"CreatePipelineReq"},"CreateSourceReq":{"properties":{"name":{"type":"string","title":"Name","description":"Display name for the source connector."},"connector":{"type":"string","title":"Connector","description":"Connector type identifier (e.g., 'postgresql', 'mysql', 'mongodb', 'dynamodb', 'sqlserveraws')."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Connector-specific configuration properties using dot notation (e.g., 'table.include.list', 'schema.include.list'). Use the GET /sources/connectors endpoint with a connector_code query parameter to retrieve the full configuration schema for a specific connector type."},"created_from":{"anyOf":[{"$ref":"#/components/schemas/EntityOriginEnum"},{"type":"null"}],"description":"Origin of the entity creation.","default":"api"},"desired_state":{"anyOf":[{"$ref":"#/components/schemas/DesiredStateEnum"},{"type":"null"}],"description":"Desired operational state of the source."},"kc_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kc Cluster Id","description":"KC cluster to deploy this connector to. Omit for default cluster."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs to assign to this source"}},"additionalProperties":true,"type":"object","required":["name","connector","config"],"title":"CreateSourceReq","description":"Request body for creating a new source connector."},"CreateTopicReq":{"properties":{"topic_name":{"type":"string","maxLength":249,"minLength":1,"title":"Topic Name","description":"Kafka topic name"},"num_partitions":{"type":"integer","minimum":1.0,"title":"Num Partitions","description":"Number of partitions","default":1},"replication_factor":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Replication Factor","description":"Replication factor (defaults to broker count)"},"cleanup_policy":{"anyOf":[{"$ref":"#/components/schemas/CleanupPolicyEnum"},{"type":"null"}],"description":"Topic cleanup policy"},"min_insync_replicas":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Min Insync Replicas","description":"Minimum in-sync replicas"},"retention_ms":{"anyOf":[{"type":"integer","minimum":-1.0},{"type":"null"}],"title":"Retention Ms","description":"Time to retain data in ms (-1 for unlimited)"},"retention_bytes":{"anyOf":[{"type":"integer","minimum":-1.0},{"type":"null"}],"title":"Retention Bytes","description":"Max size on disk in bytes (-1 for unlimited)"},"max_message_bytes":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Max Message Bytes","description":"Maximum message size in bytes"},"custom_configs":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Custom Configs","description":"Additional topic configs as key-value pairs"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"Tag IDs to assign to the topic"}},"additionalProperties":true,"type":"object","required":["topic_name"],"title":"CreateTopicReq"},"CreateTopicRes":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"entity":{"$ref":"#/components/schemas/TopicDetailsEntity"},"prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefix"},"serialization":{"anyOf":[{"$ref":"#/components/schemas/TopicSerialization"},{"type":"null"}]},"num_partitions":{"type":"integer","title":"Num Partitions"},"replication_factor":{"type":"integer","title":"Replication Factor"},"warnings":{"items":{"$ref":"#/components/schemas/CreateTopicWarning"},"type":"array","title":"Warnings","default":[]}},"additionalProperties":true,"type":"object","required":["id","name","entity","num_partitions","replication_factor"],"title":"CreateTopicRes"},"CreateTopicWarning":{"properties":{"message":{"type":"string","title":"Message"},"level":{"type":"string","title":"Level","default":"WARN"}},"additionalProperties":true,"type":"object","required":["message"],"title":"CreateTopicWarning"},"CreateTransformReq":{"properties":{"transform":{"$ref":"#/components/schemas/TransformsLibraryEnum"},"config":{"$ref":"#/components/schemas/TransformConfig"},"created_from":{"anyOf":[{"$ref":"#/components/schemas/EntityOriginEnum"},{"type":"null"}],"default":"api"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs to assign to this transform"}},"additionalProperties":true,"type":"object","required":["transform","config"],"title":"CreateTransformReq"},"CreateTransformWithFullProcessReq":{"properties":{"transform":{"$ref":"#/components/schemas/TransformsLibraryEnum"},"config":{"$ref":"#/components/schemas/TransformConfig"},"created_from":{"anyOf":[{"$ref":"#/components/schemas/EntityOriginEnum"},{"type":"null"}],"default":"api"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs to assign to this transform"},"implementation":{"anyOf":[{"$ref":"#/components/schemas/TransformsMapFilterImplementation"},{"$ref":"#/components/schemas/TransformsEnrichImplementation"},{"$ref":"#/components/schemas/TransformsEnrichAsyncImplementation"},{"$ref":"#/components/schemas/TransformsJoinImplementation"},{"$ref":"#/components/schemas/TransformsRollupImplementation"}],"title":"Implementation"}},"additionalProperties":true,"type":"object","required":["transform","config","implementation"],"title":"CreateTransformWithFullProcessReq"},"CustomTagCreateBody":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"name":{"type":"string","title":"Name"},"type":{"items":{"$ref":"#/components/schemas/TagTypeEnum"},"type":"array","title":"Type"}},"additionalProperties":true,"type":"object","required":["name","type"],"title":"CustomTagCreateBody"},"CustomTagUpdateBody":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"type":{"anyOf":[{"items":{"$ref":"#/components/schemas/TagTypeEnum"},"type":"array"},{"type":"null"}],"title":"Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"additionalProperties":true,"type":"object","title":"CustomTagUpdateBody"},"DashboardHealthRes":{"properties":{"sources_broken":{"type":"integer","title":"Sources Broken","description":"Number of broken source connectors","default":0},"destinations_broken":{"type":"integer","title":"Destinations Broken","description":"Number of broken destination connectors","default":0},"transforms_failed":{"type":"integer","title":"Transforms Failed","description":"Number of failed transforms","default":0},"failed_transform_ids":{"items":{"type":"string"},"type":"array","title":"Failed Transform Ids","description":"Entity IDs of failed transforms"},"pipelines_broken":{"type":"integer","title":"Pipelines Broken","description":"Number of broken pipelines","default":0},"dlq_topics_with_messages":{"type":"integer","title":"Dlq Topics With Messages","description":"Number of DLQ topics containing messages","default":0},"orphaned_topic_count":{"type":"integer","title":"Orphaned Topic Count","description":"Number of orphaned topics","default":0},"stale_source_count":{"type":"integer","title":"Stale Source Count","description":"Number of stale sources with no recent data","default":0},"partition_skew_count":{"type":"integer","title":"Partition Skew Count","description":"Number of topics with partition skew","default":0},"throughput_total_rps":{"type":"number","title":"Throughput Total Rps","description":"Total throughput in records per second","default":0.0},"broken_connectors":{"items":{"$ref":"#/components/schemas/BrokenConnectorRes"},"type":"array","title":"Broken Connectors","description":"List of broken connectors"},"active_snapshots":{"items":{"$ref":"#/components/schemas/ActiveSnapshotRes"},"type":"array","title":"Active Snapshots","description":"List of sources with active snapshots"},"topic_health":{"$ref":"#/components/schemas/TopicHealthRes","description":"Aggregated topic health metrics"}},"additionalProperties":true,"type":"object","title":"DashboardHealthRes","description":"Response model for GET /dashboard/health."},"DashboardLineageRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number","default":1},"page_size":{"type":"integer","title":"Page Size","description":"Results per page","default":10},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Total number of results"},"has_next":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Next","description":"Whether more pages exist"},"result":{"items":{"$ref":"#/components/schemas/LineageGroupRes"},"type":"array","title":"Result","description":"List of lineage groups"}},"additionalProperties":true,"type":"object","title":"DashboardLineageRes","description":"Response model for GET /dashboard/lineage."},"DashboardLineageTopicsRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number","default":1},"page_size":{"type":"integer","title":"Page Size","description":"Results per page","default":10},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Total number of results"},"has_next":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Next","description":"Whether more pages exist"},"result":{"items":{"$ref":"#/components/schemas/LineageTopicRes"},"type":"array","title":"Result","description":"List of topics with lineage info"}},"additionalProperties":true,"type":"object","title":"DashboardLineageTopicsRes","description":"Response model for GET /dashboard/lineage/topics."},"DesiredStateEnum":{"type":"string","enum":["Pending","Active","Paused","Stopped","Pending Update","Pending Delete"],"title":"DesiredStateEnum","description":"Desired state for sources and destinations.\n\nRepresents the target state for the connector:\n- PENDING: Configuration saved, not yet deployed\n- ACTIVE: Connector should be running (default for existing connectors)\n- PAUSED: Connector should be paused\n- STOPPED: Connector should be stopped\n- PENDING_UPDATE: Config saved to MongoDB, KC update deferred to reconciler\n- PENDING_DELETE: Marked for deletion, KC teardown deferred to reconciler"},"DestinationBaseMetrics":{"properties":{"timeseries":{"anyOf":[{"$ref":"#/components/schemas/DestinationTimeseriesMetrics"},{"type":"null"}]},"latest":{"anyOf":[{"$ref":"#/components/schemas/DestinationLatestMetrics"},{"type":"null"}]},"timesummary":{"anyOf":[{"$ref":"#/components/schemas/DestinationTimesummaryMetrics"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"DestinationBaseMetrics","description":"Destination base metrics."},"DestinationConnector":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"User-defined connector name"},"connector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector","description":"Connector type (e.g., 'snowflake', 'bigquery', 'clickhouse')"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier"},"connector_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Display Name","description":"Human-readable connector type name"},"created_timestamp":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Timestamp","description":"Creation timestamp (ISO 8601)"},"sub_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Id","description":"Subscription identifier"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id","description":"Tenant identifier for multi-tenancy"},"config":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"boolean"},{"items":{},"type":"array"},{"additionalProperties":true,"type":"object"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Config","description":"Connector configuration parameters"},"topic_ids":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array"},{"type":"null"}],"title":"Topic Ids","description":"List of associated topic identifiers"},"topic_map":{"anyOf":[{"additionalProperties":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array"},"type":"object"},{"type":"null"}],"title":"Topic Map","description":"Mapping of topics to their partitions or related entities"},"topics":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array"},{"type":"null"}],"title":"Topics","description":"List of topic names"},"tasks":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Tasks","description":"List of task identifiers"},"connector_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Status","description":"Current status: Active, Paused, Stopped, Broken, Starting, Unassigned, Unknown, Pending"},"desired_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Desired State","description":"Desired state: Pending, Active, Paused, Stopped"},"kc_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kc Cluster Id","description":"KC cluster this connector is deployed to. None means default cluster."},"task_statuses":{"anyOf":[{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"object"},"type":"object"},{"type":"null"}],"title":"Task Statuses","description":"Status information for each connector task"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs assigned to this destination"}},"additionalProperties":true,"type":"object","title":"DestinationConnector","description":"Destination connector configuration and status."},"DestinationConnectorEnum":{"type":"string","enum":["azblob","clickhouse","databricks","mysql","postgresql","redshift","s3","r2","gcs","motherduck","weaviate","pinecone","httpsink","sqlserver","bigquery","cockroachdb","db2","oracle","redis","snowflake","starburst","kafka","kafkadirect","iceberg"],"title":"DestinationConnectorEnum","description":"Available destination connector types for data delivery.\n\nSupports data warehouses (Snowflake, BigQuery, Databricks),\ndatabases (ClickHouse, PostgreSQL), and object storage (S3, Iceberg)."},"DestinationInviteBody":{"properties":{"to_email":{"type":"string","title":"To Email","description":"Email address of the user to invite"},"message":{"type":"string","title":"Message","description":"Custom message to include in the invitation"},"connectorType":{"type":"string","title":"Connectortype","description":"Type of connector being shared"},"returnUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Returnurl","description":"URL to redirect to after invitation is accepted"}},"additionalProperties":true,"type":"object","required":["to_email","message","connectorType"],"title":"DestinationInviteBody","description":"Destination Invite body"},"DestinationLatestMetrics":{"properties":{"connector_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Status"},"latency":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Latency"},"partitionCount":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Partitioncount"},"putBatchMaxTimeMs":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Putbatchmaxtimems"},"recordsLag":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Recordslag"},"sinkRecordReadTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Sinkrecordreadtotal"},"recordsConsumedTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Recordsconsumedtotal"},"sinkRecordSendTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Sinkrecordsendtotal"},"bytesConsumedTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Bytesconsumedtotal"},"qa_exact_count_diff":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Qa Exact Count Diff"}},"additionalProperties":true,"type":"object","title":"DestinationLatestMetrics","description":"Destination latest metrics."},"DestinationLatestMetricsWithMetadata":{"properties":{"data":{"$ref":"#/components/schemas/DestinationLatestMetrics"},"metadata":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Metadata"}},"additionalProperties":true,"type":"object","required":["data","metadata"],"title":"DestinationLatestMetricsWithMetadata","description":"Destination latest metrics with metadata."},"DestinationMetricsReqBody":{"properties":{"ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Ids","description":"List of destination IDs (as array) or comma-separated string. Body takes precedence over query params."},"tenant_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Tenant Ids","description":"List of tenant IDs (as array) or comma-separated string. Body takes precedence over query params."}},"additionalProperties":true,"type":"object","title":"DestinationMetricsReqBody","description":"Body model for POST /destinations/metrics requests.\n\nSupports large lists of IDs that would exceed URL length limits when using GET.\nBody parameters take precedence over query parameters when both are provided."},"DestinationMetricsRes":{"properties":{"account_metrics":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/DestinationBaseMetrics"},"type":"object"},{"type":"null"}],"title":"Account Metrics"},"connector_metrics":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/DestinationBaseMetrics"},"type":"object"},{"type":"null"}],"title":"Connector Metrics"},"inline_metrics":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/DestinationBaseMetrics"},"type":"object"},{"type":"null"}],"title":"Inline Metrics"},"task_metrics":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/DestinationBaseMetrics"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Task Metrics"},"topic_metrics":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/DestinationBaseMetrics"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Topic Metrics"}},"additionalProperties":true,"type":"object","title":"DestinationMetricsRes","description":"Destination metrics response."},"DestinationTimeseriesMetrics":{"properties":{"latency":{"anyOf":[{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array"},{"type":"null"}],"title":"Latency","default":[]},"partitionCount":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Partitioncount","default":[]},"putBatchMaxTimeMs":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Putbatchmaxtimems","default":[]},"recordsLag":{"anyOf":[{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array"},{"type":"null"}],"title":"Recordslag","default":[]},"sinkRecordReadTotal":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Sinkrecordreadtotal","default":[]},"recordsConsumedTotal":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Recordsconsumedtotal","default":[]},"sinkRecordSendTotal":{"anyOf":[{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array"},{"type":"null"}],"title":"Sinkrecordsendtotal","default":[]},"bytesConsumedTotal":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Bytesconsumedtotal","default":[]},"qa_exact_count_diff":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Qa Exact Count Diff","default":[]}},"additionalProperties":true,"type":"object","title":"DestinationTimeseriesMetrics","description":"Destination timeseries metrics."},"DestinationTimeseriesMetricsWithMetadata":{"properties":{"data":{"$ref":"#/components/schemas/DestinationTimeseriesMetrics"},"metadata":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Metadata"}},"additionalProperties":true,"type":"object","required":["data","metadata"],"title":"DestinationTimeseriesMetricsWithMetadata","description":"Destination timeseries metrics with metadata."},"DestinationTimesummaryMetrics":{"properties":{"connector_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Status"},"latency":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Latency"},"partitionCount":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Partitioncount"},"putBatchMaxTimeMs":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Putbatchmaxtimems"},"recordsConsumedTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Recordsconsumedtotal"},"recordsLag":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Recordslag"},"sinkRecordReadTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Sinkrecordreadtotal"},"sinkRecordSendTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Sinkrecordsendtotal"},"bytesConsumedTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Bytesconsumedtotal"},"qa_exact_count_diff":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Qa Exact Count Diff"}},"additionalProperties":true,"type":"object","title":"DestinationTimesummaryMetrics","description":"Destination timesummary metrics."},"DestinationTimesummaryMetricsWithMetadata":{"properties":{"data":{"$ref":"#/components/schemas/DestinationTimesummaryMetrics"},"metadata":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Metadata"}},"additionalProperties":true,"type":"object","required":["data","metadata"],"title":"DestinationTimesummaryMetricsWithMetadata","description":"Destination timesummary metrics with metadata."},"DestinationsPaginatedReqBody":{"properties":{"connector":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Connector","description":"List of connector types (as array) or comma-separated string. Body takes precedence over query params."},"status":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Status","description":"List of statuses (as array) or comma-separated string. Body takes precedence over query params."},"tag_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Tag Ids","description":"List of tag IDs (as array) or comma-separated string. Body takes precedence over query params."},"tag_filter_operation":{"anyOf":[{"type":"string","enum":["and","or"]},{"type":"null"}],"title":"Tag Filter Operation","description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags. Body takes precedence over query params."}},"additionalProperties":true,"type":"object","title":"DestinationsPaginatedReqBody","description":"Body model for POST /destinations/search requests.\n\nSupports large lists of filter values that would exceed URL length limits when using GET.\nBody parameters take precedence over query parameters when both are provided."},"DestinationsPaginatedRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number","default":1},"page_size":{"type":"integer","title":"Page Size","description":"Results per page","default":10},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Total number of results"},"has_next":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Next","description":"Whether more pages exist"},"result":{"items":{"$ref":"#/components/schemas/DestinationConnector"},"type":"array","title":"Result"}},"additionalProperties":true,"type":"object","required":["result"],"title":"DestinationsPaginatedRes","description":"Get paginated destinations response."},"DiscoverMcpToolsRequest":{"properties":{"serverUrl":{"type":"string","maxLength":2048,"title":"Serverurl","default":""},"headers":{"additionalProperties":{"type":"string"},"type":"object","maxProperties":32,"title":"Headers"},"savedConnectionId":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Savedconnectionid","description":"If set, BE resolves serverUrl + headers from the tenant's saved connection by id"},"savedConnectionName":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Savedconnectionname","description":"Deprecated - prefer ``savedConnectionId``. Accepted for backward compatibility for one release cycle."}},"additionalProperties":false,"type":"object","title":"DiscoverMcpToolsRequest","description":"Request body for POST /agents/mcp/tools.\n\nTwo callable shapes:\n\n1. **Inline** - the caller sends ``{serverUrl, headers}`` directly. Used\n   for the \"Test\" button on a new connection form before the row has\n   been saved. If any header value is ``MASK_SENTINEL``, the BE\n   substitutes the stored secret for that row (matched by\n   ``serverUrl``) server-side so the decrypted value never reaches\n   the browser.\n2. **By saved-id** - the caller sends ``savedConnectionId`` and the BE\n   reads the stored row from ``agent_connections`` and composes headers\n   via ``mcp_header_resolver``. Used when the tenant triggers a\n   re-discover against an existing saved connection - the browser\n   doesn't need to hold the token at all. For MCP connections (which\n   are keyed by ``name`` in storage), the value sent as\n   ``savedConnectionId`` is the connection's stable ``name``.\n\n``savedConnectionName`` is accepted as a deprecated alias for one\nrelease cycle so an in-flight FE that hasn't shipped the rename yet\nkeeps working. New callers should send ``savedConnectionId``."},"EbsVolumeStatus":{"properties":{"volume_type":{"type":"string","title":"Volume Type"},"size_gb":{"type":"integer","title":"Size Gb"},"iops":{"type":"integer","title":"Iops"},"throughput_mbps":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Throughput Mbps"},"volumes_per_node":{"type":"integer","title":"Volumes Per Node","default":1}},"additionalProperties":true,"type":"object","required":["volume_type","size_gb","iops"],"title":"EbsVolumeStatus","description":"An EBS volume attached to nodes in a node group."},"EmbeddedTopicsRes":{"properties":{"result":{"items":{"$ref":"#/components/schemas/LineageTopicRes"},"type":"array","title":"Result","description":"Enriched topics for this group"},"total":{"type":"integer","title":"Total","description":"Total matching topics in this group","default":0},"page":{"type":"integer","title":"Page","description":"Page number (always 1 for embedded)","default":1},"has_next":{"type":"boolean","title":"Has Next","description":"Whether more topics exist beyond this page","default":false}},"additionalProperties":true,"type":"object","title":"EmbeddedTopicsRes","description":"Paginated topics embedded within a lineage group."},"EmbeddingDefaults":{"properties":{"model":{"type":"string","maxLength":200,"title":"Model","description":"Default embedding model, e.g. text-embedding-3-small. Empty = fill at KB creation.","default":""},"dimensions":{"anyOf":[{"type":"integer","maximum":65536.0,"minimum":1.0},{"type":"null"}],"title":"Dimensions","description":"Output embedding dimensions override (provider-dependent)"},"batchSize":{"type":"integer","maximum":2048.0,"minimum":1.0,"title":"Batchsize","description":"Records per embedding batch call","default":100},"region":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Region","description":"AWS region for bedrock embedding provider (e.g. us-east-1). Ignored for non-bedrock rows."},"maxRetries":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":0.0},{"type":"null"}],"title":"Maxretries","description":"Bedrock retry cap. Ignored for non-bedrock rows."}},"additionalProperties":false,"type":"object","title":"EmbeddingDefaults","description":"Default tuning for the ``embedding`` capability of a saved LLM connection.\n\nEmbedding-only fields — no temperature / reasoning controls because\nembedding endpoints don't accept them. The KB wizard prefills these\ninto ``KBEmbeddingConfig`` and the user can override per-KB."},"EntityOriginEnum":{"type":"string","enum":["terraform","web","api"],"title":"EntityOriginEnum","description":"Origin of an entity in the system.\n\nTracks how entities (sources, destinations, pipelines) were created,\nenabling audit trails and origin-specific behavior."},"ExecuteBlockingSnapshotBody":{"properties":{"source_id":{"type":"string","title":"Source Id"},"topic_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Topic Names"}},"additionalProperties":true,"type":"object","required":["source_id"],"title":"ExecuteBlockingSnapshotBody","description":"Execute Blocking Snapshot Body.\n\nBlocking snapshots pause streaming during the snapshot operation and use\nDebezium's initial snapshot process. They are useful for:\n- Snapshotting keyless tables (which incremental snapshots cannot handle)\n- Snapshotting large tables faster than incremental snapshots\n- Adding new tables while the connector is running\n\nNote: additional_conditions filters are not supported for blocking snapshots."},"ExecuteSnapshotBody":{"properties":{"source_id":{"type":"string","title":"Source Id"},"topic_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Topic Names"},"additional_conditions":{"anyOf":[{"items":{"$ref":"#/components/schemas/AdditionalCondition"},"type":"array"},{"type":"null"}],"title":"Additional Conditions"},"surrogate_keys":{"anyOf":[{"items":{"$ref":"#/components/schemas/SurrogateKeySpec"},"type":"array"},{"type":"null"}],"title":"Surrogate Keys","description":"Per-table surrogate key(s) for parallel filtered snapshots (ENG-2474): the indexed column(s) to range over instead of the PK. Distinct from the source-wide surrogate_key below (incremental / blocking path)."},"surrogate_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surrogate Key","description":"Column name to use as surrogate primary key for all tables during snapshot chunking. Useful for tables without primary keys or when a more efficient column exists for chunking."},"filter_regex":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter Regex","description":"Optional restrictive regex applied by the orchestrator to the physical tables the controller expands, across ALL triggered selectors. Matched (via search) against each physical's fully-qualified identifier `<database-or-schema>.<table>`, so it can narrow by DB/schema, table name, or a table-name suffix — the caller decides. Only matching physicals are snapshotted. Use to backfill a specific subset without re-snapshotting a regex source's full expansion. Null → no restriction."}},"additionalProperties":true,"type":"object","required":["source_id"],"title":"ExecuteSnapshotBody","description":"Execute Snapshot Body"},"ExplainConnectorErrorRequest":{"properties":{"include_logs":{"type":"boolean","title":"Include Logs","description":"Also attach recent connector logs to the context for extra signal.","default":false}},"type":"object","title":"ExplainConnectorErrorRequest","description":"Request body for the connector-error 'Explain with AI' endpoints (sources + destinations)."},"ExternalMcpBearerConnection":{"properties":{"source":{"type":"string","const":"external","title":"Source","description":"Discriminator - must be 'external'","default":"external"},"name":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[^/\\r\\n\\x00]+$","title":"Name","description":"Connection name (e.g. 'AWS Knowledge', 'Zapier Personal')"},"serverUrl":{"type":"string","maxLength":2048,"minLength":1,"title":"Serverurl"},"authMode":{"type":"string","const":"bearer","title":"Authmode"},"bearerToken":{"type":"string","maxLength":8192,"minLength":1,"title":"Bearertoken","description":"Bearer token - encrypted at rest, masked on GET"}},"additionalProperties":false,"type":"object","required":["name","serverUrl","authMode","bearerToken"],"title":"ExternalMcpBearerConnection","description":"External MCP authenticated via ``Authorization: Bearer <token>``."},"ExternalMcpHeaderConnection":{"properties":{"source":{"type":"string","const":"external","title":"Source","description":"Discriminator - must be 'external'","default":"external"},"name":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[^/\\r\\n\\x00]+$","title":"Name","description":"Connection name (e.g. 'AWS Knowledge', 'Zapier Personal')"},"serverUrl":{"type":"string","maxLength":2048,"minLength":1,"title":"Serverurl"},"authMode":{"type":"string","const":"header","title":"Authmode"},"headerName":{"type":"string","maxLength":200,"minLength":1,"pattern":"^[A-Za-z0-9-]+$","title":"Headername","description":"HTTP header name (RFC 7230 token alphabet, narrowed)"},"headerValue":{"type":"string","maxLength":8192,"minLength":1,"title":"Headervalue","description":"Header value - encrypted at rest, masked on GET"}},"additionalProperties":false,"type":"object","required":["name","serverUrl","authMode","headerName","headerValue"],"title":"ExternalMcpHeaderConnection","description":"External MCP authenticated via a single custom header (API-key style)."},"ExternalMcpNoneConnection":{"properties":{"source":{"type":"string","const":"external","title":"Source","description":"Discriminator - must be 'external'","default":"external"},"name":{"type":"string","maxLength":100,"minLength":1,"pattern":"^[^/\\r\\n\\x00]+$","title":"Name","description":"Connection name (e.g. 'AWS Knowledge', 'Zapier Personal')"},"serverUrl":{"type":"string","maxLength":2048,"minLength":1,"title":"Serverurl"},"authMode":{"type":"string","const":"none","title":"Authmode"}},"additionalProperties":false,"type":"object","required":["name","serverUrl","authMode"],"title":"ExternalMcpNoneConnection","description":"External MCP with no authentication header (public / open servers)."},"FlinkJobStatusEnum":{"type":"string","enum":["CREATED","DEPLOYING","RUNNING","CANCELLING","CANCELLED","FAILED","FINISHED"],"title":"FlinkJobStatusEnum"},"FlinkJobStatusResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"$ref":"#/components/schemas/FlinkJobStatusEnum"},"live_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Live Status"},"flink_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flink Job Id"}},"additionalProperties":true,"type":"object","required":["id","status"],"title":"FlinkJobStatusResponse","description":"Lightweight status response (no checkpoints/errors)."},"FullTransformEntity":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"sub_id":{"type":"string","title":"Sub Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"service_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Id"},"start_time":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time"},"job_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Name"},"topic_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Topic Ids"},"transform_type":{"$ref":"#/components/schemas/TransformsLibraryEnum"},"config":{"anyOf":[{"$ref":"#/components/schemas/TransformConfig"},{"$ref":"#/components/schemas/TransformsEnrichAsyncConfig"},{"type":"null"}],"title":"Config"},"implementation":{"anyOf":[{"$ref":"#/components/schemas/TransformsMapFilterImplementation"},{"$ref":"#/components/schemas/TransformsEnrichImplementation"},{"$ref":"#/components/schemas/TransformsEnrichAsyncImplementation"},{"$ref":"#/components/schemas/TransformsJoinImplementation"},{"$ref":"#/components/schemas/TransformsRollupImplementation"},{"$ref":"#/components/schemas/TransformsTopicRouterImplementation"},{"type":"null"}],"title":"Implementation"},"metrics":{"anyOf":[{"$ref":"#/components/schemas/TransformMetric"},{"type":"null"}]},"live_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Live Version"},"preview_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preview Version"},"version":{"type":"integer","title":"Version","default":1},"updated_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Timestamp"},"implementation_updated_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Implementation Updated Timestamp"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs assigned to this transform"},"history_created_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"History Created Timestamp"},"history_updated_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"History Updated Timestamp"}},"additionalProperties":true,"type":"object","required":["id","name","sub_id","tenant_id","transform_type"],"title":"FullTransformEntity","description":"Basic transform details."},"FullTransformsRes":{"properties":{},"additionalProperties":true,"type":"object","title":"FullTransformsRes"},"GetUsageMetricsReqBody":{"properties":{"tenant_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Tenant Ids","description":"List of tenant IDs (as array) or comma-separated string. Body takes precedence over query params."}},"additionalProperties":true,"type":"object","title":"GetUsageMetricsReqBody","description":"Body model for POST /billing/usage/metrics requests.\n\nSupports large lists of IDs that would exceed URL length limits when using GET.\nBody parameters take precedence over query parameters when both are provided."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HistogramBucket":{"properties":{"timestamp_start":{"type":"string","title":"Timestamp Start"},"timestamp_end":{"type":"string","title":"Timestamp End"},"error":{"type":"integer","title":"Error","default":0},"warn":{"type":"integer","title":"Warn","default":0},"info":{"type":"integer","title":"Info","default":0},"debug":{"type":"integer","title":"Debug","default":0},"total":{"type":"integer","title":"Total","default":0}},"additionalProperties":true,"type":"object","required":["timestamp_start","timestamp_end"],"title":"HistogramBucket","description":"A single bucket in the histogram response."},"HistogramRequestBody":{"properties":{"source_ids":{"items":{"type":"string"},"type":"array","title":"Source Ids","default":[]},"destination_ids":{"items":{"type":"string"},"type":"array","title":"Destination Ids","default":[]},"transform_ids":{"items":{"type":"string"},"type":"array","title":"Transform Ids","default":[]}},"additionalProperties":true,"type":"object","title":"HistogramRequestBody","description":"Request body for histogram endpoint."},"HistogramResponse":{"properties":{"buckets":{"items":{"$ref":"#/components/schemas/HistogramBucket"},"type":"array","title":"Buckets","default":[]},"total_logs":{"type":"integer","title":"Total Logs","default":0},"totals_by_level":{"anyOf":[{"$ref":"#/components/schemas/TotalsByLevel"},{"type":"null"}]},"time_range":{"$ref":"#/components/schemas/HistogramTimeRange"}},"additionalProperties":true,"type":"object","required":["time_range"],"title":"HistogramResponse","description":"Response model for histogram endpoint."},"HistogramTimeRange":{"properties":{"from":{"type":"string","title":"From"},"to":{"type":"string","title":"To"}},"additionalProperties":true,"type":"object","required":["from","to"],"title":"HistogramTimeRange","description":"Time range for histogram response."},"KBEmbeddingConfig":{"properties":{"embeddingConnectionId":{"type":"string","maxLength":64,"minLength":1,"title":"Embeddingconnectionid","description":"Reference to a saved AgentLlmConnection. The connection must advertise the 'embedding' capability."},"model":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Model","description":"Per-KB embedding-model override. ``None`` = use the connection's default embedding model (``embedding.model`` on the saved row)."},"dimensions":{"anyOf":[{"type":"integer","maximum":65536.0,"minimum":1.0},{"type":"null"}],"title":"Dimensions","description":"Per-KB dimensions override. ``None`` = use the connection's default (``embedding.dimensions`` on the saved row), or the provider default when neither is set."},"batchSize":{"anyOf":[{"type":"integer","maximum":2048.0,"minimum":1.0},{"type":"null"}],"title":"Batchsize","description":"Per-KB batchSize override. ``None`` = use the connection's default (``embedding.batchSize`` on the saved row, falls back to 100)."}},"additionalProperties":false,"type":"object","required":["embeddingConnectionId"],"title":"KBEmbeddingConfig","description":"Embedding-side configuration for a knowledge base.\n\nCarries a reference to a saved ``AgentLlmConnection`` plus optional\nper-KB overrides of the connection's defaults. Credentials, provider,\nand the default model live on the connection — there is no inline\napiKey / baseUrl path on a KB. The deploy-time resolver\n(``resolve_kb_connections``) reads the referenced connection's\n``embedding`` defaults block, applies any per-KB overrides, and stamps\nthe resulting bundle into the Flink CLI JSON.\n\nThe referenced connection must carry ``'embedding'`` in its\n``capabilities`` list and have a non-empty ``embedding.model`` — the\nvalidator inside ``resolve_saved_embedding_credentials`` raises 422 at\ndeploy time otherwise so the FE error surfaces the cause without\nwaiting for a Java runtime 4xx."},"KBProcessingConfig":{"properties":{"parallelism":{"type":"integer","maximum":128.0,"minimum":1.0,"title":"Parallelism","description":"Flink parallelism","default":1},"checkpointIntervalMin":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Checkpointintervalmin","description":"Checkpoint interval in minutes","default":5},"chunkSize":{"type":"integer","maximum":8192.0,"minimum":1.0,"title":"Chunksize","description":"Text chunk size in tokens","default":512},"chunkOverlap":{"type":"integer","maximum":4096.0,"minimum":0.0,"title":"Chunkoverlap","description":"Overlap tokens between chunks","default":50}},"additionalProperties":false,"type":"object","title":"KBProcessingConfig","description":"Processing configuration for the knowledge base pipeline."},"KBSourceConfig":{"properties":{"topic":{"anyOf":[{"type":"string","maxLength":249},{"type":"null"}],"title":"Topic","description":"Exact Kafka topic name (Kafka's own limit is 249). Mutually exclusive with ``topicPattern``. The deploy-time builder turns this into ``^re.escape(topic)$`` for the Java runtime."},"topicPattern":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Topicpattern","description":"Regex pattern for input topics, e.g. ``^source_.*\\.orders$``. Mutually exclusive with ``topic`` — set this only for programmatic multi-topic fan-in."},"inputSerialization":{"$ref":"#/components/schemas/AgentSerializationEnum","description":"Input deserialization format","default":"JsonConfluent"},"fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Fields","description":"Column-level filter — only these fields processed"},"textFields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Textfields","description":"Fields to include in the embedded text (if not using textTemplate)"},"metadataFields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Metadatafields","description":"Fields to store as vector metadata (filterable at query time)"}},"additionalProperties":false,"type":"object","title":"KBSourceConfig","description":"Kafka source configuration for the knowledge base pipeline.\n\nExactly one of ``topic`` or ``topicPattern`` must be set:\n\n- ``topic`` — exact Kafka topic name (the FE wizard's single-topic\n  picker emits this). The service layer composes\n  ``^re.escape(topic)$`` for the Java ``--topicMatcherRegex`` CLI\n  arg, so the Java side keeps the regex-only contract.\n- ``topicPattern`` — escape hatch for tenants who genuinely need a\n  multi-topic regex (e.g. fan-in of a sharded topic family). Not\n  exposed by the FE wizard today — programmatic API callers only.\n\nThe XOR rule is enforced by ``_topic_xor`` below: empty payload\n(neither set) and over-specified payload (both set) both 422."},"KBTextConfig":{"properties":{"textTemplate":{"type":"string","maxLength":8000,"title":"Texttemplate","description":"Template with ${field} placeholders, e.g. 'Customer ${customer_id} ordered ${product}'","default":""}},"additionalProperties":false,"type":"object","title":"KBTextConfig","description":"Text template configuration for composing the embedding input from record fields."},"KBVectorStoreConfig":{"properties":{"vectorStoreConnectionId":{"type":"string","maxLength":64,"minLength":1,"title":"Vectorstoreconnectionid","description":"Reference to a saved AgentVectorStoreConnection. BE resolves credentials at deploy time."},"indexName":{"type":"string","maxLength":200,"minLength":1,"title":"Indexname","description":"Index or collection name in the vector store"},"namespace":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Namespace","description":"Namespace or partition within the index"},"metric":{"type":"string","enum":["cosine","dot_product","euclidean"],"title":"Metric","description":"Distance metric","default":"cosine"}},"additionalProperties":false,"type":"object","required":["vectorStoreConnectionId","indexName"],"title":"KBVectorStoreConfig","description":"Vector store configuration for the knowledge base.\n\nReferences a lightweight ``AgentVectorStoreConnection`` by id. The BE\nresolves the connection's credentials (apiKey + endpoint) at deploy\ntime. There is no inline-credentials path — KBs must reference a saved\nconnection (the FE picker is the only authoring surface)."},"KCConfigChangeComparisonRes":{"properties":{"has_changes":{"type":"boolean","title":"Has Changes","description":"Whether the current config differs from the original","default":false},"oldest_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Oldest Timestamp","description":"Timestamp of the original recorded config"},"latest_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Latest Timestamp","description":"Timestamp of the latest recorded config"},"masked_diff":{"type":"string","title":"Masked Diff","description":"Unified diff (secret-masked) of original vs current config","default":""}},"additionalProperties":true,"type":"object","title":"KCConfigChangeComparisonRes","description":"Comparison of the current connector config against the original recorded config."},"KCConfigChangeHistoryItem":{"properties":{"id":{"type":"string","title":"Id","description":"Unique identifier for this change record"},"action":{"type":"string","title":"Action","description":"Action performed: 'created' or 'updated'"},"status":{"type":"string","title":"Status","description":"Outcome of the operation: 'success' or 'failed'","default":"success"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"Masked error message if operation failed (customer-visible)"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp","description":"When the change occurred"},"connector_name":{"type":"string","title":"Connector Name","description":"Connector name"},"connector_type":{"type":"string","title":"Connector Type","description":"Connector type (e.g., postgres, mysql)"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id","description":"ID of the user who made the change (None for system/background operations)"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email","description":"Email of the user who made the change (None for system/background operations)"},"ai_summary":{"$ref":"#/components/schemas/KCConfigChangeSummary","description":"AI-generated summary of the change"}},"additionalProperties":true,"type":"object","required":["id","action","timestamp","connector_name","connector_type","ai_summary"],"title":"KCConfigChangeHistoryItem","description":"Single configuration change history item for API responses.\n\nThis is customer-visible data with AI-generated summaries."},"KCConfigChangeHistoryRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number","default":1},"page_size":{"type":"integer","title":"Page Size","description":"Results per page","default":10},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Total number of results"},"has_next":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Next","description":"Whether more pages exist"},"result":{"items":{"$ref":"#/components/schemas/KCConfigChangeHistoryItem"},"type":"array","title":"Result","description":"List of configuration changes with AI summaries","default":[]}},"additionalProperties":true,"type":"object","title":"KCConfigChangeHistoryRes","description":"Paginated response model for configuration change history endpoint.\n\nUses standard pagination pattern: page, page_size, total, has_next, result."},"KCConfigChangeSummary":{"properties":{"summary":{"type":"string","title":"Summary","description":"Human-readable summary of the configuration change"}},"type":"object","required":["summary"],"title":"KCConfigChangeSummary","description":"AI-generated summary of a configuration change."},"KafkaAclModel":{"properties":{"topic_name":{"type":"string","title":"Topic Name"},"operation":{"type":"string","title":"Operation"},"resource_pattern_type":{"type":"string","title":"Resource Pattern Type"},"resource":{"type":"string","title":"Resource","default":"TOPIC"}},"additionalProperties":true,"type":"object","required":["topic_name","operation","resource_pattern_type"],"title":"KafkaAclModel","description":"Basic kafka user details."},"KafkaConnectStatefulSetStatus":{"properties":{"name":{"type":"string","title":"Name"},"memory":{"type":"string","title":"Memory"},"replicas":{"type":"integer","title":"Replicas"}},"additionalProperties":true,"type":"object","required":["name","memory","replicas"],"title":"KafkaConnectStatefulSetStatus","description":"Live spec for a single Kafka Connect StatefulSet."},"KafkaSqlQueryReq":{"properties":{"sql":{"type":"string","maxLength":10000,"minLength":1,"title":"Sql","description":"SQL query string (e.g., SELECT * FROM topic_name WHERE ... LIMIT 10)"},"max_time_seconds":{"type":"integer","maximum":120.0,"minimum":1.0,"title":"Max Time Seconds","description":"Maximum execution time in seconds before the query is terminated","default":30}},"additionalProperties":true,"type":"object","required":["sql"],"title":"KafkaSqlQueryReq","description":"Request body for executing a SQL query against Kafka topics."},"KafkaSqlQueryRes":{"properties":{"columns":{"items":{"type":"string"},"type":"array","title":"Columns","description":"Column names in the result set"},"rows":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rows","description":"Result rows as dicts"},"metadata":{"$ref":"#/components/schemas/KafkaSqlQueryResultMetadata"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if the query failed"}},"additionalProperties":true,"type":"object","title":"KafkaSqlQueryRes","description":"Response from executing a SQL query against a Kafka topic."},"KafkaSqlQueryResultMetadata":{"properties":{"records_scanned":{"type":"integer","title":"Records Scanned","default":0},"records_matched":{"type":"integer","title":"Records Matched","default":0},"partitions_scanned":{"items":{"type":"integer"},"type":"array","title":"Partitions Scanned"},"execution_time_ms":{"type":"number","title":"Execution Time Ms","default":0},"terminated_by":{"type":"string","title":"Terminated By","description":"limit, max_time, max_bytes, or end_of_topic","default":""},"bytes_scanned":{"type":"integer","title":"Bytes Scanned","default":0},"topic":{"type":"string","title":"Topic","description":"The topic that was queried","default":""}},"additionalProperties":true,"type":"object","title":"KafkaSqlQueryResultMetadata","description":"Metadata about query execution for the results panel."},"KafkaTopicCatalogEntry":{"properties":{"topic_id":{"type":"string","title":"Topic Id","description":"Kafka topic name (e.g., source_abc.public.users)"},"display_name":{"type":"string","title":"Display Name","description":"Short display name for the sidebar"},"partition_count":{"type":"integer","title":"Partition Count","description":"Number of partitions","default":0},"value_format":{"$ref":"#/components/schemas/SerializationFormatEnum","description":"Serialization format of the topic values","default":"unknown"},"schema_fields":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Schema Fields","description":"Schema fields from Schema Registry (list of {name, type} dicts), or None if no schema"},"entity_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type","description":"Producer type: sources, transforms, manual"},"entity_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Id","description":"Producer entity ID"},"entity_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Name","description":"Producer entity display name"}},"additionalProperties":true,"type":"object","required":["topic_id","display_name"],"title":"KafkaTopicCatalogEntry","description":"A topic entry in the catalog sidebar of the SQL Studio."},"KafkaTopicCatalogGroup":{"properties":{"group_id":{"type":"string","title":"Group Id","description":"Producer entity ID (or '__dlq__' for DLQ group)"},"group_name":{"type":"string","title":"Group Name","description":"Display name for the group"},"group_type":{"type":"string","title":"Group Type","description":"Producer type: sources, destinations, transforms, dlq, manual"},"connector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector","description":"Connector type (postgresql, snowflake, etc.)"},"topic_count":{"type":"integer","title":"Topic Count","default":0},"topics":{"items":{"$ref":"#/components/schemas/KafkaTopicCatalogGroupTopic"},"type":"array","title":"Topics"}},"additionalProperties":true,"type":"object","required":["group_id","group_name","group_type"],"title":"KafkaTopicCatalogGroup","description":"A source/producer group in the catalog tree."},"KafkaTopicCatalogGroupTopic":{"properties":{"topic_id":{"type":"string","title":"Topic Id","description":"Full Kafka topic name"},"short_name":{"type":"string","title":"Short Name","description":"Display name with source prefix stripped (e.g., public.users)"},"partition_count":{"type":"integer","title":"Partition Count","default":0},"value_format":{"$ref":"#/components/schemas/SerializationFormatEnum","default":"unknown"},"is_dlq":{"type":"boolean","title":"Is Dlq","description":"Whether this is a dead letter queue topic","default":false}},"additionalProperties":true,"type":"object","required":["topic_id","short_name"],"title":"KafkaTopicCatalogGroupTopic","description":"Lightweight topic entry inside a group (no schema - fetched lazily on expand)."},"KafkaTopicCatalogGroupedRes":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/KafkaTopicCatalogGroup"},"type":"array","title":"Groups"},"total_topics":{"type":"integer","title":"Total Topics","default":0},"total_groups":{"type":"integer","title":"Total Groups","default":0}},"additionalProperties":true,"type":"object","title":"KafkaTopicCatalogGroupedRes","description":"Grouped catalog response - sources with their topics."},"KafkaTopicCatalogRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number","default":1},"page_size":{"type":"integer","title":"Page Size","description":"Results per page","default":10},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Total number of results"},"has_next":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Next","description":"Whether more pages exist"},"result":{"items":{"$ref":"#/components/schemas/KafkaTopicCatalogEntry"},"type":"array","title":"Result"}},"additionalProperties":true,"type":"object","required":["result"],"title":"KafkaTopicCatalogRes","description":"Paginated topic catalog response."},"KafkaTopicSchemaRes":{"properties":{"topic_id":{"type":"string","title":"Topic Id"},"schema_fields":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Schema Fields"},"schema_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schema Type"}},"additionalProperties":true,"type":"object","required":["topic_id"],"title":"KafkaTopicSchemaRes","description":"Schema response for a single topic."},"KbRetrieveMatch":{"properties":{"chunk_id":{"type":"string","title":"Chunk Id"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"score":{"type":"number","title":"Score"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"additionalProperties":false,"type":"object","required":["chunk_id","score"],"title":"KbRetrieveMatch","description":"One match in a KB retrieval response.\n\n``chunk_id`` is the vector-store record's id. ``text`` is pulled\nfrom the chunk's metadata when the KB indexer stored it under the\nconventional ``\"text\"`` key — the full metadata dict is also\nsurfaced so callers can render arbitrary extra fields."},"KbRetrieveRequest":{"properties":{"query":{"type":"string","maxLength":4096,"minLength":1,"title":"Query"},"top_k":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Top K","default":5}},"additionalProperties":false,"type":"object","required":["query"],"title":"KbRetrieveRequest","description":"Request body for ``POST /knowledge-bases/{kb_id}/retrieve``.\n\n``query`` is the user's text; the BE embeds it against the KB's\nsaved embedding connection and runs a similarity search against\nthe saved vector-store connection. ``top_k`` caps the number of\nmatches returned."},"KbRetrieveResponse":{"properties":{"matches":{"items":{"$ref":"#/components/schemas/KbRetrieveMatch"},"type":"array","title":"Matches"}},"additionalProperties":false,"type":"object","required":["matches"],"title":"KbRetrieveResponse","description":"Response envelope for KB retrieval — ordered list of matches."},"KnowledgeBaseResponse":{"properties":{"_id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"job_type":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobTypeEnum"},"status":{"$ref":"#/components/schemas/FlinkJobStatusEnum"},"desired_status":{"anyOf":[{"$ref":"#/components/schemas/FlinkJobStatusEnum"},{"type":"null"}]},"flink_job_name":{"type":"string","title":"Flink Job Name"},"flink_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flink Job Id"},"parallelism":{"type":"integer","title":"Parallelism","default":1},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"agent_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Agent Config","description":"KB config (secrets masked)"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"created_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Timestamp"},"updated_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Timestamp"}},"additionalProperties":true,"type":"object","required":["_id","name","job_type","status","flink_job_name"],"title":"KnowledgeBaseResponse","description":"Response model for knowledge base entities. Mirrors FlinkJobResponse shape."},"LineageGroupMetricsRes":{"properties":{"max_latency_ms":{"type":"integer","title":"Max Latency Ms","description":"Maximum latency in milliseconds","default":0},"total_speed_rps":{"type":"number","title":"Total Speed Rps","description":"Total speed in records per second","default":0.0},"total_lag":{"type":"integer","title":"Total Lag","description":"Total consumer lag across all topics (sum)","default":0},"max_dest_latency_ms":{"type":"integer","title":"Max Dest Latency Ms","description":"Worst-partition destination wall-clock consumer latency (ms) across all reachable dest topics.","default":0},"topic_count":{"type":"integer","title":"Topic Count","description":"Number of topics","default":0},"error_count":{"type":"integer","title":"Error Count","description":"Number of errors","default":0}},"additionalProperties":true,"type":"object","title":"LineageGroupMetricsRes","description":"Metrics for a lineage group (source, destination, or transform)."},"LineageGroupRes":{"properties":{"id":{"type":"string","title":"Id","description":"Group ID"},"entity_id":{"type":"string","title":"Entity Id","description":"Entity ID"},"name":{"type":"string","title":"Name","description":"Display name"},"type":{"type":"string","title":"Type","description":"Entity type: 'source', 'destination', or 'transform'"},"connector":{"type":"string","title":"Connector","description":"Connector type identifier","default":""},"status":{"type":"string","title":"Status","description":"Current status","default":""},"topic_count":{"type":"integer","title":"Topic Count","description":"Number of associated topics. Reflects filtered count when topic_name and include_topics are both set.","default":0},"total_topic_count":{"type":"integer","title":"Total Topic Count","description":"Total number of topics regardless of topic_name filter","default":0},"metrics":{"anyOf":[{"$ref":"#/components/schemas/LineageGroupMetricsRes"},{"type":"null"}],"description":"Group-level metrics. Null when include_metrics=false."},"snapshot_progress":{"anyOf":[{"$ref":"#/components/schemas/SourceSnapshotProgressRes"},{"type":"null"}],"description":"Snapshot progress. Only present for source groups when include_metrics=true."},"last_audit_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Audit At","description":"ISO timestamp of the last completed QA metrics audit for this group. Only present for source_audit groups."},"topics":{"anyOf":[{"$ref":"#/components/schemas/EmbeddedTopicsRes"},{"type":"null"}],"description":"Embedded topics. Present when include_topics=true."}},"additionalProperties":true,"type":"object","required":["id","entity_id","name","type"],"title":"LineageGroupRes","description":"A single group in the lineage view."},"LineageGroupSortEnum":{"type":"string","enum":["name","topic_count","max_latency","total_speed","error_count"],"title":"LineageGroupSortEnum","description":"Sort field values for the lineage groups endpoint."},"LineageTopicRes":{"properties":{"id":{"type":"string","title":"Id","description":"Topic entity ID"},"name":{"type":"string","title":"Name","description":"Full topic name"},"source":{"$ref":"#/components/schemas/TopicSourceRef","description":"Source that produces this topic"},"metrics":{"anyOf":[{"$ref":"#/components/schemas/TopicMetricsDetailRes"},{"type":"null"}],"description":"Topic-level metrics. Null when include_metrics=false."},"snapshot_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshot Status","description":"Latest snapshot status for this topic: running, pending, completed, failed, or null if never snapshotted."},"snapshot_details":{"items":{"$ref":"#/components/schemas/TopicSnapshotStatusRes"},"type":"array","title":"Snapshot Details","description":"Detailed snapshot history for this topic. Empty list if never snapshotted."},"transforms":{"items":{"$ref":"#/components/schemas/TopicTransformRef"},"type":"array","title":"Transforms","description":"Transforms applied to this topic"},"destinations":{"items":{"$ref":"#/components/schemas/TopicDestinationRef"},"type":"array","title":"Destinations","description":"Destinations consuming this topic"}},"additionalProperties":true,"type":"object","required":["id","name","source"],"title":"LineageTopicRes","description":"A single topic in the lineage topics view."},"LineageTopicsBatchReq":{"properties":{"group_by":{"type":"string","enum":["source","destination","transform","source_audit"],"title":"Group By","description":"Grouping dimension"},"entity_ids":{"items":{"type":"string"},"type":"array","maxItems":100,"minItems":1,"title":"Entity Ids","description":"Entity IDs to fetch topics for"},"page_size":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Page Size","description":"Max topics per entity","default":20},"sort":{"type":"string","enum":["byteTotal","latency","speed","lag","name"],"title":"Sort","description":"Sort field for topics","default":"byteTotal"},"sort_dir":{"type":"string","enum":["asc","desc"],"title":"Sort Dir","description":"Sort direction","default":"desc"},"topic_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Name","description":"Topic name substring filter"},"filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter","description":"Comma-separated quick filters"},"include_metrics":{"type":"boolean","title":"Include Metrics","description":"When false, return metrics as null","default":true},"diff_bands":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Diff Bands","description":"Diff% multi-band filter for source_audit. Either a JSON array ([\"0-0.05\", \"0.05-2\"]) or a comma-separated string ('0-0.05,0.05-2'). Each band is an inclusive 'min-max' pair. Topic passes if its rounded-to-2-decimals max destination diff% falls in ANY band."}},"additionalProperties":true,"type":"object","required":["group_by","entity_ids"],"title":"LineageTopicsBatchReq","description":"Request body for POST /dashboard/lineage/topics/batch."},"LineageTopicsBatchRes":{"properties":{"groups":{"additionalProperties":{"$ref":"#/components/schemas/EmbeddedTopicsRes"},"type":"object","title":"Groups","description":"Topics grouped by entity ID"}},"additionalProperties":true,"type":"object","title":"LineageTopicsBatchRes","description":"Response for POST /dashboard/lineage/topics/batch."},"ListProviderModelsRequest":{"properties":{"provider":{"$ref":"#/components/schemas/AgentLlmProviderEnum"},"capability":{"$ref":"#/components/schemas/ConnectionCapability","description":"Which model list the FE wants. ``chat`` filters to chat + tool-capable models; ``embedding`` filters to embedding-capable models. Must be in ``PROVIDER_CAPABILITIES[provider]``."},"apiKey":{"type":"string","maxLength":512,"title":"Apikey","description":"Raw key - never stored","default":""},"baseUrl":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Baseurl"},"savedConnectionId":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Savedconnectionid","description":"If set, BE resolves provider/apiKey/baseUrl from the saved llmConnection by id."}},"additionalProperties":false,"type":"object","required":["provider","capability"],"title":"ListProviderModelsRequest","description":"Request body for POST /agents/models/live.\n\nSame two shapes as ``ValidateLlmRequest`` minus ``model`` - this endpoint\nlists every model the caller's credentials can see, it doesn't check a\nspecific one. ``savedConnectionId`` bypasses the inline-``apiKey``\nrequirement identically.\n\n``capability`` scopes which models the response should include:\n\n- ``chat`` — runs the chat-capable + tool-capable filters; returns each\n  model with its per-(provider, model) tuning matrix attached, since the\n  FE renders temperature / reasoning controls off that blob.\n- ``embedding`` — runs the embedding-capable filter; returns each model\n  as ``{value, label}`` (no tuning matrix — embedding endpoints accept\n  no temperature / reasoning controls).\n\nA second validator rejects (provider, capability) pairs that contradict\n:data:`PROVIDER_CAPABILITIES` (e.g. ``provider=anthropic`` +\n``capability=embedding``) before the BE wastes a round-trip on a\nrequest the matrix already pinned as impossible."},"LogBody":{"properties":{"source_ids":{"items":{"type":"string"},"type":"array","title":"Source Ids","default":[]},"destination_ids":{"items":{"type":"string"},"type":"array","title":"Destination Ids","default":[]},"transform_ids":{"items":{"type":"string"},"type":"array","title":"Transform Ids","default":[]}},"additionalProperties":true,"type":"object","title":"LogBody"},"LogCountFiltersApplied":{"properties":{"source_ids":{"items":{"type":"string"},"type":"array","title":"Source Ids","default":[]},"destination_ids":{"items":{"type":"string"},"type":"array","title":"Destination Ids","default":[]},"transform_ids":{"items":{"type":"string"},"type":"array","title":"Transform Ids","default":[]},"log_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Level"}},"additionalProperties":true,"type":"object","title":"LogCountFiltersApplied","description":"Filters that were applied to the count query."},"LogCountRequestBody":{"properties":{"source_ids":{"items":{"type":"string"},"type":"array","title":"Source Ids","default":[]},"destination_ids":{"items":{"type":"string"},"type":"array","title":"Destination Ids","default":[]},"transform_ids":{"items":{"type":"string"},"type":"array","title":"Transform Ids","default":[]}},"additionalProperties":true,"type":"object","title":"LogCountRequestBody","description":"Request body for log count endpoint."},"LogCountResponse":{"properties":{"count":{"type":"integer","title":"Count"},"since":{"type":"string","title":"Since"},"filters_applied":{"$ref":"#/components/schemas/LogCountFiltersApplied"}},"additionalProperties":true,"type":"object","required":["count","since","filters_applied"],"title":"LogCountResponse","description":"Response model for log count endpoint."},"ObservabilityAgentRollupItem":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"type":"string","enum":["streamkap","external"],"title":"Kind"},"label":{"type":"string","title":"Label"},"last_call_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Call At"},"calls_24h":{"type":"integer","title":"Calls 24H","default":0},"error_count_24h":{"type":"integer","title":"Error Count 24H","default":0},"top_error_code_24h":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Top Error Code 24H"}},"additionalProperties":false,"type":"object","required":["id","kind","label"],"title":"ObservabilityAgentRollupItem","description":"One row in the agent rollup list.\n\n``id`` is either a Mongo ObjectId string for ``kind=\"streamkap\"`` or\nthe synthetic ``external:<pk>:<cid>`` form for ``kind=\"external\"``."},"ObservabilityFlinkException":{"properties":{"timestamp":{"type":"string","title":"Timestamp"},"exception":{"type":"string","title":"Exception"},"task":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task"}},"additionalProperties":false,"type":"object","required":["timestamp","exception"],"title":"ObservabilityFlinkException","description":"One Flink-side exception from ``/jobs/{jid}/exceptions``."},"ObservabilityFlinkExceptionsResponse":{"properties":{"exceptions":{"items":{"$ref":"#/components/schemas/ObservabilityFlinkException"},"type":"array","title":"Exceptions"}},"additionalProperties":false,"type":"object","required":["exceptions"],"title":"ObservabilityFlinkExceptionsResponse","description":"`/agentic/observability/logs/exceptions` response envelope.\n\nEmpty list when the job isn't currently running (no ``flink_job_id``);\nthe endpoint returns 200 with ``exceptions=[]`` rather than 404 — a\njust-created or just-cancelled job is a valid scope, just one with\nnothing to surface from the JM REST."},"ObservabilityHistogramBucket":{"properties":{"bucket_start":{"type":"string","format":"date-time","title":"Bucket Start"},"success":{"type":"integer","title":"Success"},"error":{"type":"integer","title":"Error"},"denied":{"type":"integer","title":"Denied"}},"additionalProperties":false,"type":"object","required":["bucket_start","success","error","denied"],"title":"ObservabilityHistogramBucket"},"ObservabilityHistogramResponse":{"properties":{"buckets":{"items":{"$ref":"#/components/schemas/ObservabilityHistogramBucket"},"type":"array","title":"Buckets"},"total":{"type":"integer","title":"Total"}},"additionalProperties":false,"type":"object","required":["buckets","total"],"title":"ObservabilityHistogramResponse"},"ObservabilityIterationDetailResponse":{"properties":{"iteration_id":{"type":"string","title":"Iteration Id"},"operations":{"items":{"$ref":"#/components/schemas/ObservabilityOperation"},"type":"array","title":"Operations"},"truncated":{"type":"boolean","title":"Truncated","default":false}},"additionalProperties":false,"type":"object","required":["iteration_id","operations"],"title":"ObservabilityIterationDetailResponse","description":"`/agentic/observability/iterations/{iteration_id}` envelope.\n\nOperations are returned in execution order (timestamp, then a\nchat -> tool_call -> output tiebreak). ``truncated`` is ``True`` when a\ndefensive row cap was hit (runaway ReAct loop)."},"ObservabilityIterationItem":{"properties":{"iteration_id":{"type":"string","title":"Iteration Id"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"ended_at":{"type":"string","format":"date-time","title":"Ended At"},"op_count":{"type":"integer","title":"Op Count"},"error_count":{"type":"integer","title":"Error Count"},"duration_ms_total":{"type":"integer","title":"Duration Ms Total"},"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"},"agent_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Label"}},"additionalProperties":false,"type":"object","required":["iteration_id","started_at","ended_at","op_count","error_count","duration_ms_total"],"title":"ObservabilityIterationItem","description":"One row in the trace (iteration) rollup list.\n\nAn ``iteration_id`` groups all operations of one input-record's\nprocessing chain - the \"trace\" unit. ``duration_ms_total`` is the SUM of\nthe iteration's operation durations (the table timestamp is\nsecond-resolution, so wall-clock max-min collapses to 0). ``agent_id`` /\n``agent_label`` are populated only on the fleet-wide feed; on a\nper-agent view the agent is already known and they stay ``None``.\n\n``started_at`` / ``ended_at`` are UTC (the ClickHouse ``DateTime`` column\ncarries no timezone; the ``_force_utc`` validator stamps ``Z`` so the FE\nparses them as UTC, not local time)."},"ObservabilityIterationsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ObservabilityIterationItem"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Cursor"}},"additionalProperties":false,"type":"object","required":["items"],"title":"ObservabilityIterationsResponse","description":"`/agentic/observability/iterations` envelope.\n\n``next_cursor`` is the ``started_at`` of the last row in the page, or\n``None`` when fewer than ``limit`` rows came back (end of stream)."},"ObservabilityLogHistogramBucket":{"properties":{"bucket_start":{"type":"string","format":"date-time","title":"Bucket Start"},"error":{"type":"integer","title":"Error","default":0},"warn":{"type":"integer","title":"Warn","default":0},"info":{"type":"integer","title":"Info","default":0},"debug":{"type":"integer","title":"Debug","default":0},"total":{"type":"integer","title":"Total"}},"additionalProperties":false,"type":"object","required":["bucket_start","total"],"title":"ObservabilityLogHistogramBucket","description":"One bucket in the level-stacked log histogram."},"ObservabilityLogHistogramResponse":{"properties":{"buckets":{"items":{"$ref":"#/components/schemas/ObservabilityLogHistogramBucket"},"type":"array","title":"Buckets"},"total":{"type":"integer","title":"Total"}},"additionalProperties":false,"type":"object","required":["buckets","total"],"title":"ObservabilityLogHistogramResponse","description":"`/agentic/observability/logs/histogram` response envelope."},"ObservabilityLogLine":{"properties":{"timestamp":{"type":"string","title":"Timestamp"},"level":{"type":"string","title":"Level"},"message":{"type":"string","title":"Message"}},"additionalProperties":false,"type":"object","required":["timestamp","level","message"],"title":"ObservabilityLogLine","description":"One log line for the per-job log viewer.\n\n``timestamp`` is intentionally a string (not ``datetime``) so the wire\nshape matches the kubectl-path ``AgentLogLine`` byte-for-byte — the FE\nrenders it verbatim and doesn't parse it as a date. Format is\nClickHouse's default ``\"YYYY-MM-DD HH:MM:SS,sss\"``."},"ObservabilityLogsResponse":{"properties":{"lines":{"items":{"$ref":"#/components/schemas/ObservabilityLogLine"},"type":"array","title":"Lines"},"scope":{"type":"string","const":"agent","title":"Scope","default":"agent"},"job_id_prefix":{"type":"string","title":"Job Id Prefix"}},"additionalProperties":false,"type":"object","required":["lines","job_id_prefix"],"title":"ObservabilityLogsResponse","description":"`/agentic/observability/logs` response envelope.\n\n``scope`` always ``\"agent\"`` on this endpoint — per-job filtering\nis real (the ``job_id`` prefix LIKE catches only this entity's\nhistory). The kubectl-tail path's ``\"namespace\"`` value disappears\nhere. ``job_id_prefix`` is echoed back so the FE can render\n\"N versions\" hints when a redeployed agent's history is mixed in."},"ObservabilityOperation":{"properties":{"span_id":{"type":"string","title":"Span Id"},"operation":{"type":"string","title":"Operation"},"status":{"type":"string","title":"Status"},"duration_ms":{"type":"integer","title":"Duration Ms"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"input_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Input Tokens"},"output_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Tokens"}},"additionalProperties":false,"type":"object","required":["span_id","operation","status","duration_ms","timestamp"],"title":"ObservabilityOperation","description":"One operation (span) inside a trace iteration.\n\n``operation`` is ``chat`` | ``tool_call`` | ``output``. ``provider`` /\n``model`` are set on ``chat`` rows; ``tool_name`` on ``tool_call`` rows.\n``input_tokens`` / ``output_tokens`` are emitter-deferred (the runtime\nemits 0 today) and stay ``None`` until populated - the FE renders them\nonly when present."},"ObservabilitySessionItem":{"properties":{"session_id":{"type":"string","title":"Session Id"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"ended_at":{"type":"string","format":"date-time","title":"Ended At"},"call_count":{"type":"integer","title":"Call Count"},"error_count":{"type":"integer","title":"Error Count"},"p95_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"P95 Ms"},"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"},"agent_label":{"type":"string","title":"Agent Label"},"entity_kind":{"type":"string","enum":["streamkap","external"],"title":"Entity Kind"}},"additionalProperties":false,"type":"object","required":["session_id","started_at","ended_at","call_count","error_count","agent_label","entity_kind"],"title":"ObservabilitySessionItem","description":"One row in the sessions list.\n\n``agent_id`` / ``agent_label`` / ``entity_kind`` carry agent identity so\nthe FE Overview activity feed can render event-grain rows without an\nN+1 lookup against ``/sessions/{id}``. Identity rules mirror the rollup\nconvention in ``merge_agent_rollup``:\n\n- Streamkap: ``agent_id`` is the Mongo ObjectId, ``agent_label`` is the\n  agent ``name`` (falls back to the id), ``entity_kind == \"streamkap\"``.\n- External: ``agent_id`` is the synthetic ``external:<pk>:<cid>`` form,\n  ``agent_label`` is ``\"<pk[:8]> · <cid[:6]>\"``,\n  ``entity_kind == \"external\"``.\n- Defensive fallback (row carries neither): ``agent_id`` is ``None``,\n  ``agent_label`` is ``\"External · unknown\"``, ``entity_kind ==\n  \"external\"``. Should never fire in practice; keeps the FE shape\n  stable."},"ObservabilitySessionsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ObservabilitySessionItem"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Cursor"}},"additionalProperties":false,"type":"object","required":["items"],"title":"ObservabilitySessionsResponse","description":"`/agentic/observability/sessions` response envelope.\n\n``next_cursor`` is the ``started_at`` of the last row in the page, or\n``None`` when fewer than ``limit`` rows were returned (signalling end\nof stream to the FE)."},"ObservabilitySpan":{"properties":{"request_id":{"type":"string","title":"Request Id"},"tool_name":{"type":"string","title":"Tool Name"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"status":{"type":"string","title":"Status"},"response_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Response Size Bytes"},"response_truncated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Response Truncated"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"denied_by_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Denied By Profile"},"parameters":{"title":"Parameters"},"call_sequence":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Call Sequence"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"agent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent Id"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"project_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Project Key Id"},"tool_profile":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Profile"},"access_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Mode"}},"additionalProperties":false,"type":"object","required":["request_id","tool_name","started_at","status"],"title":"ObservabilitySpan","description":"One span row inside a session.\n\n``parameters`` is whatever JSON shape the MCP server logged after its\nown regex + 100-char-truncation sanitiser. We render as-is - never\nre-sanitise on the BE."},"ObservabilityToolsResponse":{"properties":{"tools":{"items":{"type":"string"},"type":"array","title":"Tools"}},"additionalProperties":false,"type":"object","required":["tools"],"title":"ObservabilityToolsResponse","description":"`/agentic/observability/tools` response.\n\nDistinct ``tool_name`` values within the requested filter scope. Powers\nthe FE TraceHeader tool-filter dropdown so it populates eagerly without\nrequiring the user to expand session spans first. Empty list is a\nlegitimate result (scope had no tool calls in the window) and the FE\nhides the dropdown in that case."},"ObservabilityTranscriptResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"rows":{"items":{"$ref":"#/components/schemas/ObservabilityTranscriptRow"},"type":"array","title":"Rows"},"truncated":{"type":"boolean","title":"Truncated","default":false}},"additionalProperties":false,"type":"object","required":["session_id","rows"],"title":"ObservabilityTranscriptResponse","description":"`/agentic/observability/sessions/{session_id}/transcript` envelope.\n\nRows are returned oldest-first so the FE can render the timeline in\nnatural reading order without an additional sort.\n\n``truncated`` is ``True`` when the BE applied a defensive row cap\non the underlying ClickHouse read (rare; happens when a runaway\nagent produced an unusually long session). The FE should surface a\n\"showing first N rows\" notice; full transcript is not paginatable\nat this endpoint (sessions are conceptually one timeline)."},"ObservabilityTranscriptRow":{"properties":{"event_timestamp":{"type":"string","format":"date-time","title":"Event Timestamp"},"agent_id":{"type":"string","title":"Agent Id"},"iteration_id":{"type":"string","title":"Iteration Id"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"operation":{"type":"string","enum":["chat","tool_call","output"],"title":"Operation"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"input_tokens":{"type":"integer","title":"Input Tokens","default":0},"output_tokens":{"type":"integer","title":"Output Tokens","default":0},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"tool_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Call Id"},"duration_ms":{"type":"integer","title":"Duration Ms","default":0},"status":{"type":"string","title":"Status"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"payload_truncated":{"type":"boolean","title":"Payload Truncated","default":false},"payload_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payload Text"}},"additionalProperties":false,"type":"object","required":["event_timestamp","agent_id","iteration_id","operation","status"],"title":"ObservabilityTranscriptRow","description":"One row inside a session's transcript timeline.\n\n    A row is the runtime's record of a single chat call, tool call, or\n    final output emission. ``iteration_id`` correlates rows that belong\n    to the same input-record processing chain (a ``chat`` followed by\n    one or more ``tool_call`` rows followed by another ``chat`` followed\n    by an ``output`` row all share an iteration id).\n\n    ``payload_text`` is capped at 32 KB UTF-8 by the runtime emitter\n    (matches the MCP cap). When the cap fires, ``payload_truncated`` is\n    ``True`` and the visible text ends with the ``\n... (truncated)``\n    marker.\n    "},"ObservabilityVerifyHit":{"properties":{"first_call_at":{"type":"string","format":"date-time","title":"First Call At"},"tool_name":{"type":"string","title":"Tool Name"},"status":{"type":"string","title":"Status"}},"additionalProperties":false,"type":"object","required":["first_call_at","tool_name","status"],"title":"ObservabilityVerifyHit","description":"Verify endpoint - match found."},"ObservabilityVerifyPending":{"properties":{"pending":{"type":"boolean","const":true,"title":"Pending","default":true}},"additionalProperties":false,"type":"object","title":"ObservabilityVerifyPending","description":"Verify endpoint - no row newer than ``since`` yet.\n\nDistinct model so the FE's polling loop can switch on `pending` cleanly\nwithout inspecting whether ``first_call_at`` happens to be ``None``."},"OutputSchemaField":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Output field name"},"type":{"type":"string","maxLength":50,"minLength":1,"title":"Type","description":"Output field type as the wizard renders it"}},"additionalProperties":false,"type":"object","required":["name","type"],"title":"OutputSchemaField","description":"One row of the output schema as the wizard's prompt-suggestion form sees it.\n\nLoosely typed - the suggestion endpoint only needs name/type prose for the\nmeta-prompt, so we don't reuse ``AgentOutputSchemaTypeEnum`` here. That keeps\nthe suggestion path tolerant of future schema-type additions without forcing\na model bump on the read-only suggestion surface."},"PartitionDetail":{"properties":{"partition_id":{"type":"integer","title":"Partition Id"},"replicas":{"items":{"type":"integer"},"type":"array","title":"Replicas"},"in_sync_replicas":{"items":{"type":"integer"},"type":"array","title":"In Sync Replicas"},"is_under_replicated":{"type":"boolean","title":"Is Under Replicated"},"is_offline":{"type":"boolean","title":"Is Offline"}},"additionalProperties":true,"type":"object","required":["partition_id","replicas","in_sync_replicas","is_under_replicated","is_offline"],"title":"PartitionDetail","description":"Customer-focused partition information."},"Permission":{"properties":{"id":{"type":"string","title":"Id","description":"Unique permission ID"},"key":{"type":"string","title":"Key","description":"Machine-readable permission key (e.g., 'read:sources')"},"name":{"type":"string","title":"Name","description":"Raw Frontegg permission name"},"display_name":{"type":"string","title":"Display Name","description":"Human-readable display name (sanitized, title-cased)"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Permission description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","description":"Raw Frontegg category name for grouping"},"display_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Category","description":"Human-readable category name for UI display"}},"additionalProperties":true,"type":"object","required":["id","key","name","display_name"],"title":"Permission","description":"Human-readable permission record from the Frontegg permission catalog."},"PipelineBaseMetrics":{"properties":{"timeseries":{"anyOf":[{"$ref":"#/components/schemas/PipelineTimeseriesMetrics"},{"type":"null"}]},"latest":{"anyOf":[{"$ref":"#/components/schemas/PipelineLatestMetrics"},{"type":"null"}]},"timesummary":{"anyOf":[{"$ref":"#/components/schemas/PipelineTimesummaryMetrics"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"PipelineBaseMetrics","description":"Pipeline base metrics."},"PipelineBasic":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"sub_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Id"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"snapshot_new_tables":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Snapshot New Tables"},"topic_ids":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array"},{"type":"null"}],"title":"Topic Ids"},"topics":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"array"},{"type":"null"}],"title":"Topics"},"source":{"anyOf":[{"$ref":"#/components/schemas/SourceConnector"},{"type":"null"}]},"destination":{"anyOf":[{"$ref":"#/components/schemas/DestinationConnector"},{"type":"null"}]},"transforms":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Transforms"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","default":[]},"periodic_audit":{"anyOf":[{"$ref":"#/components/schemas/UpdatePipelineAuditReq"},{"type":"null"}]},"topic_auto_discovery_transforms":{"items":{"$ref":"#/components/schemas/TopicAutoDiscoveryTransform"},"type":"array","title":"Topic Auto Discovery Transforms","default":[]}},"additionalProperties":true,"type":"object","title":"PipelineBasic"},"PipelineDestinationConnector":{"properties":{"connector":{"type":"string","title":"Connector"},"name":{"type":"string","title":"Name"},"id":{"type":"string","title":"Id"}},"additionalProperties":true,"type":"object","required":["connector","name","id"],"title":"PipelineDestinationConnector"},"PipelineLatestMetrics":{"properties":{"latency":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Latency"},"recordsLag":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Recordslag"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"additionalProperties":true,"type":"object","title":"PipelineLatestMetrics","description":"Pipeline latest metrics."},"PipelineLatestMetricsWithMetadata":{"properties":{"data":{"$ref":"#/components/schemas/PipelineLatestMetrics"},"metadata":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Metadata"}},"additionalProperties":true,"type":"object","required":["data","metadata"],"title":"PipelineLatestMetricsWithMetadata","description":"Pipeline latest metrics with metadata."},"PipelineMetricsReqBody":{"properties":{"ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Ids","description":"List of pipeline IDs (as array) or comma-separated string. Body takes precedence over query params."},"tenant_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Tenant Ids","description":"List of tenant IDs (as array) or comma-separated string. Body takes precedence over query params."}},"additionalProperties":true,"type":"object","title":"PipelineMetricsReqBody","description":"Body model for POST /pipelines/metrics requests.\n\nSupports large lists of IDs that would exceed URL length limits when using GET.\nBody parameters take precedence over query parameters when both are provided."},"PipelineMetricsRes":{"properties":{"account_metrics":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/PipelineBaseMetrics"},"type":"object"},{"type":"null"}],"title":"Account Metrics"},"connector_metrics":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/PipelineBaseMetrics"},"type":"object"},{"type":"null"}],"title":"Connector Metrics"},"inline_metrics":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/PipelineBaseMetrics"},"type":"object"},{"type":"null"}],"title":"Inline Metrics"},"task_metrics":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/PipelineBaseMetrics"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Task Metrics"},"topic_metrics":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/PipelineBaseMetrics"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Topic Metrics"}},"additionalProperties":true,"type":"object","title":"PipelineMetricsRes","description":"Pipeline metrics response."},"PipelineSourceConnector":{"properties":{"connector":{"type":"string","title":"Connector"},"name":{"type":"string","title":"Name"},"id":{"type":"string","title":"Id"},"topics":{"items":{"type":"string"},"type":"array","title":"Topics"}},"additionalProperties":true,"type":"object","required":["connector","name","id","topics"],"title":"PipelineSourceConnector"},"PipelineTimeseriesMetrics":{"properties":{"latency":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Latency","default":[]},"recordsLag":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Recordslag","default":[]},"status":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Status","default":[]}},"additionalProperties":true,"type":"object","title":"PipelineTimeseriesMetrics","description":"Pipeline timeseries metrics."},"PipelineTimesummaryMetrics":{"properties":{"latency":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Latency"},"recordsLag":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Recordslag"},"status":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Status"}},"additionalProperties":true,"type":"object","title":"PipelineTimesummaryMetrics","description":"Pipeline timesummary metrics."},"PipelineTransformConnector":{"properties":{"topic_id":{"type":"string","title":"Topic Id"}},"additionalProperties":true,"type":"object","required":["topic_id"],"title":"PipelineTransformConnector"},"PipelinesPaginatedReqBody":{"properties":{"tag_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Tag Ids","description":"List of tag IDs (as array) or comma-separated string. Body takes precedence over query params."},"tag_filter_operation":{"anyOf":[{"type":"string","enum":["and","or"]},{"type":"null"}],"title":"Tag Filter Operation","description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags. Body takes precedence over query params."},"source_id":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Source Id","description":"List of source IDs (as array) or comma-separated string. Body takes precedence over query params."},"destination_id":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Destination Id","description":"List of destination IDs (as array) or comma-separated string. Body takes precedence over query params."},"status":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Status","description":"List of statuses (as array) or comma-separated string. Body takes precedence over query params."}},"additionalProperties":true,"type":"object","title":"PipelinesPaginatedReqBody","description":"Body model for POST /pipelines/search requests.\n\nSupports large lists of filter values that would exceed URL length limits when using GET.\nBody parameters take precedence over query parameters when both are provided."},"PipelinesPaginatedRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number","default":1},"page_size":{"type":"integer","title":"Page Size","description":"Results per page","default":10},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Total number of results"},"has_next":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Next","description":"Whether more pages exist"},"result":{"items":{"$ref":"#/components/schemas/PipelineBasic"},"type":"array","title":"Result"}},"additionalProperties":true,"type":"object","required":["result"],"title":"PipelinesPaginatedRes","description":"Get paginated Pipelines response."},"ProjectKeyApiCredentials":{"properties":{"client_id":{"type":"string","title":"Client Id"},"client_secret":{"type":"string","title":"Client Secret"},"token_endpoint":{"type":"string","title":"Token Endpoint"},"api_url":{"type":"string","title":"Api Url"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"}},"additionalProperties":true,"type":"object","required":["client_id","client_secret","token_endpoint","api_url"],"title":"ProjectKeyApiCredentials","description":"API credential section of the credential file."},"ProjectKeyCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Human-readable name for this Project Key"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Optional description (HTML sanitized)"},"role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Role Ids","description":"Role IDs to assign. Mutually exclusive with permission_ids."},"permission_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Permission Ids","description":"Permission IDs to assign directly. Mutually exclusive with role_ids."},"kafka_config":{"anyOf":[{"$ref":"#/components/schemas/ProjectKeyKafkaConfig"},{"type":"null"}],"description":"Kafka credentials and ACL config. Omit for API-only key."},"tool_profile":{"anyOf":[{"$ref":"#/components/schemas/ToolProfile"},{"type":"null"}],"description":"MCP tool profile (full, read-only, agent-operator, infra-admin)"},"allowed_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Tools","description":"MCP tool whitelist. If set, overrides profile and block list."},"blocked_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Blocked Tools","description":"MCP tool blacklist. Removes tools even if profile allows them."},"agentic_enabled":{"type":"boolean","title":"Agentic Enabled","description":"When true, atomically seeds ``agentic_secret_blob`` on the new PK row from the credential file produced during creation. The PK is then immediately usable as the auth blob behind the Streamkap MCP. Requires API credentials (role_ids or permission_ids) - rejected with 400 on Kafka-only PKs since there is no API credential to seed. Audit-logged with action=enable. Post-creation toggling goes through POST /project-keys/{id}/enable-agentic or /disable-agentic.","default":false}},"additionalProperties":true,"type":"object","required":["name"],"title":"ProjectKeyCreateRequest","description":"Request body for creating a Project Key."},"ProjectKeyCredentialFile":{"properties":{"type":{"type":"string","title":"Type","default":"streamkap_project_key"},"project_key_id":{"type":"string","title":"Project Key Id"},"project":{"additionalProperties":true,"type":"object","title":"Project"},"api":{"anyOf":[{"$ref":"#/components/schemas/ProjectKeyApiCredentials"},{"type":"null"}]},"kafka":{"anyOf":[{"$ref":"#/components/schemas/ProjectKeyKafkaCredentials"},{"type":"null"}]},"kafka_acls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Kafka Acls"},"tool_profile":{"anyOf":[{"$ref":"#/components/schemas/ToolProfile"},{"type":"null"}]},"allowed_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Tools"},"blocked_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Blocked Tools"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"}},"additionalProperties":true,"type":"object","required":["project_key_id","project","created_at"],"title":"ProjectKeyCredentialFile","description":"The downloadable .json credential file returned at creation time."},"ProjectKeyDetail":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"created_by_user":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"api_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Client Id"},"api_client_id_masked_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Client Id Masked Secret"},"kafka_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kafka Username"},"service_id":{"type":"string","title":"Service Id"},"roles":{"items":{"$ref":"#/components/schemas/Role"},"type":"array","title":"Roles"},"status":{"type":"string","title":"Status"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"tool_profile":{"anyOf":[{"$ref":"#/components/schemas/ToolProfile"},{"type":"null"}]},"allowed_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Tools"},"blocked_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Blocked Tools"},"agentic_enabled":{"type":"boolean","title":"Agentic Enabled","description":"Whether this Project Key is wired up as the auth blob behind the Streamkap MCP. Toggled via POST /project-keys/{id}/enable-agentic and disable-agentic. When true, the encrypted credential lives on the PK row (server-side only); the agent picker on the FE filters to PKs where this is true.","default":false},"agentic_secret_blob":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentic Secret Blob","description":"Always masked to '********' on responses when agentic_enabled is true; null otherwise. Server-derived only - PUT/PATCH bodies that include this field are rejected with 422."},"kafka_acls":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Kafka Acls"},"whitelist_ips":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whitelist Ips"},"kafka_proxy_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kafka Proxy Endpoint","description":"Kafka proxy endpoint (e.g. host:32400)"},"schema_proxy_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schema Proxy Endpoint","description":"Schema Registry proxy endpoint"},"token_ttl_seconds":{"type":"integer","title":"Token Ttl Seconds","description":"Frontegg JWT token TTL in seconds (dynamic - reflects the current tenant-level authentication token expiration setting in Frontegg). Frontend uses this to display 'role changes take effect within X hours' on role updates."}},"additionalProperties":true,"type":"object","required":["id","name","service_id","status"],"title":"ProjectKeyDetail","description":"Detail response for GET /project-keys/{id} - includes Kafka ACLs, whitelist IPs, and proxy endpoints."},"ProjectKeyKafkaConfig":{"properties":{"username":{"type":"string","maxLength":24,"minLength":3,"pattern":"^[a-zA-Z0-9-]+$","title":"Username","description":"Kafka username (alphanumeric + hyphens, 3-24 chars)"},"password":{"type":"string","maxLength":128,"minLength":12,"title":"Password","description":"Kafka SASL password (12-128 chars)"},"whitelist_ips":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Whitelist Ips","description":"Comma-separated IP addresses or CIDR ranges"},"kafka_acls":{"items":{"$ref":"#/components/schemas/KafkaAclModel"},"type":"array","title":"Kafka Acls","description":"Kafka ACL rules for topic/group access control"},"is_create_schema_registry":{"type":"boolean","title":"Is Create Schema Registry","description":"Whether to create a Schema Registry proxy","default":false}},"additionalProperties":true,"type":"object","required":["username","password"],"title":"ProjectKeyKafkaConfig","description":"Kafka user configuration for a Project Key."},"ProjectKeyKafkaCredentials":{"properties":{"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"bootstrap_servers":{"type":"string","title":"Bootstrap Servers"},"security_protocol":{"type":"string","title":"Security Protocol","default":"SASL_SSL"},"sasl_mechanism":{"type":"string","title":"Sasl Mechanism","default":"PLAIN"},"schema_registry_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schema Registry Url"}},"additionalProperties":true,"type":"object","required":["username","password","bootstrap_servers"],"title":"ProjectKeyKafkaCredentials","description":"Kafka credential section of the credential file."},"ProjectKeyMcpConfig":{"properties":{"project_key_id":{"type":"string","title":"Project Key Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"service_id":{"type":"string","title":"Service Id"},"kafka_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kafka Username"},"tool_profile":{"anyOf":[{"$ref":"#/components/schemas/ToolProfile"},{"type":"null"}]},"allowed_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Tools"},"blocked_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Blocked Tools"}},"additionalProperties":true,"type":"object","required":["project_key_id","tenant_id","service_id"],"title":"ProjectKeyMcpConfig","description":"Authoritative MCP tool scoping config for server-side enforcement.\n\nIncludes identity fields (tenant_id, service_id, kafka_username) so the MCP\nserver can enrich audit logs with verified context without trusting the credential file."},"ProjectKeySummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"created_by_user":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"api_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Client Id"},"api_client_id_masked_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Client Id Masked Secret"},"kafka_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kafka Username"},"service_id":{"type":"string","title":"Service Id"},"roles":{"items":{"$ref":"#/components/schemas/Role"},"type":"array","title":"Roles"},"status":{"type":"string","title":"Status"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"tool_profile":{"anyOf":[{"$ref":"#/components/schemas/ToolProfile"},{"type":"null"}]},"allowed_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Tools"},"blocked_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Blocked Tools"},"agentic_enabled":{"type":"boolean","title":"Agentic Enabled","description":"Whether this Project Key is wired up as the auth blob behind the Streamkap MCP. Toggled via POST /project-keys/{id}/enable-agentic and disable-agentic. When true, the encrypted credential lives on the PK row (server-side only); the agent picker on the FE filters to PKs where this is true.","default":false},"agentic_secret_blob":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentic Secret Blob","description":"Always masked to '********' on responses when agentic_enabled is true; null otherwise. Server-derived only - PUT/PATCH bodies that include this field are rejected with 422."}},"additionalProperties":true,"type":"object","required":["id","name","service_id","status"],"title":"ProjectKeySummary","description":"Summary response for listing Project Keys (no secrets)."},"ProjectKeyUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name","description":"Updated name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Updated description (HTML sanitized)"},"role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Role Ids","description":"Change the Frontegg roles for this PK, or assign roles when adding API access to a Kafka-only PK. Note: changing roles on an existing API credential only takes effect when the current JWT expires. See token_ttl_seconds in the detail response for the validity window."},"permission_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","minItems":1},{"type":"null"}],"title":"Permission Ids","description":"Assign fine-grained permissions when ADDING API access to a Kafka-only PK. Changing permissions on an existing API credential is NOT supported - to change permissions on an existing PK, either switch to role_ids or delete and recreate the PK. This field is only accepted when the PK has no api_client_id yet."},"kafka_acls":{"anyOf":[{"items":{"$ref":"#/components/schemas/KafkaAclModel"},"type":"array"},{"type":"null"}],"title":"Kafka Acls"},"whitelist_ips":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whitelist Ips"},"kafka_config":{"anyOf":[{"$ref":"#/components/schemas/ProjectKeyKafkaConfig"},{"type":"null"}],"description":"Add Kafka access to a PK that currently has none. Only valid when the PK has no Kafka user yet."},"kafka_password":{"anyOf":[{"type":"string","maxLength":128,"minLength":12},{"type":"null"}],"title":"Kafka Password","description":"Rotate the Kafka SASL password for an existing Kafka user. PK must have kafka_username."},"tool_profile":{"anyOf":[{"$ref":"#/components/schemas/ToolProfile"},{"type":"null"}]},"allowed_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Tools"},"blocked_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Blocked Tools"}},"additionalProperties":true,"type":"object","title":"ProjectKeyUpdateRequest","description":"Request body for updating a Project Key."},"ProjectKeyUpdateResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"created_by_user":{"anyOf":[{"$ref":"#/components/schemas/User"},{"type":"null"}]},"api_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Client Id"},"api_client_id_masked_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Client Id Masked Secret"},"kafka_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kafka Username"},"service_id":{"type":"string","title":"Service Id"},"roles":{"items":{"$ref":"#/components/schemas/Role"},"type":"array","title":"Roles"},"status":{"type":"string","title":"Status"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"tool_profile":{"anyOf":[{"$ref":"#/components/schemas/ToolProfile"},{"type":"null"}]},"allowed_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Tools"},"blocked_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Blocked Tools"},"agentic_enabled":{"type":"boolean","title":"Agentic Enabled","description":"Whether this Project Key is wired up as the auth blob behind the Streamkap MCP. Toggled via POST /project-keys/{id}/enable-agentic and disable-agentic. When true, the encrypted credential lives on the PK row (server-side only); the agent picker on the FE filters to PKs where this is true.","default":false},"agentic_secret_blob":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentic Secret Blob","description":"Always masked to '********' on responses when agentic_enabled is true; null otherwise. Server-derived only - PUT/PATCH bodies that include this field are rejected with 422."},"new_api_credentials":{"anyOf":[{"$ref":"#/components/schemas/ProjectKeyApiCredentials"},{"type":"null"}],"description":"Present only when API credentials were ADDED to a Kafka-only PK. Contains the plaintext client_secret - shown only once."},"new_kafka_credentials":{"anyOf":[{"$ref":"#/components/schemas/ProjectKeyKafkaCredentials"},{"type":"null"}],"description":"Present only when Kafka access was ADDED to an API-only PK. Contains the plaintext Kafka password - shown only once."},"token_ttl_seconds":{"type":"integer","title":"Token Ttl Seconds","description":"Current Frontegg JWT TTL in seconds (dynamic). Used by the frontend to compute how long role changes take to propagate."},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","description":"Non-blocking informational messages the frontend should surface to the user after the update (e.g. 'role changes take effect within X hours'). Empty list when there is nothing to warn about."}},"additionalProperties":true,"type":"object","required":["id","name","service_id","status"],"title":"ProjectKeyUpdateResponse","description":"Response for PATCH /project-keys/{id}.\n\nExtends the summary with plaintext secrets when an additive capability transition\noccurred. For regular updates (no capability change), both `new_api_credentials` and\n`new_kafka_credentials` are None."},"QACountsRequest":{"properties":{"topic_ids":{"items":{"type":"string"},"type":"array","title":"Topic Ids"}},"type":"object","required":["topic_ids"],"title":"QACountsRequest"},"RedeployAgentRequest":{"properties":{"withSavepoint":{"type":"boolean","title":"Withsavepoint","description":"If True and a savepoint exists, resume from it (preserves Kafka offsets and state).","default":true}},"additionalProperties":false,"type":"object","title":"RedeployAgentRequest","description":"Request body for POST /agents/{id}/redeploy."},"ResetOffsetsRequest":{"properties":{"topics":{"items":{"type":"string"},"type":"array","title":"Topics","description":"Topics to reset offsets for"},"strategy":{"type":"string","enum":["earliest","latest","timestamp","offset"],"title":"Strategy","description":"Offset reset strategy"},"timestamp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Timestamp","description":"Unix timestamp in ms (for 'timestamp' strategy)"},"offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Offset","description":"Specific offset value (for 'offset' strategy)"}},"additionalProperties":true,"type":"object","required":["topics","strategy"],"title":"ResetOffsetsRequest","description":"Request body for resetting consumer group offsets."},"Role":{"properties":{"id":{"type":"string","title":"Id"},"key":{"type":"string","title":"Key"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"permissions":{"items":{"type":"string"},"type":"array","title":"Permissions"}},"type":"object","required":["id","key","name","description"],"title":"Role"},"RollbackAgentConfigRequest":{"properties":{"targetVersion":{"type":"integer","minimum":0.0,"title":"Targetversion","description":"The existing version number whose config will be copied into a new version. Version 0 is the initial ``change_kind='create'`` snapshot."},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note","description":"Optional user-supplied context - recorded on the new rollback row."}},"additionalProperties":false,"type":"object","required":["targetVersion"],"title":"RollbackAgentConfigRequest","description":"Request body for ``POST /agents/{id}/config/rollback``."},"SampleRecordRequest":{"properties":{"topicPattern":{"type":"string","maxLength":1024,"minLength":1,"title":"Topicpattern","description":"Regex pattern for input topics, e.g. '^(orders)$'"},"inputSerialization":{"$ref":"#/components/schemas/SampleRecordSerializationEnum","description":"Format used to deserialize the latest record"}},"additionalProperties":false,"type":"object","required":["topicPattern","inputSerialization"],"title":"SampleRecordRequest","description":"Request body for ``POST /agents/sample-record``.\n\nMirrors the shape of :class:`AgentInputConfig` so the FE can forward the\nwizard's input config straight through without remapping field names."},"SampleRecordResponse":{"properties":{"record":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Record","description":"The latest deserialized record, or null if none was found"},"sourceTopic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sourcetopic","description":"Concrete topic name the record came from after regex resolution"},"errorMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errormessage","description":"Set when a topic was found but its latest record could not be read or deserialized"}},"additionalProperties":false,"type":"object","title":"SampleRecordResponse","description":"Response body for ``POST /agents/sample-record``.\n\nAll three fields nullable because every \"no record found\" branch (regex\nmatches no topic, every matched topic is empty, or deserialization\nfails) is a 200 with explanatory state - not an HTTP error - so the FE\ncan render a hint inline without retry logic."},"SampleRecordSerializationEnum":{"type":"string","enum":["AvroConfluent","JsonConfluent","Protobuf","String"],"title":"SampleRecordSerializationEnum","description":"Input deserialization formats accepted by ``POST /agents/sample-record``.\n\nWider than :class:`AgentSerializationEnum` (which only governs the agent\nruntime contract) - this endpoint also accepts the raw shapes a topic may\ncarry in the wild so the FE can pre-fill the test pane regardless of how\nthe source upstream is producing."},"ScaleClusterRequest":{"properties":{"direction":{"$ref":"#/components/schemas/ScaleDirection"}},"additionalProperties":true,"type":"object","required":["direction"],"title":"ScaleClusterRequest"},"ScaleClusterResponse":{"properties":{"operation_id":{"type":"string","title":"Operation Id"},"status":{"$ref":"#/components/schemas/ScaleOperationStatus"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"additionalProperties":true,"type":"object","required":["operation_id","status"],"title":"ScaleClusterResponse"},"ScaleDirection":{"type":"string","enum":["up","down"],"title":"ScaleDirection"},"ScaleOperationStatus":{"type":"string","enum":["pending","in_progress","completed","failed","cancelled"],"title":"ScaleOperationStatus"},"ScaleOperationStatusResponse":{"properties":{"operation_id":{"type":"string","title":"Operation Id"},"direction":{"$ref":"#/components/schemas/ScaleDirection"},"status":{"$ref":"#/components/schemas/ScaleOperationStatus"},"current_step":{"type":"integer","title":"Current Step"},"total_steps":{"type":"integer","title":"Total Steps","default":6},"steps":{"items":{"$ref":"#/components/schemas/StepDetail"},"type":"array","title":"Steps"},"cluster_name":{"type":"string","title":"Cluster Name"},"namespace":{"type":"string","title":"Namespace"},"initiated_by":{"type":"string","title":"Initiated By"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"timing_summary":{"anyOf":[{"$ref":"#/components/schemas/TimingSummary"},{"type":"null"}]}},"additionalProperties":true,"type":"object","required":["operation_id","direction","status","current_step","steps","cluster_name","namespace","initiated_by","created_at","updated_at"],"title":"ScaleOperationStatusResponse"},"SchemaDetail":{"properties":{"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject","description":"Schema subject name"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version","description":"Schema version"},"id":{"type":"integer","title":"Id","description":"Global schema ID"},"schema_type":{"type":"string","title":"Schema Type","description":"Schema type (AVRO, JSON, PROTOBUF)","default":"AVRO"},"schema":{"type":"string","title":"Schema","description":"Schema definition string"},"references":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"References","description":"Schema references"}},"additionalProperties":true,"type":"object","required":["id","schema"],"title":"SchemaDetail","description":"Complete schema information."},"SchemaSubjectListItem":{"properties":{"subject":{"type":"string","title":"Subject","description":"Schema subject name"},"schema_type":{"type":"string","title":"Schema Type","description":"Schema type (AVRO, JSON, PROTOBUF)"},"latest_version":{"type":"integer","title":"Latest Version","description":"Latest schema version"},"latest_schema_id":{"type":"integer","title":"Latest Schema Id","description":"Latest schema ID"}},"additionalProperties":true,"type":"object","required":["subject","schema_type","latest_version","latest_schema_id"],"title":"SchemaSubjectListItem","description":"Schema subject with metadata."},"SchemaSubjectsPaginatedRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number"},"page_size":{"type":"integer","title":"Page Size","description":"Items per page"},"total":{"type":"integer","title":"Total","description":"Total number of subjects"},"result":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"items":{"$ref":"#/components/schemas/SchemaSubjectListItem"},"type":"array"}],"title":"Result","description":"List of schema subjects"}},"additionalProperties":true,"type":"object","required":["page","page_size","total","result"],"title":"SchemaSubjectsPaginatedRes","description":"Paginated schema subjects list response."},"SerializationFormatEnum":{"type":"string","enum":["avro","json","json_schema","protobuf","string","bytearray","unknown"],"title":"SerializationFormatEnum","description":"Human-readable serialization format names for API responses."},"SingleTopicTableMetricReq":{"properties":{"id":{"type":"string","title":"Id"},"entity_type":{"type":"string","title":"Entity Type"},"connector":{"type":"string","title":"Connector"},"topic_ids":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Topic Ids"},"topic_db_ids":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Topic Db Ids"}},"additionalProperties":true,"type":"object","required":["id","entity_type","connector","topic_ids","topic_db_ids"],"title":"SingleTopicTableMetricReq"},"SortDirectionEnum":{"type":"string","enum":["asc","desc"],"title":"SortDirectionEnum","description":"Sort direction for list/pagination requests.\n\nExample:\n    >>> SortDirectionEnum.asc\n    'asc'\n    >>> sort_dir = SortDirectionEnum.desc\n    >>> f\"ORDER BY name {sort_dir.upper()}\"\n    'ORDER BY name DESC'"},"SourceBaseMetrics":{"properties":{"timeseries":{"anyOf":[{"$ref":"#/components/schemas/SourceTimeseriesMetrics"},{"type":"null"}]},"latest":{"anyOf":[{"$ref":"#/components/schemas/SourceLatestMetrics"},{"type":"null"}]},"timesummary":{"anyOf":[{"$ref":"#/components/schemas/SourceTimesummaryMetrics"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"SourceBaseMetrics","description":"Source base metrics."},"SourceConnector":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"User-defined connector name"},"connector":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector","description":"Connector type (e.g., 'postgresql', 'mysql', 'mongodb')"},"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id","description":"Unique identifier"},"connector_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Display Name","description":"Human-readable connector type name"},"created_timestamp":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Timestamp","description":"Creation timestamp (ISO 8601)"},"sub_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sub Id","description":"Subscription identifier"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id","description":"Tenant identifier for multi-tenancy"},"service_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Id","description":"Associated service identifier"},"config":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"boolean"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Config","description":"Connector configuration parameters"},"topic_ids":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array"},{"type":"null"}],"title":"Topic Ids","description":"List of associated topic identifiers"},"topic_map":{"anyOf":[{"additionalProperties":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array"},"type":"object"},{"type":"null"}],"title":"Topic Map","description":"Mapping of topics to their partitions or related entities"},"topics":{"anyOf":[{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array"},{"type":"null"}],"title":"Topics","description":"List of topic names"},"tasks":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Tasks","description":"List of task identifiers"},"connector_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Status","description":"Current status: Active, Paused, Stopped, Broken, Starting, Unassigned, Unknown, Pending"},"desired_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Desired State","description":"Desired state: Pending, Active, Paused, Stopped"},"kc_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kc Cluster Id","description":"KC cluster this connector is deployed to. None means default cluster."},"task_statuses":{"anyOf":[{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"object"},"type":"object"},{"type":"null"}],"title":"Task Statuses","description":"Status information for each connector task"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs assigned to this source"}},"additionalProperties":true,"type":"object","title":"SourceConnector","description":"Source connector configuration and status."},"SourceConnectorEnum":{"type":"string","enum":["alloydb","elasticsearch","mongodbhosted","mongodb","sqlserveraws","mariadb","mysql","postgresql","oracle","documentdb","oracleaws","kafkadirect","redis","s3","webhook","zendesk_webhook","salesforce_webhook","shopify_webhook","stripe_webhook","db2","dynamodb","vitess","planetscale","supabase","informix"],"title":"SourceConnectorEnum","description":"Available source connector types for CDC data ingestion.\n\nIncludes relational databases (PostgreSQL, MySQL, SQL Server, Oracle),\nNoSQL databases (MongoDB, DynamoDB), and direct Kafka connections."},"SourceInviteBody":{"properties":{"to_email":{"type":"string","title":"To Email","description":"Email address of the user to invite"},"message":{"type":"string","title":"Message","description":"Custom message to include in the invitation"},"connectorType":{"type":"string","title":"Connectortype","description":"Type of connector being shared"},"returnUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Returnurl","description":"URL to redirect to after invitation is accepted"}},"additionalProperties":true,"type":"object","required":["to_email","message","connectorType"],"title":"SourceInviteBody","description":"Source Invite body"},"SourceLatestMetrics":{"properties":{"SnapshotTotalNumberOfEventsSeen":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Snapshottotalnumberofeventsseen"},"SnapshotMilliSecondsSinceLastEvent":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Snapshotmillisecondssincelastevent"},"StreamingMilliSecondsBehindSource":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Streamingmillisecondsbehindsource"},"StreamingTotalNumberOfDeleteEventsSeen":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Streamingtotalnumberofdeleteeventsseen"},"StreamingTotalNumberOfUpdateEventsSeen":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Streamingtotalnumberofupdateeventsseen"},"StreamingTotalNumberOfCreateEventsSeen":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Streamingtotalnumberofcreateeventsseen"},"StreamingMilliSecondsSinceLastEvent":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Streamingmillisecondssincelastevent"},"StreamingLastEvent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Streaminglastevent"},"recordRetryTotal":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Recordretrytotal"},"byteTotal":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Bytetotal"},"sourceRecordWriteTotal":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Sourcerecordwritetotal"},"SnapshotRunning":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Snapshotrunning"},"SnapshotCompleted":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Snapshotcompleted"},"StreamingConnected":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Streamingconnected"},"recordSendTotal":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Recordsendtotal"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"streamingState":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Streamingstate"},"snapshotStatus":{"anyOf":[{"items":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"type":"object"},"type":"array"},{"type":"null"}],"title":"Snapshotstatus","default":[]},"snapshotState":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshotstate"},"recordWrittenTotal":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Recordwrittentotal"},"connector_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Status"},"latency":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Latency"}},"additionalProperties":true,"type":"object","title":"SourceLatestMetrics","description":"Source latest metrics.","example":{"SnapshotCompleted":2,"SnapshotMilliSecondsSinceLastEvent":3600000,"SnapshotRunning":0,"SnapshotTotalNumberOfEventsSeen":20254,"StreamingConnected":1,"StreamingLastEvent":"position: {ord: 14}, key: {\"id\" : \"\"ceaafb88-2a60-4bd9-8515-719ba64ea05c-close\"\"}","StreamingMilliSecondsBehindSource":500,"StreamingMilliSecondsSinceLastEvent":200,"StreamingTotalNumberOfCreateEventsSeen":73,"StreamingTotalNumberOfDeleteEventsSeen":312,"StreamingTotalNumberOfUpdateEventsSeen":0,"byteTotal":9018776,"connector_status":"Active","latency":150,"recordRetryTotal":10,"recordSendTotal":400,"recordWrittenTotal":395,"snapshotState":"completed","snapshotStatus":[{"status":"completed","submit_timestamp":"2023-10-01T10:00:00Z","topic_id":"source_111111111111111111111111.Test.test_data1"},{"status":"completed","submit_timestamp":"2023-10-01T10:10:00Z","topic_id":"source_111111111111111111111111.Test.test_data2"}],"sourceRecordWriteTotal":27785,"state":"Streaming","streamingState":"connected"}},"SourceLatestMetricsWithMetadata":{"properties":{"data":{"$ref":"#/components/schemas/SourceLatestMetrics"},"metadata":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Metadata"}},"additionalProperties":true,"type":"object","required":["data","metadata"],"title":"SourceLatestMetricsWithMetadata"},"SourceMetricsReqBody":{"properties":{"ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Ids","description":"List of source IDs (as array) or comma-separated string. Body takes precedence over query params."},"tenant_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Tenant Ids","description":"List of tenant IDs (as array) or comma-separated string. Body takes precedence over query params."}},"additionalProperties":true,"type":"object","title":"SourceMetricsReqBody","description":"Body model for POST /sources/metrics requests.\n\nSupports large lists of IDs that would exceed URL length limits when using GET.\nBody parameters take precedence over query parameters when both are provided."},"SourceMetricsRes":{"properties":{"account_metrics":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/SourceBaseMetrics"},"type":"object"},{"type":"null"}],"title":"Account Metrics"},"connector_metrics":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/SourceBaseMetrics"},"type":"object"},{"type":"null"}],"title":"Connector Metrics"},"inline_metrics":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/SourceBaseMetrics"},"type":"object"},{"type":"null"}],"title":"Inline Metrics"},"task_metrics":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/SourceBaseMetrics"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Task Metrics"},"topic_metrics":{"anyOf":[{"additionalProperties":{"additionalProperties":{"$ref":"#/components/schemas/SourceBaseMetrics"},"type":"object"},"type":"object"},{"type":"null"}],"title":"Topic Metrics"}},"additionalProperties":true,"type":"object","title":"SourceMetricsRes","description":"Source metrics response."},"SourceSnapshotProgressRes":{"properties":{"state":{"type":"string","title":"State","description":"Snapshot state: running, pending, completed, failed, or not_started"},"snapshot_type":{"type":"string","title":"Snapshot Type","description":"Snapshot type: incremental or blocking","default":"incremental"},"total_topic_count":{"type":"integer","title":"Total Topic Count","description":"Logical topics (selectors) in the snapshot — what the user sees. Equals total_table_count unless a selector fanned out (sharded/regex).","default":0},"remaining_topic_count":{"type":"integer","title":"Remaining Topic Count","description":"Logical topics still to be processed","default":0},"done_topic_count":{"type":"integer","title":"Done Topic Count","description":"Logical topics in a terminal DONE/COMPLETED state","default":0},"cancelled_topic_count":{"type":"integer","title":"Cancelled Topic Count","description":"Logical topics cancelled by the user before completing","default":0},"failed_topic_count":{"type":"integer","title":"Failed Topic Count","description":"Logical topics that terminated in a FAILED state","default":0},"total_table_count":{"type":"integer","title":"Total Table Count","description":"Physical tables in the snapshot — expanded per shard/regex match. Exceeds total_topic_count only on fanout.","default":0},"remaining_table_count":{"type":"integer","title":"Remaining Table Count","description":"Physical tables still to be processed","default":0},"rows_total":{"type":"integer","title":"Rows Total","description":"Total source rows across all tables (from QA metrics). 0 if unavailable.","default":0},"rows_scanned":{"type":"integer","title":"Rows Scanned","description":"Total rows scanned across all tables. 0 if unavailable.","default":0},"progress_type":{"type":"string","enum":["rows","tables"],"title":"Progress Type","description":"Whether percent_complete is based on row counts ('rows') or table counts ('tables').","default":"tables"},"percent_complete":{"type":"number","title":"Percent Complete","description":"Snapshot completion percentage (0-100)","default":0.0},"eta_ms":{"type":"integer","title":"Eta Ms","description":"Estimated milliseconds to completion","default":0},"start_timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Timestamp","description":"Snapshot start time (UTC)"},"end_timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Timestamp","description":"Snapshot end time (UTC)"}},"additionalProperties":true,"type":"object","required":["state"],"title":"SourceSnapshotProgressRes","description":"Snapshot progress for a source connector.\n\nSourced from the ClickHouse snapshot_progress table via get_snapshot_summary()."},"SourceTimeseriesMetrics":{"properties":{"SnapshotMilliSecondsSinceLastEvent":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Snapshotmillisecondssincelastevent","default":[]},"SnapshotTotalNumberOfEventsSeen":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Snapshottotalnumberofeventsseen","default":[]},"StreamingMilliSecondsBehindSource":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Streamingmillisecondsbehindsource","default":[]},"StreamingMilliSecondsSinceLastEvent":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Streamingmillisecondssincelastevent","default":[]},"StreamingTotalNumberOfCreateEventsSeen":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Streamingtotalnumberofcreateeventsseen","default":[]},"StreamingTotalNumberOfDeleteEventsSeen":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Streamingtotalnumberofdeleteeventsseen","default":[]},"recordSendTotal":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Recordsendtotal","default":[]},"StreamingTotalNumberOfUpdateEventsSeen":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Streamingtotalnumberofupdateeventsseen","default":[]},"recordRetryTotal":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Recordretrytotal","default":[]},"recordWrittenTotal":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Recordwrittentotal","default":[]},"byteTotal":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Bytetotal","default":[]},"sourceRecordWriteTotal":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Sourcerecordwritetotal","default":[]}},"additionalProperties":true,"type":"object","title":"SourceTimeseriesMetrics","description":"Source timeseries metrics.","example":{"SnapshotMilliSecondsSinceLastEvent":[{"timestamp":"2025-03-02 08:00:00","value":500.0},{"timestamp":"2025-03-02 09:00:00","value":300.0}],"SnapshotTotalNumberOfEventsSeen":[{"timestamp":"2025-03-02 08:00:00","value":100.0},{"timestamp":"2025-03-02 09:00:00","value":150.0}],"StreamingMilliSecondsBehindSource":[{"timestamp":"2025-03-02 08:00:00","value":1000.0},{"timestamp":"2025-03-02 09:00:00","value":800.0}],"StreamingMilliSecondsSinceLastEvent":[{"timestamp":"2025-03-02 08:00:00","value":200.0},{"timestamp":"2025-03-02 09:00:00","value":150.0}],"StreamingTotalNumberOfCreateEventsSeen":[{"timestamp":"2025-03-02 08:00:00","value":20.0},{"timestamp":"2025-03-02 09:00:00","value":35.0}],"StreamingTotalNumberOfDeleteEventsSeen":[{"timestamp":"2025-03-02 08:00:00","value":5.0},{"timestamp":"2025-03-02 09:00:00","value":8.0}],"StreamingTotalNumberOfUpdateEventsSeen":[{"timestamp":"2025-03-02 08:00:00","value":30.0},{"timestamp":"2025-03-02 09:00:00","value":45.0}],"byteTotal":[{"timestamp":"2025-03-02 08:00:00","value":10000.0},{"timestamp":"2025-03-02 09:00:00","value":15000.0}],"recordRetryTotal":[{"timestamp":"2025-03-02 08:00:00","value":2.0},{"timestamp":"2025-03-02 09:00:00","value":3.0}],"recordSendTotal":[{"timestamp":"2025-03-02 08:00:00","value":50.0},{"timestamp":"2025-03-02 09:00:00","value":70.0}],"recordWrittenTotal":[{"timestamp":"2025-03-02 08:00:00","value":40.0},{"timestamp":"2025-03-02 09:00:00","value":60.0}],"sourceRecordWriteTotal":[{"timestamp":"2025-03-02 08:00:00","value":25.0},{"timestamp":"2025-03-02 09:00:00","value":40.0}]}},"SourceTimeseriesMetricsWithMetadata":{"properties":{"data":{"$ref":"#/components/schemas/SourceTimeseriesMetrics"},"metadata":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Metadata"}},"additionalProperties":true,"type":"object","required":["data","metadata"],"title":"SourceTimeseriesMetricsWithMetadata"},"SourceTimesummaryMetrics":{"properties":{"SnapshotTotalNumberOfEventsSeen":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Snapshottotalnumberofeventsseen"},"SnapshotMilliSecondsSinceLastEvent":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Snapshotmillisecondssincelastevent"},"StreamingMilliSecondsBehindSource":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Streamingmillisecondsbehindsource"},"StreamingTotalNumberOfDeleteEventsSeen":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Streamingtotalnumberofdeleteeventsseen"},"StreamingTotalNumberOfUpdateEventsSeen":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Streamingtotalnumberofupdateeventsseen"},"StreamingTotalNumberOfCreateEventsSeen":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Streamingtotalnumberofcreateeventsseen"},"StreamingMilliSecondsSinceLastEvent":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Streamingmillisecondssincelastevent"},"recordRetryTotal":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Recordretrytotal"},"recordSendTotal":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Recordsendtotal"},"recordWrittenTotal":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Recordwrittentotal"},"byteTotal":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Bytetotal"},"sourceRecordWriteTotal":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"null"}],"title":"Sourcerecordwritetotal"},"snapshotStatus":{"anyOf":[{"items":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"type":"object"},"type":"array"},{"type":"null"}],"title":"Snapshotstatus","default":[]},"snapshotState":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshotstate"},"connector_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connector Status"},"latency":{"anyOf":[{"type":"number"},{"type":"string"},{"type":"null"}],"title":"Latency"}},"additionalProperties":true,"type":"object","title":"SourceTimesummaryMetrics","description":"Source timesummary metrics.","example":{"SnapshotMilliSecondsSinceLastEvent":500,"SnapshotTotalNumberOfEventsSeen":65,"StreamingMilliSecondsBehindSource":200,"StreamingMilliSecondsSinceLastEvent":100,"StreamingTotalNumberOfCreateEventsSeen":20,"StreamingTotalNumberOfDeleteEventsSeen":13,"StreamingTotalNumberOfUpdateEventsSeen":25,"byteTotal":6000,"connector_status":"Active","latency":100,"recordRetryTotal":5,"recordSendTotal":60,"recordWrittenTotal":58,"snapshotState":"completed","snapshotStatus":[{"status":"completed","submit_timestamp":"2023-10-01T12:00:00Z","topic_id":"source_111111111111111111111111.Test.test_data1"},{"status":"completed","submit_timestamp":"2023-10-01T12:05:00Z","topic_id":"source_111111111111111111111111.Test.test_data2"}],"sourceRecordWriteTotal":547}},"SourceTimesummaryMetricsWithMetadata":{"properties":{"data":{"$ref":"#/components/schemas/SourceTimesummaryMetrics"},"metadata":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Metadata"}},"additionalProperties":true,"type":"object","required":["data","metadata"],"title":"SourceTimesummaryMetricsWithMetadata"},"SourcesPaginatedReqBody":{"properties":{"connector":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Connector","description":"List of connector types (as array) or comma-separated string. Body takes precedence over query params."},"status":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Status","description":"List of statuses (as array) or comma-separated string. Body takes precedence over query params."},"snapshot":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Snapshot","description":"List of snapshot statuses (as array) or comma-separated string. Body takes precedence over query params. Valid statuses: running, completed, failed, pending, cancelled"},"stale":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Stale","description":"Filter by staleness. true = only sources with no data in 24h, false = only active sources. Body takes precedence over query params."},"tag_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Tag Ids","description":"List of tag IDs (as array) or comma-separated string. Body takes precedence over query params."},"tag_filter_operation":{"anyOf":[{"type":"string","enum":["and","or"]},{"type":"null"}],"title":"Tag Filter Operation","description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags. Body takes precedence over query params."}},"additionalProperties":true,"type":"object","title":"SourcesPaginatedReqBody","description":"Body model for POST /sources requests.\n\nSupports large lists of IDs that would exceed URL length limits when using GET.\nBody parameters take precedence over query parameters when both are provided."},"SourcesPaginatedRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number","default":1},"page_size":{"type":"integer","title":"Page Size","description":"Results per page","default":10},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Total number of results"},"has_next":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Next","description":"Whether more pages exist"},"result":{"items":{"$ref":"#/components/schemas/SourceConnector"},"type":"array","title":"Result"}},"additionalProperties":true,"type":"object","required":["result"],"title":"SourcesPaginatedRes","description":"Get paginated sources response."},"StepDetail":{"properties":{"step":{"type":"integer","title":"Step"},"name":{"type":"string","title":"Name"},"status":{"$ref":"#/components/schemas/StepStatus","default":"pending"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"}},"additionalProperties":true,"type":"object","required":["step","name"],"title":"StepDetail"},"StepStatus":{"type":"string","enum":["pending","in_progress","completed","failed"],"title":"StepStatus"},"StreamkapMcpConnection":{"properties":{"source":{"type":"string","const":"streamkap","title":"Source","description":"Discriminator - must be 'streamkap' for this variant","default":"streamkap"},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Connection name (e.g. 'Production Streamkap MCP')"},"serverUrl":{"type":"string","maxLength":2048,"title":"Serverurl"},"headers":{"additionalProperties":{"type":"string"},"type":"object","maxProperties":32,"title":"Headers","description":"Auth headers. Set 'X-Streamkap-Project-Key' to the base64-encoded credential file downloaded when the Project Key was created."}},"additionalProperties":false,"type":"object","required":["name"],"title":"StreamkapMcpConnection","description":"A saved Streamkap MCP server connection.\n\nAuthenticated via a pasted Project Key credential file in\n``headers[\"X-Streamkap-Project-Key\"]``. The BE structurally validates the\nblob on save, encrypts every header value at rest, and the MCP server\n(``streamkap-tools``) enforces the PK's stored ``tool_profile`` /\n``allowed_tools`` / ``blocked_tools`` scoping per session."},"SummariseAlertBody":{"properties":{"alert_id":{"type":"string","minLength":1,"title":"Alert Id","description":"Courier message ID for tracking"},"entity_id":{"type":"string","minLength":1,"title":"Entity Id","description":"Entity UUID (source/destination/pipeline)"},"entity_type":{"type":"string","enum":["sources","destinations","pipelines"],"title":"Entity Type","description":"Type of entity this alert is for"},"entity_name":{"type":"string","minLength":1,"title":"Entity Name","description":"Human-readable entity name"},"alert_state":{"type":"string","enum":["TRIGGERED","RECOVERED"],"title":"Alert State","description":"Current alert state (normalized from input)"},"alert_message":{"type":"string","maxLength":10000,"minLength":1,"title":"Alert Message","description":"Alert message content from Courier inbox"},"trigger_type":{"anyOf":[{"type":"string","enum":["connector_status","latency","lag","no_records","dlq","json_column_detected","transform_status","config_changed"]},{"type":"null"}],"title":"Trigger Type","description":"Type of trigger that caused this alert (optional - history fetched for all types if omitted)"},"alert_datetime":{"type":"string","title":"Alert Datetime","description":"When alert was triggered (from Courier payload)"}},"additionalProperties":false,"type":"object","required":["alert_id","entity_id","entity_type","entity_name","alert_state","alert_message","alert_datetime"],"title":"SummariseAlertBody","description":"Request body for alert AI summary."},"SummariseLogBody":{"properties":{"connector_name":{"type":"string","title":"Connector Name"},"namespace_name":{"type":"string","title":"Namespace Name"},"timestamp":{"type":"string","title":"Timestamp","description":"Example: 2025-07-30T07:51:48.000000Z"},"log_section":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Section","description":"Required only when log_uuid is not provided"},"entity_id":{"type":"string","title":"Entity Id"},"entity_type":{"type":"string","enum":["source","destination"],"title":"Entity Type","default":"source"},"log_uuid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Log Uuid","description":"UUID of the log entry, if available"}},"additionalProperties":false,"type":"object","required":["connector_name","namespace_name","timestamp","entity_id"],"title":"SummariseLogBody"},"SurrogateKeySpec":{"properties":{"data_collection":{"type":"string","title":"Data Collection","description":"The data collection (table) to apply the surrogate key to."},"surrogate_key":{"items":{"type":"string"},"type":"array","title":"Surrogate Key","description":"Indexed column(s) to range + order over instead of the PK (single or composite)."}},"type":"object","required":["data_collection","surrogate_key"],"title":"SurrogateKeySpec","description":"Per-table surrogate key for parallel filtered snapshots (ENG-2474)."},"SwitchTenantRequest":{"properties":{"tenant_id":{"type":"string","minLength":1,"title":"Tenant Id"}},"additionalProperties":true,"type":"object","required":["tenant_id"],"title":"SwitchTenantRequest"},"SystemPromptSuggestionRequest":{"properties":{"provider":{"$ref":"#/components/schemas/AgentLlmProviderEnum"},"model":{"type":"string","maxLength":200,"title":"Model","default":""},"apiKey":{"type":"string","maxLength":512,"title":"Apikey","description":"Raw key - never stored","default":""},"baseUrl":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Baseurl"},"savedConnectionId":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Savedconnectionid","description":"If set, BE resolves provider/apiKey/baseUrl from the tenant's saved llmConnection by id and ignores the inline ``apiKey`` / ``baseUrl``."},"agentType":{"type":"string","maxLength":50,"minLength":1,"title":"Agenttype","description":"Agent type (e.g. react, workflow)"},"agentName":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Agentname"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"},"inputTopics":{"items":{"type":"string"},"type":"array","maxItems":20,"title":"Inputtopics"},"selectedFields":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Selectedfields"},"tools":{"items":{"$ref":"#/components/schemas/ToolContext"},"type":"array","maxItems":50,"title":"Tools","description":"Tool name + description list. Replaces the older toolNames-only shape."},"outputSchema":{"items":{"$ref":"#/components/schemas/OutputSchemaField"},"type":"array","maxItems":50,"title":"Outputschema"},"filterSQL":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Filtersql","description":"Active record-filter (matches AgentInputConfig.filterSQL). Anchors the LLM's prompt to the actual shape of records reaching the agent."},"existingCustomInstructions":{"anyOf":[{"type":"string","maxLength":8000},{"type":"null"}],"title":"Existingcustominstructions","description":"Existing draft to refine. Matches the FE textarea cap."},"generationHint":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Generationhint","description":"Optional one-line steer the user types into the wizard's 'Hint for AI' input. The meta-prompt already gets the agent's metadata, so this should carry use-case intent (tone, edge-case priority, what to emphasize) rather than restate the data shape."}},"additionalProperties":false,"type":"object","required":["provider","agentType"],"title":"SystemPromptSuggestionRequest","description":"Request body for ``POST /agents/system-prompt-suggestion``.\n\nMirrors ``ValidateLlmRequest`` for the credential half (inline apiKey or\nsavedConnectionId, with the same XOR rule) and adds the agent-context\nfields the meta-prompt needs to draft a starter ``customInstructions``\nblock. The runtime ``build_system_prompt`` already injects the per-agentType\nbase template, schema field listing, and tool signatures - so the LLM is\nasked to produce *only* the user-facing instructions slot, never the\nboilerplate wrapper. See ``app.services.agent_prompt_suggester`` for the\nmeta-prompt that enforces that."},"SystemPromptSuggestionResponse":{"properties":{"generatedPrompt":{"type":"string","title":"Generatedprompt"},"tokensIn":{"type":"integer","title":"Tokensin"},"tokensOut":{"type":"integer","title":"Tokensout"},"model":{"type":"string","title":"Model"},"provider":{"type":"string","title":"Provider"}},"additionalProperties":false,"type":"object","required":["generatedPrompt","tokensIn","tokensOut","model","provider"],"title":"SystemPromptSuggestionResponse","description":"Response body for ``POST /agents/system-prompt-suggestion``.\n\nToken counts come straight from the provider's ``usage`` block (zeroed\nwhen the provider didn't return one). ``model`` / ``provider`` echo back\nthe resolved values so the FE can display \"generated with anthropic /\nclaude-sonnet-4-5\" alongside the suggestion."},"TagTypeEnum":{"type":"string","enum":["environment","general","pipelines","transforms","topics","services","sources","users","tenant","destinations"],"title":"TagTypeEnum"},"TagsSearchReqBody":{"properties":{"tag_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tag Ids","description":"List of tag IDs. Body takes precedence over query params."}},"additionalProperties":true,"type":"object","title":"TagsSearchReqBody","description":"Body model for POST /tags/search requests.\n\nSupports large lists of tag IDs that would exceed URL length limits when using GET.\nBody parameters take precedence over query parameters when both are provided."},"TestRunError":{"properties":{"kind":{"type":"string","title":"Kind","description":"One of: llm_resolution_error, llm_provider_error, timeout, unsupported_provider, http_connection_resolution_error, …"},"message":{"type":"string","title":"Message"}},"additionalProperties":false,"type":"object","required":["kind","message"],"title":"TestRunError","description":"Structured error envelope on a failed test-run."},"TestRunRequest":{"properties":{"config":{"$ref":"#/components/schemas/CreateAgentConfigRequest","description":"Full agent config under test"},"sampleRecord":{"additionalProperties":true,"type":"object","title":"Samplerecord","description":"One Kafka-shaped record to feed the agent"},"agentId":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Agentid","description":"Resolves an empty / masked ``apiKey`` against the stored agent's encrypted blob. Post-cutover the wizard sends ``apiKey: ''`` for every existing-agent test-run; this lets the BE swap in the stored key for legacy inline-key agents that were saved before the Connection cutover (no ``llmConnectionId`` to resolve via)."},"savedConnectionId":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Savedconnectionid","description":"Mirror of the ValidateLlmRequest.savedConnectionId path."},"skipTools":{"type":"boolean","title":"Skiptools","description":"When true, every MCP / HTTP tool dispatch returns a canned {skipped: true} payload to the LLM. Use to iterate on prompt shape without burning real tool calls.","default":false}},"additionalProperties":false,"type":"object","required":["config","sampleRecord"],"title":"TestRunRequest","description":"Request body for ``POST /agents/test-run``.\n\nCarries a full agent config + a sample record. The BE runs the\nrecord through the agent (LLM + tools) without touching Flink and\nreturns the timeline so the FE can show what happened."},"TestRunResponse":{"properties":{"steps":{"items":{"$ref":"#/components/schemas/TestRunStep"},"type":"array","title":"Steps"},"finalOutput":{"title":"Finaloutput"},"stoppedReason":{"type":"string","enum":["completed","max_iterations","error","timeout"],"title":"Stoppedreason"},"iterationsUsed":{"type":"integer","title":"Iterationsused"},"tokensIn":{"type":"integer","title":"Tokensin"},"tokensOut":{"type":"integer","title":"Tokensout"},"durationMs":{"type":"integer","title":"Durationms"},"approximations":{"items":{"type":"string"},"type":"array","title":"Approximations","description":"Free-form list of caveats, e.g. 'memory_excluded', 'transforms_skipped'."},"suggestions":{"items":{"$ref":"#/components/schemas/TestRunSuggestion"},"type":"array","title":"Suggestions","description":"Deterministic hints (max 4) computed from the agent config + run result. Empty when the run produced a useful structured output. Each suggestion has a stable ``kind`` the FE can map to icon / copy."},"warnings":{"items":{"$ref":"#/components/schemas/TestRunWarning"},"type":"array","title":"Warnings","description":"Static config-vs-record checks (e.g. memory keyField missing on the sample) that the Flink runtime would silently swallow at deploy. Empty when nothing is amiss."},"outputSchemaCheck":{"anyOf":[{"$ref":"#/components/schemas/TestRunSchemaCheck"},{"type":"null"}],"description":"Field-level diff between the declared ``output.schema`` and the LLM's ``finalOutput``. Null when no schema was declared OR the run errored / produced a non-structured (text envelope) result. ``ok=true`` means every declared field is present with a compatible type."},"systemPrompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Systemprompt","description":"Composed system prompt the LLM actually received - base template + auto-injected schema fields + tool descriptions + customInstructions. Identical to what Flink sends at deploy time (built by the same ``build_system_prompt``). Null when the run errored before reaching the LLM (e.g. ``llm_resolution_error``)."},"userMessage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Usermessage","description":"First user message dispatched to the LLM, after the ``prompts.user`` template wraps the (input-fields-filtered) sample record. Lets the test pane show the exact pair of strings the LLM saw on iteration 1. Null when the run errored before message construction."},"error":{"anyOf":[{"$ref":"#/components/schemas/TestRunError"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["steps","stoppedReason","iterationsUsed","tokensIn","tokensOut","durationMs"],"title":"TestRunResponse","description":"Response body for ``POST /agents/test-run``."},"TestRunSchemaCheck":{"properties":{"ok":{"type":"boolean","title":"Ok"},"missing":{"items":{"type":"string"},"type":"array","title":"Missing","description":"Fields declared in schema but absent from finalOutput"},"extra":{"items":{"type":"string"},"type":"array","title":"Extra","description":"Fields present in finalOutput but not declared"},"typeMismatches":{"items":{"$ref":"#/components/schemas/TestRunSchemaTypeMismatch"},"type":"array","title":"Typemismatches","description":"Fields whose value types diverge from the declared schema"}},"additionalProperties":false,"type":"object","required":["ok"],"title":"TestRunSchemaCheck","description":"Diff between the declared ``output.schema`` and the LLM's ``finalOutput``.\n\nComputed only when (a) the agent declared a schema and (b) the run\nproduced a structured (non-text-envelope) final output. The Flink\nruntime DLQs records that fail this check at deploy time; surfacing\nthe same comparison in test mode closes the audit's \"silent\noutput-schema bypass\" gap."},"TestRunSchemaTypeMismatch":{"properties":{"field":{"type":"string","title":"Field"},"expected":{"type":"string","title":"Expected","description":"Declared schema type, e.g. STRING / DOUBLE"},"actual":{"type":"string","title":"Actual","description":"Inferred type of the value the LLM returned"}},"additionalProperties":false,"type":"object","required":["field","expected","actual"],"title":"TestRunSchemaTypeMismatch","description":"One field-level mismatch between declared output schema and the LLM's response."},"TestRunStep":{"properties":{"kind":{"type":"string","enum":["llm","tool"],"title":"Kind"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"tokensIn":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokensin"},"tokensOut":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tokensout"},"stopReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stopreason"},"text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text"},"toolCalls":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Toolcalls"},"toolName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Toolname"},"toolType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tooltype"},"request":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Request"},"result":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Result"},"skipped":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Skipped"},"skippedReason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skippedreason"},"durationMs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Durationms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"additionalProperties":false,"type":"object","required":["kind"],"title":"TestRunStep","description":"One row in the test-run timeline. Either an LLM call or a tool dispatch."},"TestRunSuggestion":{"properties":{"kind":{"type":"string","enum":["missing_output_schema","tools_not_invoked","near_empty_response","skip_instruction_may_apply","max_tokens_truncated"],"title":"Kind"},"message":{"type":"string","title":"Message"}},"additionalProperties":false,"type":"object","required":["kind","message"],"title":"TestRunSuggestion","description":"A deterministic, config-derived hint for improving a test-run result.\n\nSurfaced when a run completes successfully but the output is empty,\nnear-empty, or otherwise unhelpful AND the cause is reliably\nidentifiable from the agent config alone (no LLM-grade judgment).\nThe FE renders these as a \"Suggestions\" panel under the result.\n\n``kind`` is a stable enum the FE can map to icon / link copy. The\n``message`` is a default rendering for clients that don't know the\nkind. Adding new kinds is non-breaking - the FE falls back to the\nmessage string for any unknown ``kind``."},"TestRunWarning":{"properties":{"kind":{"type":"string","enum":["memory_key_field_missing","input_fields_not_in_record","max_tokens_clamped"],"title":"Kind"},"message":{"type":"string","title":"Message"}},"additionalProperties":false,"type":"object","required":["kind","message"],"title":"TestRunWarning","description":"Static, pre-flight warning surfaced before / alongside the run.\n\nDistinct from ``error`` (which represents a run failure) and from\n``suggestions`` (post-hoc empty-output hints). Warnings are\ndeterministic config-vs-record checks (e.g. memory keyField missing)\nthat the Flink runtime would silently swallow at deploy time."},"TierNodeGroup":{"properties":{"role":{"type":"string","title":"Role","description":"'kafka' or 'kafka_connect'"},"name":{"type":"string","title":"Name","description":"EKS node group name"},"az":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Az"},"instance_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance Type"},"vcpu_per_node":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vcpu Per Node"},"memory_gib_per_node":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Gib Per Node"},"nodes":{"type":"integer","title":"Nodes","description":"Desired node count for this NG on this tier"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"Live EKS node group status (e.g. ACTIVE). Only set on live reads."},"ebs_volumes":{"items":{"$ref":"#/components/schemas/EbsVolumeStatus"},"type":"array","title":"Ebs Volumes","description":"EBS volumes attached per node. Populated for the Kafka NG only; KC is stateless."}},"additionalProperties":true,"type":"object","required":["role","name","nodes"],"title":"TierNodeGroup","description":"A single node group within a tier, projected from ScalingTier display fields."},"TierSpec":{"properties":{"name":{"type":"string","title":"Name"},"order":{"type":"integer","title":"Order"},"kafka_memory":{"type":"string","title":"Kafka Memory"},"kafka_connect_memory":{"type":"string","title":"Kafka Connect Memory"},"kafka_connect_replicas":{"type":"integer","title":"Kafka Connect Replicas"},"node_groups":{"items":{"$ref":"#/components/schemas/TierNodeGroup"},"type":"array","title":"Node Groups","description":"Kafka NG (one) plus all KC NGs across AZs."}},"additionalProperties":true,"type":"object","required":["name","order","kafka_memory","kafka_connect_memory","kafka_connect_replicas"],"title":"TierSpec","description":"Pre-defined tier specification rendered by the Cluster Scaling page."},"TimeseriesEntry":{"properties":{"value":{"anyOf":[{"type":"integer"},{"type":"number"}],"title":"Value","description":"The metric value at this timestamp"},"timestamp":{"type":"string","title":"Timestamp","description":"ISO 8601 timestamp for this data point"}},"additionalProperties":true,"type":"object","required":["value","timestamp"],"title":"TimeseriesEntry","description":"A single data point in a time series."},"TimingSummary":{"properties":{"node_scale_duration_s":{"type":"integer","title":"Node Scale Duration S","default":0},"workload_restart_duration_s":{"type":"integer","title":"Workload Restart Duration S","default":0},"cleanup_duration_s":{"type":"integer","title":"Cleanup Duration S","default":0},"total_duration_s":{"type":"integer","title":"Total Duration S","default":0}},"additionalProperties":true,"type":"object","title":"TimingSummary"},"ToolContext":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Tool name as referenced in the agent"},"description":{"type":"string","maxLength":1000,"title":"Description","description":"What the tool does, free-form","default":""}},"additionalProperties":false,"type":"object","required":["name"],"title":"ToolContext","description":"One tool entry in the suggestion payload.\n\nCarries name + description so the LLM can reason about *when to call which\ntool*. Earlier shape passed names only, which gave the LLM no grounding for\ntool-use advice (\"call lookup_user when...\" with no idea what lookup_user\nactually does). Description is optional - tools without one render as\n\"(no description)\" so the meta-prompt still sees the name."},"ToolProfile":{"type":"string","enum":["full","read-only","agent-operator","infra-admin"],"title":"ToolProfile"},"TopicAutoDiscoveryTransform":{"properties":{"transform_id":{"type":"string","title":"Transform Id"},"regex":{"type":"string","title":"Regex"}},"additionalProperties":true,"type":"object","required":["transform_id","regex"],"title":"TopicAutoDiscoveryTransform"},"TopicDestinationRef":{"properties":{"id":{"type":"string","title":"Id","description":"Destination entity ID"},"name":{"type":"string","title":"Name","description":"Destination display name"},"connector":{"type":"string","title":"Connector","description":"Destination connector type","default":""},"pipeline_id":{"type":"string","title":"Pipeline Id","description":"Pipeline entity ID","default":""},"pipeline_status":{"type":"string","title":"Pipeline Status","description":"Pipeline status","default":""},"lag":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lag","description":"Destination consumer lag. Null when include_metrics=false."},"latency_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency Ms","description":"Destination wall-clock consumer latency in milliseconds (worst partition). Null when include_metrics=false or no probe sample exists yet."},"qaCount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Qacount","description":"Destination row count for this topic from metrics_qa. Null when not collected."},"e2e_eta_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"E2E Eta Ms","description":"Estimated milliseconds for destination to fully consume remaining data. Shown during active snapshots or when lag exceeds threshold. -1 means records are remaining but destination is not consuming (stalled). Null when not applicable."}},"additionalProperties":true,"type":"object","required":["id","name"],"title":"TopicDestinationRef","description":"Reference to a destination consuming a topic."},"TopicDetailsEntity":{"properties":{"entity_type":{"$ref":"#/components/schemas/TopicDetailsEntityTypeEnum"},"entity_id":{"type":"string","title":"Entity Id"},"name":{"type":"string","title":"Name"},"connector":{"anyOf":[{"$ref":"#/components/schemas/SourceConnectorEnum"},{"$ref":"#/components/schemas/DestinationConnectorEnum"},{"$ref":"#/components/schemas/TransformsLibraryEnum"},{"type":"string"}],"title":"Connector"},"topic_ids":{"items":{"type":"string"},"type":"array","title":"Topic Ids"},"topic_db_ids":{"items":{"type":"string"},"type":"array","title":"Topic Db Ids"},"display_name":{"type":"string","title":"Display Name"},"filtered_snapshot_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filtered Snapshot Language"}},"additionalProperties":true,"type":"object","required":["entity_type","entity_id","name","connector","topic_ids","topic_db_ids","display_name"],"title":"TopicDetailsEntity"},"TopicDetailsEntityTypeEnum":{"type":"string","enum":["sources","destinations","transforms","pipelines","manual"],"title":"TopicDetailsEntityTypeEnum","description":"Enum for topic entity types (producer types)."},"TopicDetailsReqBody":{"properties":{"entity_id":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Entity Id","description":"List of entity IDs (as array) or comma-separated string. Body takes precedence over query params."},"snapshot":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Snapshot","description":"List of snapshot statuses (as array) or comma-separated string. Body takes precedence over query params. Valid statuses: running, completed, failed, pending, cancelled"},"value_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Format","description":"Filter by serialization value format. Valid values: avro, json, json_schema, protobuf, string, bytearray. Case-insensitive. Body takes precedence over query params."},"has_errors":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Errors","description":"Filter topics by error status. true = only topics with errors, false = only topics without errors. Body takes precedence over query params."},"orphaned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Orphaned","description":"Filter by orphaned status. true = only topics with 0 destinations, false = only topics with destinations. Body takes precedence over query params."},"partition_skew":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Partition Skew","description":"Filter by partition skew. true = only topics where max partition lag > 2x average. Body takes precedence over query params."},"tag_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Tag Ids","description":"List of tag IDs (as array) or comma-separated string. Body takes precedence over query params."},"tag_filter_operation":{"anyOf":[{"type":"string","enum":["and","or"]},{"type":"null"}],"title":"Tag Filter Operation","description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags. Body takes precedence over query params."}},"additionalProperties":true,"type":"object","title":"TopicDetailsReqBody","description":"Body model for POST /topics/details/search requests.\n\nSupports large lists of entity IDs that would exceed URL length limits when using GET.\nBody parameters take precedence over query parameters when both are provided."},"TopicDetailsRes":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"entity":{"$ref":"#/components/schemas/TopicDetailsEntity"},"prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefix"},"serialization":{"anyOf":[{"$ref":"#/components/schemas/TopicSerialization"},{"type":"null"}],"description":"Serialization format information for this topic (inherited from producer)"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs assigned to this topic"},"broker_only":{"type":"boolean","title":"Broker Only","description":"True when this row was surfaced from a broker listing rather than the MongoDB `topics` collection (only possible with `include_internal=true`). The FE renders a badge so the user can tell Mongo-tracked topics apart from broker-only ones.","default":false}},"additionalProperties":true,"type":"object","required":["id","name","entity"],"title":"TopicDetailsRes"},"TopicDetailsWithKafka":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"entity":{"$ref":"#/components/schemas/TopicDetailsEntity"},"prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prefix"},"serialization":{"anyOf":[{"$ref":"#/components/schemas/TopicSerialization"},{"type":"null"}],"description":"Serialization format information for this topic (inherited from producer)"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs assigned to this topic"},"broker_only":{"type":"boolean","title":"Broker Only","description":"True when this row was surfaced from a broker listing rather than the MongoDB `topics` collection (only possible with `include_internal=true`). The FE renders a badge so the user can tell Mongo-tracked topics apart from broker-only ones.","default":false},"kafka":{"$ref":"#/components/schemas/TopicKafkaMetadata"}},"additionalProperties":true,"type":"object","required":["id","name","entity","kafka"],"title":"TopicDetailsWithKafka","description":"Topic details with live Kafka information."},"TopicGroup":{"properties":{"group_id":{"type":"string","title":"Group Id"},"group_type":{"type":"string","const":"entity_id","title":"Group Type","default":"entity_id"},"entity":{"$ref":"#/components/schemas/TopicGroupEntity"},"topic_count":{"type":"integer","title":"Topic Count"},"topics":{"$ref":"#/components/schemas/TopicsDetailsRes"}},"additionalProperties":true,"type":"object","required":["group_id","entity","topic_count","topics"],"title":"TopicGroup","description":"A group of topics by connector/entity."},"TopicGroupEntity":{"properties":{"entity_id":{"type":"string","title":"Entity Id"},"entity_type":{"$ref":"#/components/schemas/TopicDetailsEntityTypeEnum"},"entity_name":{"type":"string","title":"Entity Name"},"connector":{"anyOf":[{"$ref":"#/components/schemas/SourceConnectorEnum"},{"$ref":"#/components/schemas/DestinationConnectorEnum"},{"$ref":"#/components/schemas/TransformsLibraryEnum"},{"type":"string"}],"title":"Connector"},"connector_display_name":{"type":"string","title":"Connector Display Name"}},"additionalProperties":true,"type":"object","required":["entity_id","entity_type","entity_name","connector","connector_display_name"],"title":"TopicGroupEntity","description":"Entity information for a topic group."},"TopicHealthRes":{"properties":{"topics_high_latency":{"type":"integer","title":"Topics High Latency","description":"Number of topics with high latency","default":0},"topics_with_lag":{"type":"integer","title":"Topics With Lag","description":"Number of topics whose consumer lag exceeds the high-lag threshold (HIGH_LAG_THRESHOLD).","default":0},"max_latency_ms":{"type":"integer","title":"Max Latency Ms","description":"Maximum latency across all topics in milliseconds","default":0},"max_lag":{"type":"integer","title":"Max Lag","description":"Maximum consumer lag across all topics","default":0}},"additionalProperties":true,"type":"object","title":"TopicHealthRes","description":"Aggregated topic health metrics."},"TopicKafkaConfigs":{"properties":{"retention_ms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retention Ms"},"retention_bytes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Retention Bytes"},"cleanup_policy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cleanup Policy"},"delete_retention_ms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delete Retention Ms"},"max_message_bytes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Max Message Bytes"},"compression_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compression Type"},"min_insync_replicas":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Min Insync Replicas"},"segment_ms":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment Ms"},"segment_bytes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Segment Bytes"},"unclean_leader_election":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unclean Leader Election"},"message_timestamp_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Timestamp Type"}},"additionalProperties":true,"type":"object","title":"TopicKafkaConfigs","description":"Customer-relevant Kafka configuration properties."},"TopicKafkaHealth":{"properties":{"is_healthy":{"type":"boolean","title":"Is Healthy"},"under_replicated_partitions":{"type":"integer","title":"Under Replicated Partitions"},"offline_partitions":{"type":"integer","title":"Offline Partitions"},"total_replicas":{"type":"integer","title":"Total Replicas"},"in_sync_replicas":{"type":"integer","title":"In Sync Replicas"}},"additionalProperties":true,"type":"object","required":["is_healthy","under_replicated_partitions","offline_partitions","total_replicas","in_sync_replicas"],"title":"TopicKafkaHealth","description":"Topic health indicators."},"TopicKafkaMetadata":{"properties":{"partitions":{"$ref":"#/components/schemas/TopicKafkaPartitions"},"configs":{"$ref":"#/components/schemas/TopicKafkaConfigs"},"health":{"$ref":"#/components/schemas/TopicKafkaHealth"},"serialization":{"anyOf":[{"$ref":"#/components/schemas/TopicSerialization"},{"type":"null"}],"description":"Serialization format information for this topic"}},"additionalProperties":true,"type":"object","required":["partitions","configs","health"],"title":"TopicKafkaMetadata","description":"Live Kafka metadata for a topic."},"TopicKafkaPartitions":{"properties":{"count":{"type":"integer","title":"Count"},"replication_factor":{"type":"integer","title":"Replication Factor"},"under_replicated_count":{"type":"integer","title":"Under Replicated Count"},"offline_count":{"type":"integer","title":"Offline Count"},"details":{"items":{"$ref":"#/components/schemas/PartitionDetail"},"type":"array","title":"Details"}},"additionalProperties":true,"type":"object","required":["count","replication_factor","under_replicated_count","offline_count","details"],"title":"TopicKafkaPartitions","description":"Kafka partition information for a topic."},"TopicLatestMetrics":{"properties":{"byteTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Bytetotal"},"SnapshotTotalNumberOfEventsSeen":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Snapshottotalnumberofeventsseen"},"StreamingTotalNumberOfCreateEventsSeen":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Streamingtotalnumberofcreateeventsseen"},"StreamingTotalNumberOfDeleteEventsSeen":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Streamingtotalnumberofdeleteeventsseen"},"StreamingTotalNumberOfUpdateEventsSeen":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Streamingtotalnumberofupdateeventsseen"},"recordRetryTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Recordretrytotal"},"recordSendTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Recordsendtotal"}},"additionalProperties":true,"type":"object","title":"TopicLatestMetrics"},"TopicListKafkaMetadata":{"properties":{"partition_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Partition Count"},"replication_factor":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replication Factor"},"retention_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retention Ms"}},"additionalProperties":true,"type":"object","title":"TopicListKafkaMetadata","description":"Per-topic Kafka broker metadata.\n\nAll fields are nullable: `null` means the broker did not return metadata for the\ntopic, distinct from a legitimate `0`."},"TopicMetricsDetailRes":{"properties":{"StreamingMilliSecondsBehindSource":{"type":"integer","title":"Streamingmillisecondsbehindsource","description":"Streaming latency in milliseconds","default":0},"SnapshotPercentageComplete":{"type":"integer","title":"Snapshotpercentagecomplete","description":"Snapshot completion percentage (uppercase)","default":0},"recordSendTotal":{"type":"integer","title":"Recordsendtotal","description":"Total records sent","default":0},"sourceRecordWriteTotal":{"type":"integer","title":"Sourcerecordwritetotal","description":"Total source records written","default":0},"snapshotPercentageComplete":{"type":"integer","title":"Snapshotpercentagecomplete","description":"Snapshot completion percentage (lowercase)","default":0},"recordsLag":{"type":"integer","title":"Recordslag","description":"Consumer records lag","default":0},"byteTotal":{"type":"integer","title":"Bytetotal","description":"Total bytes processed","default":0},"sourceRecordPollRate":{"type":"number","title":"Sourcerecordpollrate","description":"Source record poll rate (records/sec)","default":0.0},"sourceQaCount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sourceqacount","description":"Source DB row count from metrics_qa. Null when not collected."}},"additionalProperties":true,"type":"object","title":"TopicMetricsDetailRes","description":"Detailed metrics for a single topic in lineage view."},"TopicMetricsRes":{"properties":{"timeseries":{"anyOf":[{"$ref":"#/components/schemas/TopicTimeseriesMetrics"},{"type":"null"}]},"latest":{"anyOf":[{"$ref":"#/components/schemas/TopicLatestMetrics"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"TopicMetricsRes"},"TopicPartitionAssignment":{"properties":{"topic":{"type":"string","title":"Topic"},"partition":{"type":"integer","title":"Partition"},"member_id":{"type":"string","title":"Member Id","description":"Member ID that owns this partition"},"current_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Current Offset","description":"Current committed offset"},"log_end_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Log End Offset","description":"Latest offset in partition"},"lag":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lag","description":"Consumer lag (log_end_offset - current_offset)"}},"additionalProperties":true,"type":"object","required":["topic","partition","member_id"],"title":"TopicPartitionAssignment","description":"Topic partition assignment for a consumer."},"TopicRawConnectorMetrics":{"properties":{"connector":{"type":"string","title":"Connector"},"ch_topic":{"type":"string","title":"Ch Topic"},"metrics":{"items":{"$ref":"#/components/schemas/TopicRawMetricRow"},"type":"array","title":"Metrics"}},"type":"object","required":["connector","ch_topic","metrics"],"title":"TopicRawConnectorMetrics"},"TopicRawDestinationMetrics":{"properties":{"destination_id":{"type":"string","title":"Destination Id"},"connector":{"type":"string","title":"Connector"},"ch_topic":{"type":"string","title":"Ch Topic"},"pipeline_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pipeline Id"},"transform_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transform Id"},"metrics":{"items":{"$ref":"#/components/schemas/TopicRawMetricRow"},"type":"array","title":"Metrics"}},"type":"object","required":["destination_id","connector","ch_topic","metrics"],"title":"TopicRawDestinationMetrics"},"TopicRawMetricRow":{"properties":{"metric_name":{"type":"string","title":"Metric Name"},"partition":{"type":"string","title":"Partition"},"task":{"type":"string","title":"Task"},"context":{"type":"string","title":"Context"},"value":{"type":"number","title":"Value"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["metric_name","partition","task","context","value","updated_at"],"title":"TopicRawMetricRow"},"TopicRawMetricsRes":{"properties":{"topic_id":{"type":"string","title":"Topic Id"},"since":{"type":"string","format":"date-time","title":"Since"},"source":{"anyOf":[{"$ref":"#/components/schemas/TopicRawConnectorMetrics"},{"type":"null"}]},"destinations":{"items":{"$ref":"#/components/schemas/TopicRawDestinationMetrics"},"type":"array","title":"Destinations"},"qa":{"items":{"$ref":"#/components/schemas/TopicRawQaRow"},"type":"array","title":"Qa"}},"type":"object","required":["topic_id","since","source"],"title":"TopicRawMetricsRes"},"TopicRawQaRow":{"properties":{"metric_name":{"type":"string","title":"Metric Name"},"connector_ctx":{"type":"string","title":"Connector Ctx"},"connector_id":{"type":"string","title":"Connector Id"},"value":{"type":"number","title":"Value"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["metric_name","connector_ctx","connector_id","value","updated_at"],"title":"TopicRawQaRow"},"TopicSerialization":{"properties":{"key_format":{"$ref":"#/components/schemas/SerializationFormatEnum","description":"Serialization format for message keys (e.g., avro, json, string)","default":"unknown"},"value_format":{"$ref":"#/components/schemas/SerializationFormatEnum","description":"Serialization format for message values (e.g., avro, json, protobuf)","default":"unknown"},"key_converter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Converter","description":"Converter class for message keys"},"value_converter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Converter","description":"Converter class for message values"},"schema_registry_enabled":{"type":"boolean","title":"Schema Registry Enabled","description":"Whether Schema Registry is used for this topic's serialization","default":false}},"additionalProperties":true,"type":"object","title":"TopicSerialization","description":"Serialization format information for a topic.\n\nTopics inherit their serialization format from their producer (source/transform).\nMost Streamkap sources use Avro by default with Schema Registry."},"TopicSnapshotStatusRes":{"properties":{"status":{"type":"string","title":"Status","description":"Snapshot status: running, pending, completed, failed"},"start_timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Timestamp","description":"Snapshot start time (UTC)"},"end_timestamp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Timestamp","description":"Snapshot end time (UTC)"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms","description":"Snapshot duration in milliseconds"},"rows_scanned":{"type":"integer","title":"Rows Scanned","description":"Number of rows scanned so far","default":0},"rows_total":{"type":"integer","title":"Rows Total","description":"Total number of rows to scan","default":0},"trace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trace","description":"Error trace message for failed snapshots"},"eta_ms":{"type":"integer","title":"Eta Ms","description":"Estimated milliseconds to completion","default":0}},"additionalProperties":true,"type":"object","required":["status"],"title":"TopicSnapshotStatusRes","description":"Snapshot status entry for a single topic, sourced from ClickHouse snapshot_progress."},"TopicSourceRef":{"properties":{"id":{"type":"string","title":"Id","description":"Source entity ID"},"name":{"type":"string","title":"Name","description":"Source display name"},"connector":{"type":"string","title":"Connector","description":"Source connector type","default":""},"snapshot_progress":{"anyOf":[{"$ref":"#/components/schemas/SourceSnapshotProgressRes"},{"type":"null"}],"description":"Snapshot progress. Null when include_metrics=false or no snapshot data."}},"additionalProperties":true,"type":"object","required":["id","name"],"title":"TopicSourceRef","description":"Reference to the source that produces a topic."},"TopicStatisticsRes":{"properties":{"byteTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Bytetotal"},"recordRetryTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Recordretrytotal"},"recordSendTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Recordsendtotal"},"recordErrorTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Recorderrortotal"},"recordWrittenTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Recordwrittentotal"},"partitionTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Partitiontotal"},"topicTotal":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Topictotal"},"latencyAvg":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Latencyavg"}},"additionalProperties":true,"type":"object","required":["byteTotal","recordRetryTotal","recordSendTotal","recordErrorTotal","recordWrittenTotal","partitionTotal","topicTotal","latencyAvg"],"title":"TopicStatisticsRes"},"TopicTableMetricsReq":{"properties":{"entities":{"items":{"$ref":"#/components/schemas/SingleTopicTableMetricReq"},"type":"array","title":"Entities","description":"List of entities (sources/destinations/transforms) with their topic IDs. `sources`/`transforms` entities that have `topic_ids` must also include `topic_db_ids` for ownership verification; otherwise the request returns HTTP 400. `destinations` are exempt (send `topic_db_ids: []`) — they are verified against the destination's topic_map."}},"additionalProperties":true,"type":"object","required":["entities"],"title":"TopicTableMetricsReq"},"TopicTableMetricsRowRes":{"properties":{"id":{"type":"string","title":"Id"},"kafka":{"$ref":"#/components/schemas/TopicListKafkaMetadata"},"lastMessageTimestamp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Lastmessagetimestamp"},"snapshotStatus":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Snapshotstatus","default":[]},"recordErrorTotal":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recorderrortotal"}},"additionalProperties":true,"type":"object","required":["id","kafka"],"title":"TopicTableMetricsRowRes"},"TopicTimeseriesMetrics":{"properties":{"byteTotal":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Bytetotal","default":[]},"SnapshotTotalNumberOfEventsSeen":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Snapshottotalnumberofeventsseen","default":[]},"StreamingTotalNumberOfCreateEventsSeen":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Streamingtotalnumberofcreateeventsseen","default":[]},"StreamingTotalNumberOfDeleteEventsSeen":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Streamingtotalnumberofdeleteeventsseen","default":[]},"StreamingTotalNumberOfUpdateEventsSeen":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Streamingtotalnumberofupdateeventsseen","default":[]},"recordRetryTotal":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Recordretrytotal","default":[]},"recordSendTotal":{"items":{"$ref":"#/components/schemas/TimeseriesEntry"},"type":"array","title":"Recordsendtotal","default":[]}},"additionalProperties":true,"type":"object","title":"TopicTimeseriesMetrics"},"TopicTransformRef":{"properties":{"id":{"type":"string","title":"Id","description":"Transform entity ID"},"name":{"type":"string","title":"Name","description":"Transform display name"},"status":{"type":"string","title":"Status","description":"Transform status (e.g. RUNNING)","default":""},"metrics":{"anyOf":[{"$ref":"#/components/schemas/TransformMetricsRes"},{"type":"null"}],"description":"Transform-level metrics. Null when include_metrics=false."},"output_topics":{"items":{"type":"string"},"type":"array","title":"Output Topics","description":"Output topics from this transform"},"transform_type":{"anyOf":[{"$ref":"#/components/schemas/TransformsLibraryEnum"},{"type":"null"}],"description":"Transform library type (e.g. topic_router, sql_join)"},"destinations":{"items":{"$ref":"#/components/schemas/TopicDestinationRef"},"type":"array","title":"Destinations","description":"Destinations consuming this transform's output topics, with lag/count keyed to the output topic."}},"additionalProperties":true,"type":"object","required":["id","name"],"title":"TopicTransformRef","description":"Reference to a transform applied to a topic."},"TopicUpdateBody":{"properties":{"payload":{"$ref":"#/components/schemas/TopicUpdateReqBody"}},"additionalProperties":true,"type":"object","required":["payload"],"title":"TopicUpdateBody"},"TopicUpdateReqBody":{"properties":{"partition_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Partition Count","description":"New partition count for the topic"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs to assign to this topic"}},"additionalProperties":true,"type":"object","title":"TopicUpdateReqBody"},"TopicsDetailsGroupedRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number","default":1},"page_size":{"type":"integer","title":"Page Size","description":"Results per page","default":10},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Total number of results"},"has_next":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Next","description":"Whether more pages exist"},"result":{"items":{"$ref":"#/components/schemas/TopicGroup"},"type":"array","title":"Result"}},"additionalProperties":true,"type":"object","required":["result"],"title":"TopicsDetailsGroupedRes","description":"Paginated response of topic groups."},"TopicsDetailsRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number","default":1},"page_size":{"type":"integer","title":"Page Size","description":"Results per page","default":10},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Total number of results"},"has_next":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Next","description":"Whether more pages exist"},"result":{"items":{"$ref":"#/components/schemas/TopicDetailsRes"},"type":"array","title":"Result"}},"additionalProperties":true,"type":"object","required":["result"],"title":"TopicsDetailsRes"},"TotalsByLevel":{"properties":{"error":{"type":"integer","title":"Error","default":0},"warn":{"type":"integer","title":"Warn","default":0},"info":{"type":"integer","title":"Info","default":0},"debug":{"type":"integer","title":"Debug","default":0}},"additionalProperties":true,"type":"object","title":"TotalsByLevel","description":"Total log counts grouped by severity level."},"TransformCheckpointHistory":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status"},"is_savepoint":{"type":"boolean","title":"Is Savepoint"},"trigger_timestamp":{"type":"integer","title":"Trigger Timestamp"},"latest_ack_timestamp":{"type":"integer","title":"Latest Ack Timestamp"},"state_size":{"type":"integer","title":"State Size"},"end_to_end_duration":{"type":"integer","title":"End To End Duration"},"alignment_buffered":{"type":"integer","title":"Alignment Buffered"},"num_subtasks":{"type":"integer","title":"Num Subtasks"},"num_acknowledged_subtasks":{"type":"integer","title":"Num Acknowledged Subtasks"}},"additionalProperties":true,"type":"object","required":["id","status","is_savepoint","trigger_timestamp","latest_ack_timestamp","state_size","end_to_end_duration","alignment_buffered","num_subtasks","num_acknowledged_subtasks"],"title":"TransformCheckpointHistory","description":"Individual checkpoint history entry."},"TransformCheckpointsInfo":{"properties":{"job_id":{"type":"string","title":"Job Id"},"counts":{"additionalProperties":true,"type":"object","title":"Counts"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"},"latest":{"anyOf":[{"$ref":"#/components/schemas/TransformCheckpointHistory"},{"type":"null"}]},"history":{"items":{"$ref":"#/components/schemas/TransformCheckpointHistory"},"type":"array","title":"History","default":[]},"operator_breakdown":{"items":{"$ref":"#/components/schemas/TransformOperatorState"},"type":"array","title":"Operator Breakdown","default":[]}},"additionalProperties":true,"type":"object","required":["job_id","counts","summary"],"title":"TransformCheckpointsInfo","description":"Checkpoint statistics and latest checkpoint information for a transform."},"TransformConfig":{"properties":{"transforms.name":{"type":"string","title":"Transforms.Name"},"transforms.language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transforms.Language"},"transforms.input.topic.pattern":{"type":"string","title":"Transforms.Input.Topic.Pattern"},"transforms.output.topic.pattern":{"type":"string","title":"Transforms.Output.Topic.Pattern"},"transforms.input.serialization.format":{"$ref":"#/components/schemas/TransformSerializationFormatEnum"},"transforms.output.serialization.format":{"$ref":"#/components/schemas/TransformSerializationFormatEnum"},"transforms.input.job.parallelism":{"type":"integer","title":"Transforms.Input.Job.Parallelism","default":5},"transforms.topic.ttl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transforms.Topic.Ttl"},"kc.cluster.id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kc.Cluster.Id"}},"additionalProperties":true,"type":"object","required":["transforms.name","transforms.input.topic.pattern","transforms.output.topic.pattern","transforms.input.serialization.format","transforms.output.serialization.format"],"title":"TransformConfig"},"TransformDLQError":{"properties":{"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"error_message":{"type":"string","title":"Error Message"},"message_offset":{"type":"integer","title":"Message Offset"},"dlq_topic_name":{"type":"string","title":"Dlq Topic Name"}},"additionalProperties":true,"type":"object","required":["timestamp","error_message","message_offset","dlq_topic_name"],"title":"TransformDLQError","description":"Error information extracted from DLQ message headers."},"TransformDetailsEntity":{"properties":{"metrics":{"$ref":"#/components/schemas/TransformMetric"},"config":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Config"},"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"transform_type":{"anyOf":[{"$ref":"#/components/schemas/TransformsLibraryEnum"},{"type":"string"},{"type":"null"}],"title":"Transform Type"},"sql_query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sql Query"},"topic":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic"},"topic_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Id"},"topics":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Topics"},"topic_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Topic Ids"}},"additionalProperties":true,"type":"object","required":["metrics","config","id","name"],"title":"TransformDetailsEntity"},"TransformDetailsReqBody":{"properties":{"status":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Status","description":"List of statuses (as array) or comma-separated string. Body takes precedence over query params."},"tag_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Tag Ids","description":"List of tag IDs (as array) or comma-separated string. Body takes precedence over query params."},"tag_filter_operation":{"anyOf":[{"type":"string","enum":["and","or"]},{"type":"null"}],"title":"Tag Filter Operation","description":"Tag filter logic: 'or' (default) matches any tag, 'and' matches all tags. Body takes precedence over query params."}},"additionalProperties":true,"type":"object","title":"TransformDetailsReqBody","description":"Body model for POST /transforms/search requests.\n\nSupports large lists of filter values that would exceed URL length limits when using GET.\nBody parameters take precedence over query parameters when both are provided."},"TransformDetailsRes":{"properties":{"page":{"type":"integer","title":"Page","description":"Current page number","default":1},"page_size":{"type":"integer","title":"Page Size","description":"Results per page","default":10},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total","description":"Total number of results"},"has_next":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Next","description":"Whether more pages exist"},"result":{"items":{"$ref":"#/components/schemas/TransformDetailsEntity"},"type":"array","title":"Result"}},"additionalProperties":true,"type":"object","required":["result"],"title":"TransformDetailsRes"},"TransformInputTable":{"properties":{"name":{"type":"string","title":"Name"},"topicMatcherRegex":{"type":"string","title":"Topicmatcherregex"},"createTableSQL":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Createtablesql"}},"additionalProperties":true,"type":"object","required":["name","topicMatcherRegex"],"title":"TransformInputTable"},"TransformJobError":{"properties":{"job_id":{"type":"string","title":"Job Id"},"job_name":{"type":"string","title":"Job Name"},"message":{"type":"string","title":"Message"},"stacktrace":{"type":"string","title":"Stacktrace"}},"additionalProperties":true,"type":"object","required":["job_id","job_name","message","stacktrace"],"title":"TransformJobError"},"TransformJobStatusRes":{"properties":{"id":{"type":"string","title":"Id"},"job_name":{"type":"string","title":"Job Name"},"status":{"$ref":"#/components/schemas/TransformStatus"},"start_time":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time"}},"additionalProperties":true,"type":"object","required":["id","job_name","status"],"title":"TransformJobStatusRes"},"TransformLanguageEnum":{"type":"string","enum":["PYTHON","JAVASCRIPT","SQL"],"title":"TransformLanguageEnum"},"TransformMetric":{"properties":{"tasks":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tasks"},"latency":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Latency"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"duration":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration"},"start_time":{"anyOf":[{"type":"integer"},{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time"},"end_time":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time"},"checkpoints":{"anyOf":[{"$ref":"#/components/schemas/TransformCheckpointsInfo"},{"type":"null"}]}},"additionalProperties":true,"type":"object","title":"TransformMetric"},"TransformMetricsRes":{"properties":{"latency":{"type":"integer","title":"Latency","description":"Transform processing latency in milliseconds","default":0}},"additionalProperties":true,"type":"object","title":"TransformMetricsRes","description":"Metrics for a transform in the topic lineage view."},"TransformOperatorState":{"properties":{"operator_id":{"type":"string","title":"Operator Id"},"operator_name":{"type":"string","title":"Operator Name"},"state_size":{"type":"integer","title":"State Size"},"checkpointed_size":{"type":"integer","title":"Checkpointed Size"},"end_to_end_duration":{"type":"integer","title":"End To End Duration"},"parallelism":{"type":"integer","title":"Parallelism"}},"additionalProperties":true,"type":"object","required":["operator_id","operator_name","state_size","checkpointed_size","end_to_end_duration","parallelism"],"title":"TransformOperatorState","description":"Per-operator state size breakdown."},"TransformSerializationFormatEnum":{"type":"string","enum":["Any","Json","Avro"],"title":"TransformSerializationFormatEnum"},"TransformStatus":{"type":"string","enum":["RUNNING","INITIALIZING","DEPLOYING","CANCELLING","CANCELED","CREATED","RESTARTING","FAILING","FAILED","STOPPED","UNKNOWN"],"title":"TransformStatus","description":"Transform job status values.\n\nThese values match the statuses returned by get_transform_status() in transforms/dynamic_utils.py.\nThe status is computed from ClickHouse metrics that track each phase of transform execution."},"TransformsEnrichAsyncConfig":{"properties":{"transforms.name":{"type":"string","title":"Transforms.Name"},"transforms.language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transforms.Language"},"transforms.input.topic.pattern":{"type":"string","title":"Transforms.Input.Topic.Pattern"},"transforms.output.topic.pattern":{"type":"string","title":"Transforms.Output.Topic.Pattern"},"transforms.input.serialization.format":{"$ref":"#/components/schemas/TransformSerializationFormatEnum"},"transforms.output.serialization.format":{"$ref":"#/components/schemas/TransformSerializationFormatEnum"},"transforms.input.job.parallelism":{"type":"integer","title":"Transforms.Input.Job.Parallelism","default":5},"transforms.topic.ttl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transforms.Topic.Ttl"},"kc.cluster.id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kc.Cluster.Id"},"transforms.async.timeout.ms":{"type":"integer","title":"Transforms.Async.Timeout.Ms","default":1000},"transforms.async.capacity":{"type":"integer","title":"Transforms.Async.Capacity","default":10}},"additionalProperties":true,"type":"object","required":["transforms.name","transforms.input.topic.pattern","transforms.output.topic.pattern","transforms.input.serialization.format","transforms.output.serialization.format"],"title":"TransformsEnrichAsyncConfig"},"TransformsEnrichAsyncImplementation":{"properties":{"language":{"$ref":"#/components/schemas/TransformLanguageEnum"},"value_transform":{"type":"string","title":"Value Transform"},"key_transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Transform"},"topic_transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Transform"},"common_transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Common Transform"},"value_schema_transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Schema Transform"},"key_schema_transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Schema Transform"},"unit_test":{"anyOf":[{"$ref":"#/components/schemas/TransformsUnitTest"},{"type":"null"}]},"async_timeout_ms":{"type":"integer","title":"Async Timeout Ms","default":2000},"async_capacity":{"type":"integer","title":"Async Capacity","default":10}},"additionalProperties":false,"type":"object","required":["language","value_transform"],"title":"TransformsEnrichAsyncImplementation"},"TransformsEnrichImplementation":{"properties":{"mainTable":{"$ref":"#/components/schemas/TransformInputTable"},"lookupTable":{"$ref":"#/components/schemas/TransformInputTable"},"enrichSQL":{"type":"string","title":"Enrichsql"}},"additionalProperties":false,"type":"object","required":["mainTable","lookupTable","enrichSQL"],"title":"TransformsEnrichImplementation"},"TransformsImplementationDetails":{"properties":{"transform_id":{"type":"string","title":"Transform Id"},"version_id":{"type":"string","title":"Version Id","default":""},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"config":{"anyOf":[{"$ref":"#/components/schemas/TransformConfig"},{"$ref":"#/components/schemas/TransformsEnrichAsyncConfig"},{"type":"null"}],"title":"Config"},"created_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Timestamp"},"implementation":{"anyOf":[{"$ref":"#/components/schemas/TransformsMapFilterImplementation"},{"$ref":"#/components/schemas/TransformsEnrichImplementation"},{"$ref":"#/components/schemas/TransformsEnrichAsyncImplementation"},{"$ref":"#/components/schemas/TransformsJoinImplementation"},{"$ref":"#/components/schemas/TransformsRollupImplementation"},{"$ref":"#/components/schemas/TransformsTopicRouterImplementation"},{"type":"null"}],"title":"Implementation"}},"additionalProperties":true,"type":"object","required":["transform_id"],"title":"TransformsImplementationDetails"},"TransformsImplementationDetailsRes":{"properties":{"transform_id":{"type":"string","title":"Transform Id"},"impl_versions":{"additionalProperties":{"$ref":"#/components/schemas/TransformsImplementationDetails"},"type":"object","title":"Impl Versions"}},"additionalProperties":true,"type":"object","required":["transform_id"],"title":"TransformsImplementationDetailsRes"},"TransformsImplementationDetailsTestRecord":{"properties":{"topic":{"type":"string","title":"Topic"},"value":{"additionalProperties":true,"type":"object","title":"Value"},"key":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Key"},"timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Timestamp"}},"type":"object","required":["topic","value"],"title":"TransformsImplementationDetailsTestRecord"},"TransformsJoinImplementation":{"properties":{"inputTables":{"items":{"$ref":"#/components/schemas/TransformInputTable"},"type":"array","title":"Inputtables"},"joinSQL":{"type":"string","title":"Joinsql"},"keyFields":{"items":{"type":"string"},"type":"array","title":"Keyfields"},"stateTtlMs":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Statettlms"}},"additionalProperties":false,"type":"object","required":["joinSQL"],"title":"TransformsJoinImplementation"},"TransformsLibraryEnum":{"type":"string","enum":["fan_out","sql_join","enrich","enrich_async","map_filter","toast_handling","un_nesting","rollup","topic_router"],"title":"TransformsLibraryEnum"},"TransformsMapFilterImplementation":{"properties":{"language":{"$ref":"#/components/schemas/TransformLanguageEnum"},"value_transform":{"type":"string","title":"Value Transform"},"key_transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Transform"},"topic_transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Transform"},"common_transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Common Transform"},"value_schema_transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value Schema Transform"},"key_schema_transform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Schema Transform"},"unit_test":{"anyOf":[{"$ref":"#/components/schemas/TransformsUnitTest"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["language","value_transform"],"title":"TransformsMapFilterImplementation"},"TransformsRollupImplementation":{"properties":{"inputTables":{"items":{"$ref":"#/components/schemas/TransformInputTable"},"type":"array","title":"Inputtables"},"rollupSQL":{"type":"string","title":"Rollupsql"},"keyFields":{"items":{"type":"string"},"type":"array","title":"Keyfields"},"sourceIdleTimeoutMs":{"type":"integer","title":"Sourceidletimeoutms","default":30000},"stateTTLMs":{"type":"integer","title":"Statettlms","default":86400000}},"additionalProperties":false,"type":"object","required":["rollupSQL"],"title":"TransformsRollupImplementation"},"TransformsTopicRouterImplementation":{"properties":{"topic_prefix":{"type":"string","title":"Topic Prefix","description":"Deprecated - kept for backwards compat with existing DB records","default":""},"kc_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kc Cluster Id","description":"KC cluster to deploy the connector to"}},"additionalProperties":false,"type":"object","title":"TransformsTopicRouterImplementation","description":"Topic router transform - deployed as KC Kafka destination connector with byte passthrough.\n\nNo Flink job. Uses ByteArrayConverter + RegexRouter SMT to rewrite\ntopic names without deserializing message values.\nInput/output patterns come from transform.config (transforms.input.topic.pattern / transforms.output.topic.pattern)."},"TransformsUnitTest":{"properties":{"test_name":{"type":"string","title":"Test Name"},"input__json":{"items":{"$ref":"#/components/schemas/TransformsImplementationDetailsTestRecord"},"type":"array","title":"Input  Json"},"output__json":{"items":{"$ref":"#/components/schemas/TransformsImplementationDetailsTestRecord"},"type":"array","title":"Output  Json"},"result__json":{"anyOf":[{"items":{"$ref":"#/components/schemas/TransformsImplementationDetailsTestRecord"},"type":"array"},{"type":"null"}],"title":"Result  Json"},"is_success":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Success"},"html_diff":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Html Diff"},"text_diff":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Text Diff"}},"type":"object","required":["test_name","input__json","output__json"],"title":"TransformsUnitTest"},"TriggerRowLevelAuditReq":{"properties":{"pipeline_id":{"type":"string","title":"Pipeline Id"},"topics":{"items":{"type":"string"},"type":"array","title":"Topics"},"ts_col":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ts Col"},"fix_dst_only_age_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Fix Dst Only Age Ms"}},"additionalProperties":true,"type":"object","required":["pipeline_id","topics"],"title":"TriggerRowLevelAuditReq","description":"Body for POST /pipelines/row-level-audit — see spec #trigger-pipeline-row-level-audit."},"UnifiedSnapshotBody":{"properties":{"source_id":{"type":"string","title":"Source Id"},"topic_names":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Topic Names"},"additional_conditions":{"anyOf":[{"items":{"$ref":"#/components/schemas/AdditionalCondition"},"type":"array"},{"type":"null"}],"title":"Additional Conditions"},"snapshot_type":{"type":"string","enum":["incremental","blocking"],"title":"Snapshot Type","description":"Type of snapshot to execute. 'incremental' uses watermarking and allows streaming to continue. 'blocking' pauses streaming and is required for keyless tables. Note: additional_conditions and surrogate_key are only supported for incremental snapshots.","default":"incremental"},"surrogate_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surrogate Key","description":"Column name to use as surrogate primary key for all tables during snapshot chunking. Only supported for incremental snapshots, not blocking snapshots."}},"additionalProperties":true,"type":"object","required":["source_id"],"title":"UnifiedSnapshotBody","description":"Unified snapshot request body supporting all snapshot types.\n\nThis model supports:\n- Incremental snapshots: Use watermarking, streaming continues, supports filters\n- Blocking snapshots: Pause streaming, useful for keyless tables or faster snapshots\n\nThe snapshot_type field determines which snapshot mechanism is used.\nFor stop operations, the type is auto-detected from the running snapshot."},"UpdateAgentConfigRequest":{"properties":{"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description","description":"Human-readable context for the agent"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled","description":"Kill switch — set false to disable output emission without cancel/redeploy."},"input":{"anyOf":[{"$ref":"#/components/schemas/AgentInputConfig"},{"type":"null"}]},"output":{"anyOf":[{"$ref":"#/components/schemas/AgentOutputConfig"},{"type":"null"}]},"llm":{"anyOf":[{"$ref":"#/components/schemas/AgentLlmConfig"},{"type":"null"}]},"prompts":{"anyOf":[{"$ref":"#/components/schemas/AgentPromptConfig"},{"type":"null"}]},"mcpServer":{"anyOf":[{"$ref":"#/components/schemas/AgentMcpServerConfig"},{"type":"null"}]},"tools":{"anyOf":[{"items":{"$ref":"#/components/schemas/AgentToolConfig"},"type":"array"},{"type":"null"}],"title":"Tools"},"memory":{"anyOf":[{"$ref":"#/components/schemas/AgentMemoryConfig"},{"type":"null"}]},"knowledgeBases":{"anyOf":[{"items":{"$ref":"#/components/schemas/AgentKnowledgeBaseRef"},"type":"array","maxItems":10},{"type":"null"}],"title":"Knowledgebases","description":"Knowledge bases this agent can query at runtime for RAG"},"processing":{"anyOf":[{"$ref":"#/components/schemas/AgentProcessingConfig"},{"type":"null"}]},"changeNote":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Changenote"}},"additionalProperties":false,"type":"object","title":"UpdateAgentConfigRequest","description":"Request body for PUT /agents/{id}/config - update agent config and redeploy."},"UpdateDestinationReq":{"properties":{"name":{"type":"string","title":"Name","description":"Display name for the destination connector."},"connector":{"type":"string","title":"Connector","description":"Connector type identifier (e.g., 'snowflake', 'bigquery', 'clickhouse', 'postgresql', 's3')."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Connector-specific configuration properties using dot notation. Use the GET /destinations/connectors endpoint with a connector_code query parameter to retrieve the full configuration schema for a specific connector type."},"kc_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kc Cluster Id","description":"KC cluster to deploy this connector to. Omit for default cluster."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs to assign to this destination"}},"additionalProperties":true,"type":"object","required":["name","connector","config"],"title":"UpdateDestinationReq","description":"Request body for updating an existing destination connector."},"UpdateKafkaUserBody":{"properties":{"whitelist_ips":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Whitelist Ips"},"kafka_acls":{"items":{"$ref":"#/components/schemas/KafkaAclModel"},"type":"array","title":"Kafka Acls","default":[]},"password":{"anyOf":[{"type":"string","maxLength":128,"minLength":12},{"type":"null"}],"title":"Password"},"is_create_schema_registry":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Create Schema Registry"}},"additionalProperties":true,"type":"object","title":"UpdateKafkaUserBody","description":"Update Kafka User Body"},"UpdatePipelineAuditReq":{"properties":{"topics":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Topics"},"timestamp_column":{"type":"string","title":"Timestamp Column"},"interval_minutes":{"type":"integer","title":"Interval Minutes"},"fix_deletes_only":{"type":"boolean","title":"Fix Deletes Only","default":false}},"additionalProperties":true,"type":"object","required":["topics","timestamp_column","interval_minutes"],"title":"UpdatePipelineAuditReq","description":"Update pipeline audit request."},"UpdatePipelineReq":{"properties":{"name":{"type":"string","title":"Name"},"destination":{"$ref":"#/components/schemas/PipelineDestinationConnector"},"source":{"$ref":"#/components/schemas/PipelineSourceConnector"},"transforms":{"anyOf":[{"items":{"$ref":"#/components/schemas/PipelineTransformConnector"},"type":"array"},{"type":"null"}],"title":"Transforms"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"periodic_audit":{"anyOf":[{"$ref":"#/components/schemas/UpdatePipelineAuditReq"},{"type":"null"}]},"topic_auto_discovery_transforms":{"items":{"$ref":"#/components/schemas/TopicAutoDiscoveryTransform"},"type":"array","title":"Topic Auto Discovery Transforms","default":[]}},"additionalProperties":true,"type":"object","required":["name","destination","source","tags"],"title":"UpdatePipelineReq"},"UpdateSourceReq":{"properties":{"name":{"type":"string","title":"Name","description":"Display name for the source connector."},"connector":{"type":"string","title":"Connector","description":"Connector type identifier (e.g., 'postgresql', 'mysql', 'mongodb', 'dynamodb', 'sqlserveraws')."},"config":{"additionalProperties":true,"type":"object","title":"Config","description":"Connector-specific configuration properties using dot notation (e.g., 'table.include.list', 'schema.include.list'). Use the GET /sources/connectors endpoint with a connector_code query parameter to retrieve the full configuration schema for a specific connector type."},"kc_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kc Cluster Id","description":"KC cluster to deploy this connector to. Omit for default cluster."},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs to assign to this source"}},"additionalProperties":true,"type":"object","required":["name","connector","config"],"title":"UpdateSourceReq","description":"Request body for updating an existing source connector."},"UpdateSubscriberBody":{"properties":{"email":{"type":"string","title":"Email"}},"additionalProperties":true,"type":"object","required":["email"],"title":"UpdateSubscriberBody"},"UpdateTransformReq":{"properties":{"transform":{"$ref":"#/components/schemas/TransformsLibraryEnum"},"config":{"$ref":"#/components/schemas/TransformConfig"},"created_from":{"anyOf":[{"$ref":"#/components/schemas/EntityOriginEnum"},{"type":"null"}],"default":"api"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","description":"List of tag IDs to assign to this transform"},"id":{"type":"string","title":"Id"}},"additionalProperties":true,"type":"object","required":["transform","config","id"],"title":"UpdateTransformReq"},"User":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name"},"profile_picture_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Picture Url"},"phone_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone Number"},"tenant_id":{"type":"string","title":"Tenant Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"last_login":{"anyOf":[{"type":"string"},{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login"}},"type":"object","required":["id","email","name","tenant_id"],"title":"User"},"ValidateLlmRequest":{"properties":{"provider":{"$ref":"#/components/schemas/AgentLlmProviderEnum"},"model":{"type":"string","maxLength":200,"title":"Model","default":""},"apiKey":{"type":"string","maxLength":512,"title":"Apikey","description":"Raw key - never stored","default":""},"baseUrl":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Baseurl"},"savedConnectionId":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Savedconnectionid","description":"If set, BE resolves provider/apiKey/baseUrl from the tenant's saved llmConnection by id and ignores the inline ``apiKey`` / ``baseUrl``."}},"additionalProperties":false,"type":"object","required":["provider"],"title":"ValidateLlmRequest","description":"Request body for POST /agents/validate-llm.\n\nTwo callable shapes:\n\n1. **Inline** - ``apiKey`` (+ optional ``baseUrl``) supplied directly.\n   Used when the user is pasting a fresh key in the form.\n2. **Saved connection** - ``savedConnectionId`` references a row in\n   ``agent_connections.llmConnections``. The BE loads the decrypted\n   ``apiKey`` / ``baseUrl`` server-side so the browser never has to\n   hold (or re-send) a stored plaintext to test it. Mirrors the MCP\n   ``savedConnectionId`` discovery path."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VectorStoreProviderEnum":{"type":"string","enum":["pgvector","pinecone","milvus","opensearch","elasticsearch","s3vectors","redis"],"title":"VectorStoreProviderEnum","description":"Vector-store providers supported by the Flink runtime (integration guide §3b.4).\n\nTwo shape families:\n\n- **Typed-field providers** — ``pgvector`` and ``pinecone``. Each has a\n  fixed set of named fields on ``AgentVectorStoreConnection``.\n- **Pass-through providers** — ``milvus``, ``opensearch``,\n  ``elasticsearch``, ``s3vectors``. Each carries a free-form\n  ``properties`` map that gets copied straight into the framework's\n  ``ResourceDescriptor.addInitialArgument(key, value)`` pairs at deploy\n  time. Framework validates required keys at open-time.\n\n``redis`` is retained for legacy saved connections but is not accepted by\nthe current runtime."},"app__models__api__agents_api_models__flink_jobs__FlinkJobDetailResponse":{"properties":{"_id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"job_type":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobTypeEnum"},"status":{"$ref":"#/components/schemas/FlinkJobStatusEnum"},"desired_status":{"anyOf":[{"$ref":"#/components/schemas/FlinkJobStatusEnum"},{"type":"null"}]},"flink_job_name":{"type":"string","title":"Flink Job Name"},"flink_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flink Job Id"},"parallelism":{"type":"integer","title":"Parallelism","default":1},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"agent_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Agent Config"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"created_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Timestamp"},"updated_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Timestamp"},"live_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Live Status","description":"Live status from Flink REST API"},"checkpoints":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Checkpoints"},"errors":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Errors"},"job_args":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Job Args"},"savepoint_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Savepoint Path"}},"additionalProperties":true,"type":"object","required":["_id","name","job_type","status","flink_job_name"],"title":"FlinkJobDetailResponse","description":"Extended response with live Flink REST data."},"app__models__api__agents_api_models__flink_jobs__FlinkJobResponse":{"properties":{"_id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"job_type":{"$ref":"#/components/schemas/app__models__api__agents_api_models__flink_jobs__FlinkJobTypeEnum"},"status":{"$ref":"#/components/schemas/FlinkJobStatusEnum"},"desired_status":{"anyOf":[{"$ref":"#/components/schemas/FlinkJobStatusEnum"},{"type":"null"}]},"flink_job_name":{"type":"string","title":"Flink Job Name"},"flink_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flink Job Id"},"parallelism":{"type":"integer","title":"Parallelism","default":1},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"agent_config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Agent Config"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"created_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Timestamp"},"updated_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Timestamp"}},"additionalProperties":true,"type":"object","required":["_id","name","job_type","status","flink_job_name"],"title":"FlinkJobResponse"},"app__models__api__agents_api_models__flink_jobs__FlinkJobTypeEnum":{"type":"string","enum":["pyflink","jar","agent_config","knowledge_base"],"title":"FlinkJobTypeEnum"},"app__models__api__flink_jobs_api_models__FlinkJobDetailResponse":{"properties":{"_id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"job_type":{"$ref":"#/components/schemas/app__models__api__flink_jobs_api_models__FlinkJobTypeEnum"},"status":{"$ref":"#/components/schemas/FlinkJobStatusEnum"},"flink_job_name":{"type":"string","title":"Flink Job Name"},"flink_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flink Job Id"},"parallelism":{"type":"integer","title":"Parallelism","default":1},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"created_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Timestamp"},"updated_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Timestamp"},"live_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Live Status","description":"Live status from Flink REST API"},"checkpoints":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Checkpoints"},"errors":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Errors"},"job_args":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Job Args"},"savepoint_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Savepoint Path"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"additionalProperties":true,"type":"object","required":["_id","name","job_type","status","flink_job_name"],"title":"FlinkJobDetailResponse","description":"Extended response with live Flink REST data."},"app__models__api__flink_jobs_api_models__FlinkJobResponse":{"properties":{"_id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"job_type":{"$ref":"#/components/schemas/app__models__api__flink_jobs_api_models__FlinkJobTypeEnum"},"status":{"$ref":"#/components/schemas/FlinkJobStatusEnum"},"flink_job_name":{"type":"string","title":"Flink Job Name"},"flink_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Flink Job Id"},"parallelism":{"type":"integer","title":"Parallelism","default":1},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"created_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Timestamp"},"updated_timestamp":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated Timestamp"}},"additionalProperties":true,"type":"object","required":["_id","name","job_type","status","flink_job_name"],"title":"FlinkJobResponse"},"app__models__api__flink_jobs_api_models__FlinkJobTypeEnum":{"type":"string","enum":["pyflink","jar"],"title":"FlinkJobTypeEnum"}},"securitySchemes":{"FronteggHTTPAuthentication":{"type":"http","scheme":"bearer"}}},"tags":[{"name":"Agents","description":"Create, deploy, and manage Flink-based AI agents."},{"name":"Agents Observability","description":"Read-only views over the MCP audit log: agent rollup, sessions, spans, histograms, external-agent verify."},{"name":"Alerts","description":"Manage alert subscribers, preferences, and notification credentials."},{"name":"Authentication","description":"Obtain and refresh access tokens, manage client credentials and roles."},{"name":"Billing","description":"Retrieve usage metrics, summaries, and export billing data."},{"name":"Consumer Groups","description":"List, inspect, and reset Kafka consumer group offsets."},{"name":"Dashboard","description":"Retrieve organisation-level statistics and overview data."},{"name":"Destinations","description":"Create, configure, and manage data destinations and their lifecycle."},{"name":"Kafka Access","description":"Manage Kafka users and their access permissions."},{"name":"Logs","description":"Query and summarise system logs."},{"name":"Pipelines","description":"Create, configure, and manage CDC pipelines and their lifecycle."},{"name":"Project Keys","description":"Manage project keys that bundle API credentials and optional Kafka access."},{"name":"Schema Registry","description":"Browse schema subjects, versions, and retrieve schema definitions."},{"name":"Services","description":"View and switch service metadata."},{"name":"Sources","description":"Create, configure, and manage data sources, snapshots, and their lifecycle."},{"name":"Tags","description":"Create, update, and manage resource tags for organisation."},{"name":"Topics","description":"Browse topic details, statistics, configurations, metrics, and messages."},{"name":"Transforms","description":"Create, deploy, and manage data transforms, unit tests, and implementation details."}]}