schemes: - https - http swagger: '2.0' info: description: 'The API for Relay by Flume Health. For more information about how Flume can power your health plan, please [contact us](mailto:sales@flumehealth.com). [Redoc](/api/docs/) | [Swagger - Try It](/api/swagger/) ' title: Flume Console API contact: {} version: '1.0' x-logo: altText: Flume Health url: https://public-static.flume.health/front/logo-margin-512.png host: console.flumehealth.com basePath: / paths: /api/v1/accounts: get: description: Lists Accounts. produces: - application/json tags: - Accounts summary: List Accounts operationId: listAccounts parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Accounts to return name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/account.ListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Creates an Account. produces: - application/json tags: - Accounts summary: Create Account operationId: createAccount parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: Account Body name: account in: body required: true schema: $ref: '#/definitions/account.WriteModel' responses: '201': description: Created schema: $ref: '#/definitions/account.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/accounts/{id}: get: description: Gets an Account. produces: - application/json tags: - Accounts summary: Get Account operationId: getAccount parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the account name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/account.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email put: description: Updates an Account. produces: - application/json tags: - Accounts summary: Update Account With PUT operationId: updateAccountWithPut parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the account name: id in: path required: true - description: Account Body name: account in: body required: true schema: $ref: '#/definitions/account.UpdateModel' responses: '200': description: OK schema: $ref: '#/definitions/account.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Updates an Account. produces: - application/json tags: - Accounts summary: Update Account operationId: updateAccount parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the account name: id in: path required: true - description: Account Body name: account in: body required: true schema: $ref: '#/definitions/account.UpdateModel' responses: '200': description: OK schema: $ref: '#/definitions/account.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/accounts/{id}/config: get: description: Gets an Account Config. produces: - application/json tags: - Accounts summary: Get Account Config operationId: getAccountConfig parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the account name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/account.ReadAccountConfigModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Updates an Account Config. produces: - application/json tags: - Accounts summary: Update Account Config operationId: updateAccountConfig parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the account name: id in: path required: true - description: Account Body name: account in: body required: true schema: $ref: '#/definitions/account.UpdateAccountConfigModel' responses: '200': description: OK schema: $ref: '#/definitions/account.UpdateAccountConfigModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/accounts/{id}/contracts: get: description: List account contracts for a specific account produces: - application/json tags: - Account Contracts summary: List Account Contracts operationId: listAccountContracts parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Account ID name: id in: path required: true - type: string description: Page token for pagination name: pageToken in: query - type: string description: Page size for pagination name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/accountcontract.ListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Create a new account contract for a specific account produces: - application/json tags: - Account Contracts summary: Create Account Contract operationId: createAccountContract parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Account ID name: id in: path required: true - description: Account contract payload name: contract in: body required: true schema: $ref: '#/definitions/accountcontract.WriteModel' responses: '200': description: OK schema: $ref: '#/definitions/accountcontract.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/accounts/{id}/contracts/{contractId}: delete: description: Delete an existing account contract produces: - application/json tags: - Account Contracts summary: Delete Account Contract operationId: deleteAccountContract parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Account ID name: id in: path required: true - type: string description: Contract ID name: contractId in: path required: true responses: '204': description: No Content '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Update an existing account contract produces: - application/json tags: - Account Contracts summary: Update Account Contract operationId: updateAccountContract parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Account ID name: id in: path required: true - type: string description: Contract ID name: contractId in: path required: true - description: Account contract update payload name: contract in: body required: true schema: $ref: '#/definitions/accountcontract.UpdateModel' responses: '200': description: OK schema: $ref: '#/definitions/accountcontract.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/accounts/{id}/secret: get: description: Get an account secret. produces: - application/json tags: - Accounts summary: Get Account Secret operationId: getAccountSecret parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the account name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/secret.ApiCloudCredSecret' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/connections: get: description: List Connections produces: - application/json tags: - Connections summary: List Connections operationId: listConnections parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: array items: type: integer collectionFormat: multi description: List of ids to filter for. If empty, no filtration occurs. name: ids in: query - type: array items: type: integer collectionFormat: multi description: List of endpoint IDs to filter for. If empty, no filtration occurs. name: endpointIds in: query - type: string description: Field by which to sort results. Defaults to name asc. Options:created,name name: orderBy in: query - type: boolean description: If true, sorts in descending order name: orderDesc in: query - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Connections to return name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/connection.ListResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Create Connection consumes: - application/json produces: - application/json tags: - Connections summary: Create Connection operationId: createConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: Connection body name: connection in: body required: true schema: $ref: '#/definitions/connection.WriteModel' responses: '201': description: Created schema: $ref: '#/definitions/connection.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/connections/{id}: get: description: Get Connection produces: - application/json tags: - Connections summary: Get Connection operationId: getConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: Connection ID name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/connection.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Update Connection consumes: - application/json produces: - application/json tags: - Connections summary: Update Connection operationId: updateConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the connection name: id in: path required: true - description: Connection body name: connection in: body required: true schema: $ref: '#/definitions/connection.PatchModel' responses: '200': description: OK schema: $ref: '#/definitions/connection.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/approvers: get: description: List PAM approvers. Requires can_grant_approvers permission. produces: - application/json tags: - Context Discovery summary: List Discovery Approvers operationId: listDiscoveryApprovers parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Filter by email name: email in: query - type: boolean description: 'Filter by active status (default: true)' name: active in: query - type: string description: Page token for pagination name: pageToken in: query - type: integer description: Number of results per page name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/discovery.ApproverListResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Create a new PAM approver. Requires can_grant_approvers permission. consumes: - application/json produces: - application/json tags: - Context Discovery summary: Create Discovery Approver operationId: createDiscoveryApprover parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: Approver to create name: body in: body required: true schema: $ref: '#/definitions/discovery.ApproverCreateRequest' responses: '201': description: Created schema: $ref: '#/definitions/discovery.ApproverReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/approvers/{id}: get: description: Get a specific PAM approver produces: - application/json tags: - Context Discovery summary: Get Discovery Approver operationId: getDiscoveryApprover parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: Approver ID name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/discovery.ApproverReadModel' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/approvers/{id}:revoke: post: description: Revoke a PAM approver's access. Requires can_grant_approvers permission. consumes: - application/json produces: - application/json tags: - Context Discovery summary: Revoke Discovery Approver operationId: revokeDiscoveryApprover parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: Approver ID name: id in: path required: true - description: Revocation reason name: body in: body schema: $ref: '#/definitions/discovery.ApproverRevokeRequest' responses: '200': description: OK schema: $ref: '#/definitions/discovery.ApproverReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/connections: get: description: 'List connections available for context discovery operations. Soft-deleted connections (`deletedAt != null`) are excluded by default; pass `includeDeleted=true` to see them in the response (useful for audit/recovery flows).' produces: - application/json tags: - Context Discovery summary: List Discovery Connections operationId: listDiscoveryConnections parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Filter by connection type name: connectionType in: query - type: boolean description: Filter by enabled status name: enabled in: query - type: boolean description: Include soft-deleted connections (default false) name: includeDeleted in: query - type: string description: Page token for pagination name: pageToken in: query - type: integer description: Number of results per page name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/discovery.ConnectionListResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Create a new connection for context discovery consumes: - application/json produces: - application/json tags: - Context Discovery summary: Create Discovery Connection operationId: createDiscoveryConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: Connection configuration name: connection in: body required: true schema: $ref: '#/definitions/discovery.ConnectionWriteModel' responses: '201': description: Created schema: $ref: '#/definitions/discovery.ConnectionReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '409': description: Conflict schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/connections/{id}: get: description: Get a specific connection for context discovery produces: - application/json tags: - Context Discovery summary: Get Discovery Connection operationId: getDiscoveryConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: Connection ID name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/discovery.ConnectionReadModel' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email delete: description: Delete a discovery connection produces: - application/json tags: - Context Discovery summary: Delete Discovery Connection operationId: deleteDiscoveryConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: Connection ID name: id in: path required: true responses: '204': description: No Content '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Update a connection for context discovery consumes: - application/json produces: - application/json tags: - Context Discovery summary: Update Discovery Connection operationId: updateDiscoveryConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: Connection ID name: id in: path required: true - description: Connection updates name: connection in: body required: true schema: $ref: '#/definitions/discovery.ConnectionPatchModel' responses: '200': description: OK schema: $ref: '#/definitions/discovery.ConnectionReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '409': description: Conflict schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/connections/{id}:test: post: description: Test connectivity to a discovery connection produces: - application/json tags: - Context Discovery summary: Test Discovery Connection operationId: testDiscoveryConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: Connection ID name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/discovery.ConnectionTestResult' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/extractions: get: description: List data extraction operations for discovery produces: - application/json tags: - Context Discovery summary: List Extractions operationId: listDiscoveryExtractions parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Filter by session ID name: sessionId in: query - type: string description: Filter by requester (me, all, or email) name: requester in: query - type: string description: Filter by status name: status in: query - type: string description: Page token for pagination name: pageToken in: query - type: integer description: Number of results per page name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/discovery.ExtractionListResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Execute a data extraction (SQL query) against a connection consumes: - application/json produces: - application/json tags: - Context Discovery summary: Execute Extraction operationId: executeDiscoveryExtraction parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: Extraction parameters name: extraction in: body required: true schema: $ref: '#/definitions/discovery.ExtractionCreateRequest' responses: '201': description: Created schema: $ref: '#/definitions/discovery.ExtractionResultModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Session expired or not approved schema: $ref: '#/definitions/responses.ErrorResponse' '422': description: SQL validation failed schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/extractions/{id}: get: description: Get a specific extraction with results produces: - application/json tags: - Context Discovery summary: Get Extraction operationId: getDiscoveryExtraction parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Extraction ID name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/discovery.ExtractionResultModel' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/sessions: get: description: List discovery access sessions (PAM requests) produces: - application/json tags: - Context Discovery summary: List Discovery Sessions operationId: listDiscoverySessions parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Filter by status (pending, approved, denied, expired, revoked) name: status in: query - type: string description: Filter by requester (me, all) name: requester in: query - type: string description: Filter by grant type (data_access, approver_access) name: grantType in: query - type: string description: Page token for pagination name: pageToken in: query - type: integer description: Number of results per page name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/discovery.SessionListResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Request a new discovery access session (PAM request) consumes: - application/json produces: - application/json tags: - Context Discovery summary: Request Discovery Session operationId: createDiscoverySession parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: Session request name: session in: body required: true schema: $ref: '#/definitions/discovery.SessionCreateRequest' responses: '201': description: Created schema: $ref: '#/definitions/discovery.SessionReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/sessions/{id}: get: description: Get a specific discovery access session produces: - application/json tags: - Context Discovery summary: Get Discovery Session operationId: getDiscoverySession parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Session ID name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/discovery.SessionReadModel' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/sessions/{id}/launches: post: description: Record a single AI CLI tool launch under a subscription_access session. The session must exist, belong to the caller, be a subscription_access grant, be approved, and not be expired or revoked. The launch is written to the audit log (event=isolated_session_launch); the response is a resource-create shape so the backing store can move to a table later without changing the contract. consumes: - application/json produces: - application/json tags: - Context Discovery summary: Record Subscription Session Launch operationId: launchDiscoverySession parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Session ID name: id in: path required: true - description: Launch record name: launch in: body required: true schema: $ref: '#/definitions/discovery.SessionLaunchRequest' responses: '201': description: Created schema: $ref: '#/definitions/discovery.SessionLaunchResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/sessions/{id}:approve: post: description: Approve a pending discovery access request consumes: - application/json produces: - application/json tags: - Context Discovery summary: Approve Discovery Session operationId: approveDiscoverySession parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Session ID name: id in: path required: true - description: Approval comment name: approval in: body schema: $ref: '#/definitions/discovery.SessionApproveRequest' responses: '200': description: OK schema: $ref: '#/definitions/discovery.SessionReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/sessions/{id}:cancel: post: description: Cancel a pending discovery access request. Only the requester can cancel their own pending session. consumes: - application/json produces: - application/json tags: - Context Discovery summary: Cancel Discovery Session operationId: cancelDiscoverySession parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Session ID name: id in: path required: true - description: Cancellation reason name: cancellation in: body schema: $ref: '#/definitions/discovery.SessionCancelRequest' responses: '200': description: OK schema: $ref: '#/definitions/discovery.SessionReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/sessions/{id}:deny: post: description: Deny a pending discovery access request consumes: - application/json produces: - application/json tags: - Context Discovery summary: Deny Discovery Session operationId: denyDiscoverySession parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Session ID name: id in: path required: true - description: Denial reason name: denial in: body required: true schema: $ref: '#/definitions/discovery.SessionDenyRequest' responses: '200': description: OK schema: $ref: '#/definitions/discovery.SessionReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/sessions/{id}:extend: post: description: Request to extend a session's expiration time. Requires approver approval. consumes: - application/json produces: - application/json tags: - Context Discovery summary: Extend Discovery Session operationId: extendDiscoverySession parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Session ID name: id in: path required: true - description: Extension request name: extension in: body required: true schema: $ref: '#/definitions/discovery.SessionExtendRequest' responses: '200': description: OK schema: $ref: '#/definitions/discovery.SessionReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/sessions/{id}:revoke: post: description: Revoke an active discovery access session consumes: - application/json produces: - application/json tags: - Context Discovery summary: Revoke Discovery Session operationId: revokeDiscoverySession parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Session ID name: id in: path required: true - description: Revocation reason name: revocation in: body schema: $ref: '#/definitions/discovery.SessionRevokeRequest' responses: '200': description: OK schema: $ref: '#/definitions/discovery.SessionReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/discovery/sessions:grant: post: description: Approver creates a pre-approved PAM session on behalf of another user. Skips the request → approve round-trip needed for onboarding / pre-provisioning. Caller must be a registered approver (root, SystemAdmin, or account-level approver). Self-grant is rejected for non-root callers. consumes: - application/json produces: - application/json tags: - Context Discovery summary: Grant Discovery Session (approver-only) operationId: grantDiscoverySession parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: Grant request name: grant in: body required: true schema: $ref: '#/definitions/discovery.SessionGrantRequest' responses: '201': description: Created schema: $ref: '#/definitions/discovery.SessionReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/context/graph: get: description: Returns the health and metadata of the knowledge graph for the authenticated account produces: - application/json tags: - Context Graph summary: Get graph status operationId: getGraphStatus responses: '200': description: OK schema: $ref: '#/definitions/graph.StatusResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/graph:query: post: description: Runs a read-only Cypher query against the account's knowledge graph consumes: - application/json produces: - application/json tags: - Context Graph summary: Execute a Cypher query operationId: queryGraph parameters: - description: Cypher query name: body in: body required: true schema: $ref: '#/definitions/graph.QueryRequest' responses: '200': description: OK schema: $ref: '#/definitions/graph.QueryResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '408': description: Request Timeout schema: $ref: '#/definitions/responses.ErrorResponse' '413': description: Request Entity Too Large schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/graph:search: get: description: Performs semantic or hybrid vector search against the account's graph produces: - application/json tags: - Context Graph summary: Search the knowledge graph operationId: searchGraph parameters: - type: string description: Search query text name: query in: query required: true - enum: - semantic - hybrid type: string default: semantic description: 'Search mode: semantic or hybrid' name: mode in: query - type: integer default: 10 description: Max results to return name: top_k in: query - type: number default: 0 description: Min similarity threshold (0-1) name: min_similarity in: query - type: string description: Filter by vertex type (e.g. Table, Column) name: label in: query responses: '200': description: OK schema: $ref: '#/definitions/graph.SearchResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge: get: description: 'Lists curated knowledge for the authenticated account, ordered by fqn and filterable by scope, kind, status, and fqn-prefix. The agent reads knowledge via graph-search/graph-query (K1); this is the CURATOR/manage surface. A read, so — like get — it is not gated by the knowledge_write_manage flag: a write-off rollback still serves it. One curator-scoped rule applies: a NON-curator never sees status=proposed rows (unapproved content is what the review-queue and proposal-list gates protect, and an inventory must not route around them); a non-curator filtering for proposed gets an empty list, not an error. The result is BOUNDED (limit defaults to 200, ceiling 1000) and the envelope carries no cursor, so an account past the ceiling is truncated — the truncation is logged server-side, and wire pagination is the fix rather than a larger bound.' produces: - application/json tags: - Context Knowledge summary: List knowledge operationId: listKnowledge parameters: - type: string description: Filter by scope type (flume_core, account, project, user, session) name: scope in: query - type: string description: Filter by kind. Matched exactly and NOT validated against a closed set — kind is open-with-declaration (G8), so an account's declared kind:ontology values are legal filter values. name: kind in: query - type: string description: Filter by lifecycle status (proposed, active, superseded, archived, rejected, tombstoned) name: status in: query - type: string description: Filter by fqn prefix (opaque, store-minted knowledge/{id}; C16) name: fqn_prefix in: query - type: integer description: Max entities to return (default 200, ceiling 1000) name: limit in: query responses: '200': description: OK schema: $ref: '#/definitions/knowledge.KnowledgeListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] post: description: 'Creates a knowledge entity. account_id comes from request context, fqn is store-minted (C16), and curator_role from auth — none may be supplied in the body. TWO paths share this route by a body-value dispatch on status (AIP: not a bespoke verb): the default status=active is the CURATOR-gated create, while status=proposed is the save-this proposal (FL-29879) — NOT curator-gated, any authenticated author may propose. A proposal lands status=proposed plus one review_items row and is never retrieval-eligible until a curator approves it via the row-scoped review-items/{review_item_id}:approve. The propose-only evidence fields (proposed_target, sensitivity, verification_interval) are accepted ONLY with status=proposed; the source evidence link rides in source_refs, which already documents exactly that purpose.' consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Create a knowledge entity operationId: createKnowledge parameters: - description: Knowledge to create name: body in: body required: true schema: $ref: '#/definitions/knowledgemanager.CreateKnowledgeInput' responses: '201': description: Created schema: $ref: '#/definitions/knowledgestore.KnowledgeEntity' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/artifacts: post: description: Persists a content-addressed :Artifact (code/document/image). Identity is the content_hash (derived from the payload; a supplied hash is verified). Byte-identical content dedups to one row (FR-33). Raw PHI bytes are never injected — only the sanitized extracted_text is embedded/injected. A binary artifact's `bytes` are retained (FL-30227), stored against the content_hash outside the graph and served only through GET /api/v1/context/knowledge/artifacts/{content_hash}/content, which is role- and sensitivity-gated. Identity, size, media_type, extracted_text, and sensitivity/scope persist on the artifact itself. consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Create a content-addressed artifact operationId: createKnowledgeArtifact parameters: - description: Artifact to create name: body in: body required: true schema: $ref: '#/definitions/knowledge.CreateArtifactRequest' responses: '201': description: Created schema: $ref: '#/definitions/knowledge.CreateArtifactResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/artifacts/{content_hash}/content: get: description: Streams the raw bytes of a stored binary artifact, addressed by content_hash. Requires Editor or above; a phi_bearing or unclassified artifact additionally requires a curator (SystemAdmin). Returns 404 when no payload is stored — including for artifacts created before payload persistence existed, whose bytes were discarded and cannot be recovered except by re-creating the artifact from the same content. Raw bytes are never injected or embedded; only the sanitized extracted_text is. produces: - application/octet-stream tags: - Context Knowledge summary: Download a binary artifact's payload operationId: getKnowledgeArtifactContent parameters: - type: string description: Artifact content hash (sha256-…) name: content_hash in: path required: true responses: '200': description: The artifact payload schema: type: file '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/graph: get: description: 'Returns the read-only knowledge graph (nodes + edges) for the graph view (FR-25). Read-only: mutation happens on the manage surface. Not yet implemented (501).' produces: - application/json tags: - Context Knowledge summary: Get the read-only knowledge graph operationId: getKnowledgeGraph parameters: - type: string description: Filter by scope type name: scope in: query responses: '200': description: OK schema: $ref: '#/definitions/knowledge.KnowledgeGraphResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '501': description: Not Implemented schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/prefix: get: description: 'Returns the near-static {ontology} schema-card and the debounced/versioned {index} block with their current versions, for the gateway proxy flow to attach to the cached system-prefix (FR-34). These blocks are read-side only: they do NOT pass the per-turn relevance gate or count against the per-turn budget. Gated by knowledge_read_inject; with the flag off the endpoint returns 503 (read-off rollback).' produces: - application/json tags: - Context Knowledge summary: Get the stable knowledge prefix blocks operationId: getKnowledgePrefix responses: '200': description: OK schema: $ref: '#/definitions/knowledge.KnowledgePrefixResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/proposals: get: description: Lists status=proposed knowledge items awaiting curator review (FR-7, FR-27). Account-isolated and CURATOR-GATED (a non-curator gets 403, even though the route-level policy admits editors) — the list carries unapproved proposal content. Each entry is hydrated from the LIVE :Knowledge node, so a curator's edits before approval are what the queue shows; the reason comes from the review row. A read, so — like get — it is not gated by the knowledge_write_manage flag. produces: - application/json tags: - Context Knowledge summary: List knowledge proposals operationId: listKnowledgeProposals responses: '200': description: OK schema: $ref: '#/definitions/knowledge.ProposalListResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/review-items: get: description: 'Returns the account''s curator review queue (proposed_knowledge, bulk_seed_ambiguity and feedback_flag rows) for the review-queue UI (Story 5.2, pulled into v1), optionally filtered by status. Account-isolated and CURATOR-GATED (a non-curator gets 403, even though the route-level policy admits editors). A read, so — like get — it is not gated by the knowledge_write_manage flag: a write-off rollback still serves the queue.' produces: - application/json tags: - Context Knowledge summary: Get the curator review queue operationId: getKnowledgeReviewQueue parameters: - type: string description: Filter by review status (open, accepted, rejected, dismissed) name: status in: query responses: '200': description: OK schema: $ref: '#/definitions/knowledge.ReviewQueueResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/review-items/{review_item_id}/promotion-preflight: get: description: 'Returns everything the propose->active promotion gate needs, in one read (FL-29879''s 2026-08-05 AC): the proposal''s §3.4 evidence, the FR-27 field NAMES it is missing, and a FRESH artifact-revision verdict. Both gate results are server-authoritative — missing_evidence because several FR-27 fields are not on ProposalPayload at all, and artifact_freshness because the revision flip skips proposed referrers, so the proposal''s own needs_review badge reads clean on exactly the case this catches. It writes nothing and is safe (and intended) to re-run on every promotion-dialog open: a verdict computed at mount would answer with the graph as it was at mount, and the failure this exists for is a revision landing while the proposal waited. CURATOR-gated. A row that is not a proposed_knowledge item has no promotion to preflight (400).' produces: - application/json tags: - Context Knowledge summary: Preflight a proposal's promotion operationId: getKnowledgePromotionPreflight parameters: - type: string description: Review item id (a bare UUIDv7 — review rows carry no collection prefix) name: review_item_id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/knowledge.PromotionPreflightResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '409': description: the proposal was promoted or its row disposed in another tab schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/review-items/{review_item_id}:approve: post: description: 'Disposes a review row as accepted. On a proposed_knowledge row this is ONE call that does BOTH halves of the promotion: it promotes the entity proposed->active (emitting the `approved` event) and disposes the row open->accepted. They are one call because the two writes span different datasets with no shared transaction, so the sequencing has to be the server''s — a client issuing two calls would own a half-applied promotion it cannot repair. On a bulk_seed_ambiguity or feedback_flag row there is no entity to promote, so it is queue bookkeeping only. Promotion enforces the FR-27 evidence floor AND the artifact-freshness re-check, refusing with 400 invalid_input and a `field` naming what blocked it (`artifacts` for a revised or unconfirmable artifact, otherwise the missing evidence field). A refused promotion writes NOTHING. CURATOR-gated.' consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Approve a review item operationId: approveKnowledgeReviewItem parameters: - type: string description: Review item id name: review_item_id in: path required: true - description: Optional approver overrides (recall_policy, verification_interval). The queue UI approves with no body, in which case the proposal's own values stand. name: body in: body schema: $ref: '#/definitions/knowledge.ApproveReviewItemRequest' responses: '200': description: OK schema: type: object additionalProperties: type: string '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '409': description: Conflict schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/review-items/{review_item_id}:dismiss: post: description: 'Disposes a review row as dismissed — the curator judged it not actionable. PURE queue bookkeeping on every item type: no knowledge effect and no knowledge_audit_log event, because a queue transition is not itself a :Knowledge state change (§1.5 keeps the two logs distinct). This is the feedback_flag disposition; a triage prompt is not a proposal, so it is never "rejected". CURATOR-gated.' produces: - application/json tags: - Context Knowledge summary: Dismiss a review item operationId: dismissKnowledgeReviewItem parameters: - type: string description: Review item id name: review_item_id in: path required: true responses: '200': description: OK schema: type: object additionalProperties: type: string '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/review-items/{review_item_id}:merge: post: description: 'Folds a proposed_knowledge row''s content into an EXISTING entity and disposes the row as accepted. There is deliberately no `merged` audit event — the sixteen-type set is closed, and a merge decomposes into exactly two recorded effects: an `edited` event on the target and an `approved` event on the review item. Only the target is client-supplied; the FIELDS folded are derived server-side from the proposal (from the LIVE node, so a curator''s pre-merge edits are what lands), because letting a client name them would make merge a general edit wearing a proposal''s disposition. Only a proposed_knowledge row can be merged. CURATOR-gated.' consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Merge a proposal into an existing entity operationId: mergeKnowledgeReviewItem parameters: - type: string description: Review item id name: review_item_id in: path required: true - description: Merge target name: body in: body required: true schema: $ref: '#/definitions/knowledge.MergeReviewItemRequest' responses: '200': description: OK schema: type: object additionalProperties: type: string '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '409': description: Conflict schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/review-items/{review_item_id}:reject: post: description: Disposes a review row as rejected. On a proposed_knowledge row it also terminates the entity (proposed->rejected) and emits a `rejected` event carrying the reason when one is supplied; the body is optional, because a curator dispositioning without typing a reason sends none. Rejecting a knowledge entity that is not a proposal is a 409 — `rejected` is a proposal-lifecycle terminus, not a general retraction (that is DELETE/tombstone). CURATOR-gated. consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Reject a review item operationId: rejectKnowledgeReviewItem parameters: - type: string description: Review item id name: review_item_id in: path required: true - description: Optional rejection reason name: body in: body schema: $ref: '#/definitions/knowledge.RejectReviewItemRequest' responses: '200': description: OK schema: type: object additionalProperties: type: string '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '409': description: Conflict schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/turns/{message_id}: get: description: 'Returns the injected-knowledge panel + RecallTrace payload for a conversation turn (FR-24). A zero-injection turn returns gate_decision=none with no recall_trace. SOURCE AND ITS LIMITS: served from an in-process retention ring on the injection-audit writer, NOT from the durable injection_audit table (whose context-db receiver does not exist yet). It is therefore SINGLE-POD (the API runs several replicas; only the pod that served the turn holds the record), RESTART-LOSSY, and BOUNDED (old turns age out). A turn this pod did not serve, or that has aged out, returns the SAME zero-injection payload as a turn that genuinely injected nothing — the two are not distinguishable, and this endpoint never 404s or 500s for a missing turn. Treat it as a demo/debug surface; the durable trail is the audit table. ADDRESSING: the gateway mints a per-turn message id and returns it as the X-Flume-Message-Id response header on the LLM proxy call that served the turn (FL-30412) — read it there and address this route with it. A conversation id is also accepted, for clients that do not read that header yet, and resolves to that conversation''s MOST RECENT retained turn — correct for a dock rendering the live answer, wrong for one pinned to an older answer. PER-ITEM FIDELITY: title, kind and scope are re-read from the entity at request time, so they reflect the entity NOW rather than at turn time; badge.freshness, conflict and phi are computed during retrieval and are NOT carried by the audit record, so they are absent/false here rather than recomputed from a second, divergable opinion.' produces: - application/json tags: - Context Knowledge summary: Get injected knowledge for a turn operationId: getTurnKnowledge parameters: - type: string description: Message id segment of the turn — the opaque id only, not a slash-bearing resource name (chi path params cannot contain a slash). Take it from the X-Flume-Message-Id response header of the LLM proxy call that served the turn. A conversation id is also accepted and resolves to that conversation's most recent retained turn. name: message_id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/knowledge.TurnKnowledgePayload' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/{id}: get: description: 'Returns a single knowledge entity by its opaque fqn (knowledge/{id}). This curator read is intentionally NOT gated by the knowledge_write_manage flag: per the flag''s design, the write/manage surface is dark-launched and rolled back independently of reads (see writeEnabled), so a write-off rollback still serves reads of already-curated entities. The flag gates mutations only, not the whole surface.' produces: - application/json tags: - Context Knowledge summary: Get a knowledge entity operationId: getKnowledge parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/knowledgestore.KnowledgeEntity' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] delete: description: Soft-deletes a knowledge entity — maps to status=tombstoned + body redaction (audited), never a hard row delete. produces: - application/json tags: - Context Knowledge summary: Tombstone a knowledge entity operationId: deleteKnowledge parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true responses: '204': description: No Content '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] patch: description: 'Field-updates a knowledge entity. C12: verify (last_verified_at + verified_by) AND publish (status + recall_policy) are BOTH PATCH field-stamps here — there is no :verify or :publish custom method; a body may carry both. A publish stamp may only set status=active.' consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Update a knowledge entity operationId: updateKnowledge parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true - description: Fields to update name: body in: body required: true schema: $ref: '#/definitions/knowledge.PatchKnowledgeRequest' responses: '200': description: OK schema: $ref: '#/definitions/knowledgestore.KnowledgeEntity' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/{id}/attach-candidates: get: description: Returns (as a normal 200) the candidate list the manage UI shows to resolve an ambiguous attach — the same candidates the write-path attach reports via 409 disambiguate_required — plus an optional same-kind/same-target conflict warning (FR-4). This read surface never itself returns 409. Not yet implemented (501). produces: - application/json tags: - Context Knowledge summary: List attach disambiguation candidates operationId: getAttachCandidates parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true - type: string description: Attach-target text to disambiguate name: q in: query responses: '200': description: OK schema: $ref: '#/definitions/knowledge.AttachCandidatesResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '501': description: Not Implemented schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/{id}/feedback: get: description: Returns the ✓/✗ feedback events recorded against a knowledge entity so curators can triage feedback_flag review items (D6a). Feedback never mutates trust fields (FR-15). Not yet implemented (501). produces: - application/json tags: - Context Knowledge summary: List feedback events for a knowledge entity operationId: listKnowledgeFeedback parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/knowledge.FeedbackEventListResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '501': description: Not Implemented schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/{id}/full: get: description: 'Returns the full view — everything the manage UI (FL-29876) renders (§3.2 KnowledgeEntityPayload): attachments, provenance, lifecycle, artifacts, conflict edges, and badges. account_id is server-populated. Not yet implemented (501).' produces: - application/json tags: - Context Knowledge summary: Get the full knowledge entity view operationId: getFullEntity parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/knowledge.KnowledgeEntityPayload' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '501': description: Not Implemented schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/{id}/peek: get: description: 'Returns the read-only single-node peek shown in the GraphPeekDrawer (FR-25): a body excerpt, badge, scope, flags, and attachment summaries. Not yet implemented (501).' produces: - application/json tags: - Context Knowledge summary: Peek a single knowledge node operationId: getGraphPeekNode parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/knowledge.GraphPeekNode' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '501': description: Not Implemented schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/{id}:attach: post: description: 'Interactive attach (FL-29867). Resolves target_text and enforces hard-required human-in-the-loop disambiguation (FR-4): 0 candidates offers :BusinessTerm creation (create_target_term to confirm), 1 auto-attaches, 2+ returns 409 disambiguate_required with candidates. A same-kind/same-target active returns 200 with a conflict_warning (not an error); resend with proceed=true to attach and record :CONFLICTS_WITH. An explicit target_fqns[] attaches directly (post-disambiguation retry).' consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Attach knowledge to a target operationId: attachKnowledge parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true - description: Attach target name: body in: body required: true schema: $ref: '#/definitions/knowledgemanager.AttachInput' responses: '200': description: OK schema: $ref: '#/definitions/knowledgemanager.AttachResult' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: no candidate — offer business-term creation schema: $ref: '#/definitions/responses.ErrorResponse' '409': description: disambiguate_required schema: $ref: '#/definitions/knowledge.DisambiguationResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/{id}:detach: post: description: 'Removes a :APPLIES_TO edge. NOT YET IMPLEMENTED (501): live edge removal is blocked on a context-db relationship-only edge-delete endpoint (FL-30075). The wire shape lands with #8 (arch §2.1); the route returns 501 until the endpoint ships.' consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Detach knowledge from a target operationId: detachKnowledge parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true responses: '501': description: blocked on FL-30075 schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/{id}:erase: post: description: 'Right-to-erasure: removes the node and its body (and the chunk-index rows and vectors), retaining only a redacted tombstone audit event. Distinct from delete/tombstone.' produces: - application/json tags: - Context Knowledge summary: Erase a knowledge entity operationId: eraseKnowledge parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true responses: '200': description: OK '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/{id}:feedback: post: description: Records a vote (up/down) plus an optional note (max 4KB) from the injected panel. A down vote also lands a review_items row for curator triage (D6a). Never mutates trust fields (FR-15). This is an end-user reaction surface (not curator-gated), so it is not gated by the knowledge_write_manage flag — but an automated (M2M) identity is rejected with 403, because a flag is a curation-plane write. consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Record feedback on knowledge operationId: feedbackKnowledge parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true - description: Feedback vote name: body in: body required: true schema: $ref: '#/definitions/knowledge.FeedbackRequest' responses: '200': description: OK schema: type: object additionalProperties: type: string '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '413': description: Request Entity Too Large schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/{id}:link-artifact: post: description: Attaches a content-addressed artifact to a knowledge entity via a typed reference edge (COMPUTED_BY for code, CITES/EVIDENCED_BY for document, ILLUSTRATED_BY for image, DERIVED_FROM for provenance). The edge type must match the artifact kind. consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Link an artifact to a knowledge entity operationId: linkKnowledgeArtifact parameters: - type: string description: Knowledge id (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true - description: Artifact link name: body in: body required: true schema: $ref: '#/definitions/knowledge.LinkArtifactRequest' responses: '200': description: OK schema: type: object additionalProperties: type: string '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge/{id}:supersede: post: description: Creates a new version, links :SUPERSEDES, and flips the prior version's temporal bounds. A genuine non-CRUD action (multi-node + side effects), so a colon custom method, not a field PATCH. consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Supersede a knowledge entity operationId: supersedeKnowledge parameters: - type: string description: Knowledge id of the entity being superseded (opaque; the full fqn is knowledge/{id}, C16) name: id in: path required: true - description: The superseding entity name: body in: body required: true schema: $ref: '#/definitions/knowledge.SupersedeRequest' responses: '200': description: OK schema: $ref: '#/definitions/knowledgestore.KnowledgeEntity' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/context/knowledge:bulk: post: description: 'Bulk/seed/migration write. Never a per-item live stop (§2.1b): an item with an explicit target_fqn creates a knowledge node and attaches it to that target, which must already exist as an estate or business-concept node; an item carrying only target_text is written to review_items (a bulk_seed_ambiguity row — pointer+hash, never the raw body) and the batch proceeds, because this path runs no target resolver; input-shape failures and rejected targets are returned per item. No item may supply fqn, id, or account_id — identity is store-minted and the account comes from the request context. The manifest must carry between 1 and 500 items. Curator-gated; requires the knowledge_write_manage flag. With dry_run the same admission rules run (shape checks and the target check, which is a read) without writing anything, so a preview never reports written for an item the real run would reject on its input — it cannot predict a store-level failure, which only the real write can hit. Each `deferred` entry is a PREVIEW of the row that would be created: item_type, status, reason, account_id and proposed_payload are exact, while review_item_id, source_event_id and created_at are minted at persist time. On a preview the two ids are OMITTED from the response; created_at is the one field that still carries a zero value ("0001-01-01T00:00:00Z") and must be treated as absent rather than parsed as a date.' consumes: - application/json produces: - application/json tags: - Context Knowledge summary: Bulk write knowledge operationId: bulkWriteKnowledge parameters: - description: Bulk manifest name: body in: body required: true schema: $ref: '#/definitions/knowledgemanager.BulkWriteInput' responses: '200': description: OK schema: $ref: '#/definitions/knowledgemanager.BulkResult' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '401': description: Unauthorized schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '413': description: Request Entity Too Large schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' '503': description: Service Unavailable schema: $ref: '#/definitions/responses.ErrorResponse' security: - BearerAuth: [] /api/v1/endpoints: get: description: Lists Endpoints. produces: - application/json tags: - Endpoints summary: List Endpoints operationId: listEndpoints parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Endpoints to return name: pageSize in: query - type: array items: type: integer collectionFormat: multi description: List of ids to filter for. If empty, no filtration occurs. name: ids in: query - type: array items: enum: - Idle - Running - Error - Stopped type: string collectionFormat: multi description: List of endpoint states to filter for. If empty, no filtration occurs. name: states in: query - type: integer description: Connection ID to filter for name: connectionId in: query - type: string description: View to return. If `alerts` is provided, endpoints that should be alerted on are returned name: view in: query - type: boolean description: Return Archived Endpoints name: archived in: query responses: '200': description: OK schema: $ref: '#/definitions/endpoint.ListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Creates an Endpoint. produces: - application/json tags: - Endpoints summary: Create Endpoint operationId: createEndpoint parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: Endpoint Body name: endpoint in: body required: true schema: $ref: '#/definitions/endpoint.WriteModel' responses: '201': description: Created schema: $ref: '#/definitions/endpoint.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/datatypes: get: description: Gets the list of data types that can be used in an endpoint mapping. produces: - application/json tags: - Endpoints summary: Get Endpoint Datatypes operationId: getEndpointDataTypes parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header responses: '200': description: OK schema: $ref: '#/definitions/datatypes.DataTypes' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/datatypes/{datatype}: get: description: Gets the information for a specific datatype that can be used in an endpoint mapping. produces: - application/json tags: - Endpoints summary: Get Endpoint Datatype operationId: getEndpointDataType parameters: - enum: - Accumulators - Authorizations - Bytes - Eligibility - Groups - MedicalClaimServiceLines - Providers - RxClaimServiceLines - MedicalAndRxClaimLines - Test - TransactionMetadata - Generic - RecordLevelMetadata - PlanNetworks - ProviderNetworkDirectory - HmClaimsExtended - HmProvidersExtended - Strings type: string description: name of the datatype name: datatype in: path required: true - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header responses: '200': description: OK schema: $ref: '#/definitions/datatypes.DataType' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/lambdas: get: description: Lists Lambdas for Endpoints. produces: - application/json tags: - Endpoints summary: List Endpoint Lambdas operationId: listEndpointLambdas parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Lambdas to return name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/endpoint.LambdaList' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{endpointId}/shards: get: description: Lists Shards for a given Endpoint produces: - application/json tags: - Shards summary: List Shards operationId: listShards parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of parent endpoint name: endpointId in: path required: true - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Transactions to return name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/transaction.ListReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Create Shards in bulk produces: - application/json tags: - Shards summary: Create Shard (Bulk) operationId: createShardsBulk parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of parent endpoint name: endpointId in: path required: true - description: bulk Shard body name: shard in: body required: true schema: $ref: '#/definitions/shard.BulkWriteModel' responses: '200': description: OK schema: $ref: '#/definitions/shard.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{endpointId}/shards/{shardId}: get: description: Gets a Shard for a given Endpoint produces: - application/json tags: - Shards summary: Get a Shard for an Endpoint operationId: getShard parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of parent endpoint name: endpointId in: path required: true - type: string description: id of shard name: shardId in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/transaction.ListReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{endpointId}/transactions: get: description: Lists Transactions for a given Endpoint produces: - application/json tags: - Transactions summary: List Transactions operationId: listTransactions parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of parent endpoint (use '-' for all endpoints) name: endpointId in: path required: true - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Transactions to return name: pageSize in: query - type: string description: Field by which to sort results. Defaults to StartTime name: orderBy in: query - type: boolean default: true description: If true, sorts in descending order name: orderDesc in: query - type: array items: type: string collectionFormat: multi description: List of states to filter for. If empty, no filtration occurs. name: state in: query - type: string description: View to return. If `excludeNoOpScheduled` is provided, transactions that are both Scheduled and SucceededNoOp are excluded name: view in: query - type: string description: Only return transactions that started after this time name: since in: query - type: array items: type: string collectionFormat: multi description: List of shardBatchKeys to filter for. If empty, no filtration occurs. name: shardBatchKeys in: query responses: '200': description: OK schema: $ref: '#/definitions/transaction.ListReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Creates a Transaction. consumes: - application/json produces: - application/json tags: - Transactions summary: Create Transaction operationId: createTransaction parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of parent endpoint name: endpointId in: path required: true - description: Transaction body name: transaction in: body required: true schema: $ref: '#/definitions/transaction.WriteModel' responses: '201': description: Created schema: $ref: '#/definitions/transaction.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{endpointId}/transactions/{id}: get: description: Gets a Transaction. produces: - application/json tags: - Transactions summary: Get Transaction operationId: getTransaction parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of parent endpoint name: endpointId in: path required: true - type: string description: id of target transaction name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/transaction.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Updates a Transaction. consumes: - application/json produces: - application/json tags: - Transactions summary: Update Transaction operationId: updateTransaction parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of parent endpoint name: endpointId in: path required: true - type: string description: id of target transaction name: id in: path required: true - description: transaction body name: transaction in: body required: true schema: $ref: '#/definitions/transaction.WriteModel' responses: '200': description: OK schema: $ref: '#/definitions/transaction.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}: get: description: Gets an Endpoint. produces: - application/json tags: - Endpoints summary: Get Endpoint operationId: getEndpoint parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true - type: string description: View to return. If `pipeline` is provided, shards and jobs are omitted for faster loading name: view in: query responses: '200': description: OK schema: $ref: '#/definitions/endpoint.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Updates an Endpoint. produces: - application/json tags: - Endpoints summary: Update Endpoint operationId: updateEndpoint parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true - description: Endpoint Body name: endpoint in: body required: true schema: $ref: '#/definitions/endpoint.UpdateModel' responses: '200': description: OK schema: $ref: '#/definitions/endpoint.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/datalake-ingest: post: description: Stream a CSV file body to be ingested into an Iceberg table via Trino. The request body is raw CSV (not JSON) — metadata is passed via headers. consumes: - text/csv produces: - application/json tags: - Endpoints summary: Stream CSV Ingest to DataLake Endpoint operationId: postIngestEndpoint parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: Endpoint ID name: id in: path required: true - type: string description: Fully qualified Iceberg table name (e.g. lakekeeper.ref_data.my_table) name: X-Table-Name in: header required: true - type: integer description: Rows per INSERT batch (100-10000, default 5000) name: X-Batch-Size in: header - description: CSV content with header row name: body in: body required: true schema: type: string responses: '200': description: Ingest results schema: $ref: '#/definitions/flitclient.IngestResponse' '400': description: Bad request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Endpoint not found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal server error schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/datalake-query: post: description: Execute a SQL query against a DataLake endpoint and stream the NDJSON results consumes: - application/json produces: - application/x-ndjson tags: - Endpoints summary: Query DataLake Endpoint operationId: postQueryEndpoint parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: Endpoint ID name: id in: path required: true - description: Query request name: body in: body required: true schema: $ref: '#/definitions/endpoint.QueryEndpointRequest' responses: '200': description: OK '400': description: Bad request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Endpoint not found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal server error schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/datalake-write: post: description: Execute a SQL write query against a DataLake endpoint consumes: - application/json produces: - application/json tags: - Endpoints summary: Execute Write Query on DataLake Endpoint operationId: postQueryWriteEndpoint parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: Endpoint ID name: id in: path required: true - description: Write query request name: body in: body required: true schema: $ref: '#/definitions/endpoint.QueryEndpointRequest' responses: '200': description: Write results schema: $ref: '#/definitions/flitclient.WriteResponse' '400': description: Bad request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Endpoint not found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal server error schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/maps/{fieldType}: get: description: List Endpoint Maps for a Field Type on an Endpoint produces: - application/json tags: - Endpoint Maps summary: List Endpoint Map Versions operationId: listEndpointMapVersions parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true - enum: - File - ControlFile - API - Database - FlumeLakehouse type: string description: Field Type name: fieldType in: path required: true - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Endpoint Maps to return name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/endpointmap.ListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/maps/{fieldType}/{ordinal}: get: description: Get Endpoint Map Version for a Field Type on an Endpoint produces: - application/json tags: - Endpoint Maps summary: Get Endpoint Map Version operationId: getEndpointMapVersion parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true - enum: - File - ControlFile - API - Database - FlumeLakehouse type: string description: Field Type name: fieldType in: path required: true - type: integer description: Endpoint Map Ordinal - API, File, and ControlFile only have Ordinal 1, Database can have multiple name: ordinal in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/endpointmap.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/secrets/api: get: description: Gets Endpoint Api secret produces: - application/json tags: - Endpoints summary: Get Endpoint Api Secrets operationId: getEndpointApiSecret parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/secret.ApiSecret' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/secrets/cloudstorage: get: description: Gets endpoint cloud storage secrets produces: - application/json tags: - Endpoints summary: Get Endpoint Cloud Storage Secrets operationId: getEndpointCloudStorageSecret parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/secret.ApiCloudCredSecret' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/secrets/cloudstorage/encryption: get: description: Gets endpoint cloud storage encryption secrets produces: - application/json tags: - Endpoints summary: Get Endpoint Cloud Storage EncryptionSecrets operationId: getEndpointCloudStorageEncryptionSecret parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/secret.ApiEncryptionSecret' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/secrets/database: get: description: Gets Endpoint Database secret produces: - application/json tags: - Endpoints summary: Get Endpoint Database Secrets operationId: getEndpointDatabaseSecret parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/secret.ApiSecret' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/secrets/flumelakehouse: get: description: Gets Endpoint FlumeLakehouse Secrets (catalogConfigs JSON credential) produces: - application/json tags: - Endpoints summary: Get Endpoint FlumeLakehouse Secrets operationId: getEndpointFlumeLakehouseSecret parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/secret.ApiFlumeLakehouseSecret' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/secrets/sftp: get: description: Gets endpoint sftp secret produces: - application/json tags: - Endpoints summary: Get Endpoint SFTP Secret operationId: getEndpointSftpSecret parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/secret.ApiSecret' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/secrets/sftp/encryption: get: description: Gets endpoint sftp encryption secret produces: - application/json tags: - Endpoints summary: Get Endpoint SFTP Encryption Secret operationId: getEndpointSftpEncryptionSecret parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/secret.ApiEncryptionSecret' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/secrets/snowflake: get: description: Gets Endpoint Snowflake Secrets produces: - application/json tags: - Endpoints summary: Get Endpoint Snowflake Secrets operationId: getEndpointSnowflakeSecret parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/secret.ApiSecret' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/tests/cloudstorage: get: description: Inspects the cloud storage connection to the server described by the endpoint's Cloud Storage credentials. If it is traversable, it exists and a 200 is returned. produces: - application/json tags: - Endpoints summary: Test Existing Cloud Storage Connection operationId: getTestCloudStorageConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Tests the cloud storage connection to the server described by the Cloud Storage credentials. If it is traversable, it exists and a 200 is returned. produces: - application/json tags: - Endpoints summary: Test New Cloud Storage Connection operationId: postTestCloudStorageConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true - description: Cloud Storage Body name: database in: body required: true schema: $ref: '#/definitions/cloudstorage.WriteModel' responses: '200': description: OK '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/tests/database: get: description: Inspects the database connection to the server described by the endpoint's Database credentials. If it is traversable, it exists and a 200 is returned. produces: - application/json tags: - Endpoints summary: Test Existing Database Connection operationId: getTestDatabaseConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Tests the database connection to the server described by the Database credentials. If it is traversable, it exists and a 200 is returned. produces: - application/json tags: - Endpoints summary: Test New Database Connection operationId: postTestDatabaseConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true - description: Database Credentials Body name: database in: body required: true schema: $ref: '#/definitions/database.WriteModel' responses: '200': description: OK '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/tests/map: post: description: Runs a test of the endpoint mapping against canned or provided data consumes: - multipart/form-data produces: - application/json - text/plain tags: - Endpoints summary: Test Endpoint map operationId: testEndpointMap parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true - type: string description: Sql Map name: sql in: formData required: true - type: file description: Input File name: file in: formData - enum: - fields - map type: string description: Mode name: mode in: formData required: true responses: '200': description: OK schema: type: string '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/tests/sftp: get: description: Inspects the connection to the server described by the endpoint's SFTP credentials. If it is traversable, it exists and a 200 is returned. produces: - application/json tags: - Endpoints summary: Get Endpoint SFTP Connection operationId: getEndpointSftpConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/endpoint.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Inspects the connection to the server described by the given endpoint's SFTP credentials. If it is traversable, it exists and a 200 is returned. produces: - application/json tags: - Endpoints summary: Test Endpoint SFTP Connection operationId: testEndpointSftpConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true - description: Endpoint Body name: endpoint in: body required: true schema: $ref: '#/definitions/endpoint.WriteModel' responses: '200': description: OK schema: $ref: '#/definitions/endpoint.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/tests/snowflake: get: description: Inspects the connection to the server described by the endpoint's Snowflake credentials. If it is traversable, it exists and a 200 is returned. produces: - application/json tags: - Endpoints summary: Get Endpoint Snowflake Connection operationId: getEndpointSnowflakeConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true responses: '200': description: OK '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Inspects the connection to the server described by the credentials. If it is traversable, it exists and a 200 is returned. produces: - application/json tags: - Endpoints summary: Test Endpoint Snowflake Connection operationId: testEndpointSnowflakeConnection parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true - description: Snowflake Credentials Body name: snowflake in: body required: true schema: $ref: '#/definitions/snowflake.WriteModel' responses: '200': description: OK '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/{fieldType}/resources: post: description: Updates file resources for an Endpoint. consumes: - multipart/form-data produces: - application/json - text/plain tags: - Endpoints summary: Update Endpoint Resources operationId: updateEndpointResources parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true - enum: - File - ControlFile - API - Database - FlumeLakehouse type: string description: field type of the endpoint name: fieldType in: path required: true - type: file description: resource files for an endpoint (can be one or multiple files) name: files in: formData required: true - type: string description: Labels for each file. Labels must be in same order as files. Data file label must contain '_data' in the name, spec labels must contain '_spec', and narrative files must contain '_narrative' name: labels in: formData required: true responses: '200': description: OK schema: type: string '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/endpoints/{id}/{fieldType}/resources/{key}: delete: description: Delete Endpoint Resource by Key produces: - application/json tags: - Endpoints summary: Delete Endpoint Resource by Key operationId: deleteEndpointResource parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the endpoint name: id in: path required: true - enum: - File - ControlFile - API - Database - FlumeLakehouse type: string description: field type of the endpoint name: fieldType in: path required: true - type: string description: resource key to be deleted name: key in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/secret.ApiSecret' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/flags: get: description: Lists Flags. produces: - application/json tags: - Flags summary: List Flags operationId: listFlags parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header responses: '200': description: OK schema: $ref: '#/definitions/flag.ListReadModel' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Creates a Flag. produces: - application/json tags: - Flags summary: Create Flag operationId: createFlag parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: Flag Body name: flag in: body required: true schema: $ref: '#/definitions/flag.Flag' responses: '200': description: OK schema: $ref: '#/definitions/flag.Flag' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/flags/{key}: get: description: Gets a Flag by key. produces: - application/json tags: - Flags summary: Get Flag operationId: getFlag parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: key of the flag name: key in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/flag.Flag' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email put: description: Updates a Flag. produces: - application/json tags: - Flags summary: Update Flag operationId: updateFlag parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: key of the flag name: key in: path required: true - description: Flag Body name: flag in: body required: true schema: $ref: '#/definitions/flag.Flag' responses: '200': description: OK schema: $ref: '#/definitions/flag.Flag' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email delete: description: Deletes a Flag. produces: - application/json tags: - Flags summary: Delete Flag operationId: deleteFlag parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: key of the flag name: key in: path required: true responses: '200': description: OK '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/objects: get: description: Lists Objects. produces: - application/json tags: - Objects summary: List Objects operationId: listObjects parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: array items: type: integer collectionFormat: multi description: List of Object IDs to return name: ids in: query - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Objects to return name: pageSize in: query - type: string description: Field by which to sort results {name, createdDate}. Defaults to createdDate name: orderBy in: query - type: boolean default: true description: If true, sorts in descending order name: orderDesc in: query responses: '200': description: OK schema: $ref: '#/definitions/object.ListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Creates an Object. produces: - application/json tags: - Objects summary: Create Object operationId: createObject parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: Object Body name: object in: body required: true schema: $ref: '#/definitions/object.WriteModel' responses: '201': description: Created schema: $ref: '#/definitions/object.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/objects/{id}: get: description: Gets an Object. produces: - application/json tags: - Objects summary: Get Object operationId: getObject parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the object name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/object.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email delete: description: Deletes an Object. produces: - application/json tags: - Objects summary: Delete Object operationId: deleteObject parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the object name: id in: path required: true responses: '200': description: OK '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Updates an Object. produces: - application/json tags: - Objects summary: Update Object operationId: updateObject parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the object name: id in: path required: true - description: Object Body name: object in: body required: true schema: $ref: '#/definitions/object.UpdateModel' responses: '200': description: OK schema: $ref: '#/definitions/object.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/objects/{objId}/instances: get: description: Lists Instances. produces: - application/json tags: - Objects summary: List Instances operationId: listInstances parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the object name: objId in: path required: true - type: string description: Filter by connectionId name: connectionId in: query - type: string description: Filter by jobId name: jobId in: query - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Instances to return name: pageSize in: query - type: string description: Field by which to sort results {name, createdDate, canonicalValue}. Defaults to createdDate name: orderBy in: query - type: boolean default: true description: If true, sorts in descending order name: orderDesc in: query responses: '200': description: OK schema: $ref: '#/definitions/objectinstance.ListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Creates an Instance. produces: - application/json tags: - Objects summary: Create Instance operationId: createInstance parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the object name: objId in: path required: true - description: Instance Body name: objectinstance in: body required: true schema: $ref: '#/definitions/objectinstance.WriteModel' responses: '201': description: Created schema: $ref: '#/definitions/objectinstance.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/objects/{objId}/instances/{id}: get: description: Gets an Instance. produces: - application/json tags: - Objects summary: Get Instance operationId: getInstance parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the object name: objId in: path required: true - type: string description: id of the instance name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/objectinstance.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Updates an Instance. produces: - application/json tags: - Objects summary: Update Instance operationId: updateInstance parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the object name: objId in: path required: true - type: string description: id of the instance name: id in: path required: true - description: Instance Body name: instance in: body required: true schema: $ref: '#/definitions/objectinstance.UpdateModel' responses: '200': description: OK schema: $ref: '#/definitions/objectinstance.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/objects/{objId}/instances:bulk: post: description: Creates Bulk Instances produces: - application/json tags: - Objects summary: Create Bulk Instances operationId: createBulkInstances parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the object name: objId in: path required: true - description: Instance Bodies name: objectinstance in: body required: true schema: $ref: '#/definitions/objectinstance.BulkWriteModel' responses: '201': description: Created '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/reports/groupsTraded: get: description: Generates the Groups Traded Report produces: - application/json tags: - Reports summary: Groups Traded Report operationId: groupsTradedReport parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Filetype to return (csv or json) name: view in: query responses: '200': description: OK schema: type: array items: $ref: '#/definitions/report.GroupsTradedLine' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/sourceFiles: get: description: Lists Source Files associated with the Source Endpoint of a Job produces: - application/json tags: - SourceFile summary: List Job Source Files operationId: listSourceFiles parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: The endpointId to inspect source files for name: endpointId in: query - type: boolean description: Filter sourceFiles by isProcessed Status name: isProcessed in: query - type: boolean description: Filter sourceFiles by isStaged Status name: isStaged in: query - type: boolean description: Filter sourceFiles by fileDisappeared Status name: fileDisappeared in: query - type: string description: Filter sourceFiles by shardBatchKey name: shardBatchKey in: query - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of SourceFiles to return name: pageSize in: query - enum: - discoveredAt type: string description: Field by which to sort results name: orderBy in: query - type: boolean default: true description: If true, sorts in descending order name: orderDesc in: query responses: '200': description: OK schema: $ref: '#/definitions/sourcefile.ListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Create a SourceFile consumes: - application/json produces: - application/json tags: - SourceFile summary: Create SourceFile operationId: createSourceFile parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: SourceFile body name: sourcefile in: body required: true schema: $ref: '#/definitions/sourcefile.WriteModel' responses: '201': description: Created schema: $ref: '#/definitions/sourcefile.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/sourceFiles/{id}: get: description: Gets one source file by id produces: - application/json tags: - SourceFile summary: Get a source file operationId: getSourceFile parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: Source File ID name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/sourcefile.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Updates a SourceFile consumes: - application/json produces: - application/json tags: - SourceFile summary: Update SourceFile operationId: updateSourceFile parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the source file name: id in: path required: true - description: SourceFile body name: sourcefile in: body required: true schema: $ref: '#/definitions/sourcefile.PatchModel' responses: '200': description: OK schema: $ref: '#/definitions/sourcefile.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/sourceFiles:bulk: post: description: Create SourceFiles in bulk and returns those which were created consumes: - application/json produces: - application/json tags: - SourceFile summary: Create SourceFile (Bulk) operationId: createSourceFileBulk parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: bulk SourceFile body name: sourcefile in: body required: true schema: $ref: '#/definitions/sourcefile.BulkWriteModel' responses: '200': description: OK '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Update multiple SourceFiles in a single request consumes: - application/json produces: - application/json tags: - SourceFile summary: Bulk Update SourceFiles operationId: updateSourceFilesBulk parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: SourceFiles to update name: sourceFiles in: body required: true schema: $ref: '#/definitions/sourcefile.BulkPatchModel' responses: '200': description: OK schema: type: array items: $ref: '#/definitions/sourcefile.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/sourceFiles:search: get: description: Search for Source Files by filename produces: - application/json tags: - SourceFile summary: Search Source Files operationId: searchSourceFiles parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Search query for filename name: q in: query required: true - type: integer description: The endpointId to inspect source files for name: endpointId in: query - type: boolean description: Filter sourceFiles by isProcessed Status name: isProcessed in: query - type: boolean description: Filter sourceFiles by isStaged Status name: isStaged in: query - type: boolean description: Filter sourceFiles by fileDisappeared Status name: fileDisappeared in: query - type: string description: Filter sourceFiles by shardBatchKey name: shardBatchKey in: query - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of SourceFiles to return name: pageSize in: query - enum: - discoveredAt type: string description: Field by which to sort results name: orderBy in: query - type: boolean default: true description: If true, sorts in descending order name: orderDesc in: query responses: '200': description: OK schema: $ref: '#/definitions/sourcefile.ListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/telemetry: get: description: Get Telemetry. produces: - application/json tags: - Telemetry summary: Get Telemetry operationId: getTelemetry parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header responses: '200': description: OK schema: $ref: '#/definitions/telemetry.ReadModel' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/users: get: description: List users scoped to the account of the executing user produces: - application/json tags: - Users summary: List users operationId: listUsers parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: Page token for pagination name: pageToken in: query - type: string description: Page size for pagination name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/user.ListModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Creates a new user bound to the account to which the executing user is scoped produces: - application/json tags: - Users summary: Create a user operationId: createUser parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: User payload name: user in: body required: true schema: $ref: '#/definitions/user.WriteModel' responses: '201': description: Created schema: $ref: '#/definitions/user.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/users/me: get: description: Get Current User produces: - application/json tags: - Users summary: Get Current User operationId: getCurrentUser parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header responses: '200': description: OK schema: $ref: '#/definitions/user.SelfUser' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Patch current user produces: - application/json tags: - Users summary: Patch Current User operationId: patchCurrentUser parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: User payload name: user in: body required: true schema: $ref: '#/definitions/user.SelfUserPatchModel' responses: '200': description: OK schema: $ref: '#/definitions/user.SelfUser' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/users/{id}: get: description: Gets one user by id produces: - application/json tags: - Users summary: Get a user operationId: getUser parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: User ID name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/user.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email put: description: Updates a user by id, bound to the account to which the executing user is scoped produces: - application/json tags: - Users summary: Update a user operationId: updateUser parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: User ID name: id in: path required: true - description: User payload name: user in: body required: true schema: $ref: '#/definitions/user.WriteModel' responses: '200': description: OK schema: $ref: '#/definitions/user.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/users/{id}/query-engine-grant: post: description: Grants query engine access to a user for a specified duration. Only accessible by SystemAdmin or users with is_access_granter=true. consumes: - application/json produces: - application/json tags: - Users summary: Grant query engine access operationId: grantQueryEngineAccess parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: User ID name: id in: path required: true - description: Grant payload name: grant in: body required: true schema: $ref: '#/definitions/user.QueryEngineGrantRequest' responses: '200': description: OK schema: $ref: '#/definitions/user.QueryEngineGrantResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/users/{id}/query-engine-revoke: delete: description: Revokes query engine access from a user. Only accessible by SystemAdmin or users with is_access_granter=true. produces: - application/json tags: - Users summary: Revoke query engine access operationId: revokeQueryEngineAccess parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: integer description: User ID name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/user.QueryEngineGrantResponse' '403': description: Forbidden schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/workersizes: get: description: Lists Worker Sizes. produces: - application/json tags: - WorkerSizes summary: List Worker Sizes operationId: listWorkerSizes parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Endpoints to return name: pageSize in: query responses: '200': description: OK schema: $ref: '#/definitions/workersize.ListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v1/workersizes/{id}: get: description: Gets a Worker Size by ID. produces: - application/json tags: - WorkerSizes summary: Get Worker Size operationId: getWorkerSize parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the workersize name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/workersize.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Updates a Worker Size produces: - application/json tags: - WorkerSizes summary: Update Worker Size operationId: updateWorkerSize parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the workersize name: id in: path required: true - description: Worker Size Body name: workersize in: body required: true schema: $ref: '#/definitions/workersize.UpdateModel' responses: '200': description: OK schema: $ref: '#/definitions/workersize.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v2/trades/jobs: get: description: Lists Jobs v2. produces: - application/json tags: - Jobs v2 summary: List Jobs v2 operationId: listJobs parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Jobs to return name: pageSize in: query - type: string description: Field by which to sort results. Defaults to createdDate name: orderBy in: query - type: boolean description: If true, sorts in descending order name: orderDesc in: query - type: array items: type: string collectionFormat: multi description: List of statuses to filter for. If empty, no filtration occurs. name: status in: query - type: array items: type: integer collectionFormat: multi description: List of endpoint IDs (source or destination) to filter for. If empty, no filtration occurs. name: endpointId in: query - type: integer description: Connection ID to filter against source or destination endpoint. If empty, no filtration occurs. name: connectionId in: query - type: string description: View to return. If `lastRun` is provided, the last job run with and end timestamp is embedded name: view in: query responses: '200': description: OK schema: $ref: '#/definitions/job.ListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Creates a Job v2. produces: - application/json tags: - Jobs v2 summary: Create Job v2 operationId: createJob parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - description: Job Body name: job in: body required: true schema: $ref: '#/definitions/job.WriteModel' responses: '201': description: Created schema: $ref: '#/definitions/job.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v2/trades/jobs/{id}: get: description: Gets a Job v2. produces: - application/json tags: - Jobs v2 summary: Get Job v2 operationId: getJob parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the job name: id in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/job.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Updates a Job v2. produces: - application/json tags: - Jobs v2 summary: Update Job v2 operationId: updateJob parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the job name: id in: path required: true - description: Job Body name: job in: body required: true schema: $ref: '#/definitions/job.UpdateModel' responses: '200': description: OK schema: $ref: '#/definitions/job.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v2/trades/jobs/{id}/tests/map: post: description: Runs a test of the Job's source+destination endpoint mappings against provided data consumes: - application/json produces: - application/zip tags: - Jobs v2 summary: Test Job map operationId: testJobMap parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: id of the job name: id in: path required: true - description: Test Files Payload name: payload in: body required: true schema: $ref: '#/definitions/job.TestRequest' responses: '200': description: OK schema: type: string '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '404': description: Not Found schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v2/trades/jobs/{jobId}/automapjobs: get: description: List AutomapJobs produces: - application/json tags: - AutomapJobs summary: List AutomapJobs operationId: listAutomapJobs parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: The page to request. Should be a previously-received nextPageToken name: pageToken in: query - type: string description: Number of Automapjobs to return name: pageSize in: query - type: string description: ID of job name: jobId in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/automapjob.ListResponse' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email post: description: Create AutomapJob produces: - application/json tags: - AutomapJobs summary: Create AutomapJob operationId: createAutomapJob parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: ID of job name: jobId in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/automapjob.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v2/trades/jobs/{jobId}/automapjobs/{automapversion}: get: description: Get AutomapJobs by ID produces: - application/json tags: - AutomapJobs summary: Get AutomapJobs by ID operationId: getAutomapJobsById parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: ID of job name: jobId in: path required: true - type: string description: version number of automap job name: automapversion in: path required: true responses: '200': description: OK schema: $ref: '#/definitions/automapjob.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email patch: description: Update AutomapJob produces: - application/json tags: - AutomapJobs summary: Update AutomapJob operationId: updateAutomapJob parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: ID of job name: jobId in: path required: true - type: string description: version number of automap job name: automapversion in: path required: true - description: Automap Job Body name: automapjob in: body required: true schema: $ref: '#/definitions/automapjob.UpdateModel' responses: '200': description: OK schema: $ref: '#/definitions/automapjob.ReadModel' '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email /api/v2/trades/jobs/{jobId}/automapjobs/{automapversion}/outputs: get: description: Get AutomapJobs Output produces: - application/json tags: - AutomapJobs summary: Get AutomapJob Output operationId: getAutomapJobOutputs parameters: - type: string description: X-Flume-Account-ID name: X-Flume-Account-ID in: header - type: string description: ID of job name: jobId in: path required: true - type: string description: version number of automap job name: automapversion in: path required: true responses: '200': description: OK schema: type: string '204': description: No Content schema: type: string '400': description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' '500': description: Internal Server Error schema: $ref: '#/definitions/responses.ErrorResponse' default: description: '' schema: $ref: '#/definitions/responses.ErrorResponse' security: - OAuth2Implicit: - openid - profile - email definitions: account.AccountConfigColors: type: object properties: primary: type: string secondary: type: string tertiary: type: string account.BlobConfig: type: object properties: bucketName: type: string bucketPath: type: string credentialType: $ref: '#/definitions/cloudstoragecredentials.CredentialType' credentials: description: "* `AwsStatic`\n * `AccessKeyID` - AWS access key ID\n * `SecretAccessKey` - AWS secret access key\n\ \ * `Region` - AWS region\n * `Endpoint` - AWS endpoint (optional)\n * `GcpServiceAccount`\n * `ServiceAccountJSON`\ \ - JSON string of the service account credentials\n * `AzureSharedKey`\n * `StorageAccount` - Azure storage account\ \ name\n * `SharedKey` - Azure storage account shared key\n * `AzureSharedAccessSignature`\n * `StorageAccount`\ \ - Azure storage account name\n * `SasToken` - Azure storage account shared access signature token\n * `AzureConnectionString`\n\ \ * `ConnectionString` - Azure storage account connection string" allOf: - $ref: '#/definitions/cloudstoragecredentials.CloudStorageCredentials' credentialsName: type: string account.ListResponse: type: object properties: accounts: type: array items: $ref: '#/definitions/account.ReadModel' nextPageToken: type: string account.ReadAccountConfigModel: type: object properties: accountId: type: integer colors: $ref: '#/definitions/account.AccountConfigColors' displayName: type: string favicon: type: string logo: type: string account.ReadModel: type: object properties: blobConfig: $ref: '#/definitions/account.BlobConfig' createTime: type: string id: description: System-set properties type: integer isDisabled: type: boolean name: type: string restrictMapAccess: type: boolean account.UpdateAccountConfigModel: type: object properties: colors: $ref: '#/definitions/account.AccountConfigColors' favicon: type: string logo: type: string account.UpdateModel: type: object properties: blobConfig: $ref: '#/definitions/account.BlobConfig' isDisabled: type: boolean name: type: string minLength: 1 restrictMapAccess: type: boolean account.WriteModel: type: object required: - name properties: blobConfig: $ref: '#/definitions/account.BlobConfig' isDisabled: type: boolean name: type: string minLength: 1 restrictMapAccess: type: boolean accountcontract.ListResponse: type: object properties: accountContracts: type: array items: $ref: '#/definitions/accountcontract.ReadModel' nextPageToken: type: string accountcontract.ReadModel: type: object properties: accountId: type: integer adminNotes: type: string contractSince: type: string contractUntil: type: string id: type: integer revenue: type: number totalAllocatedRows: type: integer accountcontract.UpdateModel: type: object properties: adminNotes: type: string x-nullable: true contractSince: type: string x-nullable: true contractUntil: type: string x-nullable: true revenue: type: number x-nullable: true totalAllocatedRows: type: integer x-nullable: true accountcontract.WriteModel: type: object required: - contractSince - contractUntil - totalAllocatedRows properties: adminNotes: type: string contractSince: type: string contractUntil: type: string revenue: type: number totalAllocatedRows: type: integer api.ReadModel: type: object properties: map: type: string secretName: type: string secretType: $ref: '#/definitions/secret.SecretType' api.UpdateModel: type: object properties: map: type: string x-nullable: true secret: type: string x-nullable: true secretType: allOf: - $ref: '#/definitions/secret.SecretType' x-nullable: true api.WriteModel: type: object properties: map: type: string secret: type: string secretType: $ref: '#/definitions/secret.SecretType' automapjob.ConfidenceLevel: type: string enum: - Low - Medium - High x-enum-varnames: - ConfidenceLevelLow - ConfidenceLevelMedium - ConfidenceLevelHigh automapjob.FieldMapping: type: object required: - confidenceLevel - destination - source properties: confidenceLevel: $ref: '#/definitions/automapjob.ConfidenceLevel' destination: type: string explanation: type: string feedback: type: string fieldStatus: $ref: '#/definitions/automapjob.FieldStatus' source: type: string automapjob.FieldMappingUpdate: type: object properties: confidenceLevel: allOf: - $ref: '#/definitions/automapjob.ConfidenceLevel' x-nullable: true destination: type: string x-nullable: true explanation: type: string x-nullable: true feedback: type: string x-nullable: true fieldStatus: allOf: - $ref: '#/definitions/automapjob.FieldStatus' x-nullable: true source: type: string x-nullable: true automapjob.FieldStatus: type: string enum: - Accepted - Rejected x-enum-varnames: - FieldStatusAccepted - FieldStatusRejected automapjob.ListResponse: type: object properties: automapJobs: type: array items: $ref: '#/definitions/automapjob.ReadModel' nextPageToken: type: string automapjob.Maps: type: object properties: destination: type: string source: type: string automapjob.MapsUpdate: type: object properties: destination: type: string x-nullable: true source: type: string x-nullable: true automapjob.Outputs: type: object properties: destination: type: string source: type: string automapjob.OutputsUpdate: type: object properties: destination: type: string x-nullable: true source: type: string x-nullable: true automapjob.ReadModel: type: object properties: accountId: type: integer createdBy: $ref: '#/definitions/user.ReadModel' endTime: type: string error: type: string explanation: type: string feedback: type: string fieldMappings: type: array items: $ref: '#/definitions/automapjob.FieldMapping' jobId: type: integer maps: $ref: '#/definitions/automapjob.Maps' outputs: $ref: '#/definitions/automapjob.Outputs' startTime: type: string status: $ref: '#/definitions/automapjob.Status' version: type: integer automapjob.Status: type: string enum: - Queued - Processing - Failed - Cancelled - Success x-enum-varnames: - StatusQueued - StatusProcessing - StatusFailed - StatusCancelled - StatusSuccess automapjob.UpdateModel: type: object properties: endTime: type: string x-nullable: true error: type: string x-nullable: true explanation: type: string x-nullable: true feedback: type: string x-nullable: true fieldMappings: type: array items: $ref: '#/definitions/automapjob.FieldMappingUpdate' x-nullable: true maps: allOf: - $ref: '#/definitions/automapjob.MapsUpdate' x-nullable: true outputs: allOf: - $ref: '#/definitions/automapjob.OutputsUpdate' x-nullable: true startTime: type: string x-nullable: true status: allOf: - $ref: '#/definitions/automapjob.Status' x-nullable: true cloudstorage.ReadModel: type: object properties: bucketName: type: string bucketPath: type: string credentialType: $ref: '#/definitions/cloudstoragecredentials.CredentialType' deleteAfterPickup: type: boolean encryption: $ref: '#/definitions/encryption.ReadModel' secretName: type: string sortDescending: type: boolean sortingMethod: $ref: '#/definitions/sorting.Method' cloudstorage.UpdateModel: type: object properties: bucketName: type: string x-nullable: true bucketPath: type: string x-nullable: true credentialType: allOf: - $ref: '#/definitions/cloudstoragecredentials.CredentialType' x-nullable: true credentials: allOf: - $ref: '#/definitions/cloudstoragecredentials.CloudStorageCredentials' x-nullable: true deleteAfterPickup: type: boolean x-nullable: true encryption: allOf: - $ref: '#/definitions/encryption.UpdateModel' x-nullable: true sortDescending: type: boolean x-nullable: true sortingMethod: allOf: - $ref: '#/definitions/sorting.Method' x-nullable: true cloudstorage.WriteModel: type: object properties: bucketName: type: string bucketPath: type: string credentialType: $ref: '#/definitions/cloudstoragecredentials.CredentialType' credentials: $ref: '#/definitions/cloudstoragecredentials.CloudStorageCredentials' deleteAfterPickup: type: boolean encryption: $ref: '#/definitions/encryption.WriteModel' sortDescending: type: boolean sortingMethod: $ref: '#/definitions/sorting.Method' cloudstoragecredentials.CloudStorageCredentials: type: object additionalProperties: type: string cloudstoragecredentials.CredentialType: type: string enum: - AwsStatic - AwsWebIdentity - GcpServiceAccount - AzureSharedKey - AzureSharedAccessSignature - AzureConnectionString x-enum-varnames: - CredentialTypeAwsStatic - CredentialTypeAwsWebIdentity - CredentialTypeGcpServiceAccount - CredentialTypeAzureSharedKey - CredentialTypeAzureSharedAccessSignature - CredentialTypeAzureConnectionString connection.ListResponse: type: object properties: connections: type: array items: $ref: '#/definitions/connection.ReadModel' nextPageToken: type: string connection.PatchModel: type: object properties: customColumns: type: array items: type: string logo: type: string name: type: string connection.ReadModel: type: object required: - name properties: created: type: string customColumns: type: array items: type: string id: type: integer logo: type: string name: type: string connection.WriteModel: type: object required: - name properties: customColumns: type: array items: type: string logo: type: string name: type: string database.DatabaseMap: type: object properties: map: type: string name: type: string ordinal: type: integer database.Engine: type: string enum: - PostgreSQL - MicrosoftSQLServer2019 - MicrosoftSQLServer2022 - Oracle x-enum-varnames: - EnginePostgreSQL - EngineMicrosoftSQLServer2019 - EngineMicrosoftSQLServer2022 - EngineOracle database.ReadModel: type: object properties: database: type: string engine: $ref: '#/definitions/database.Engine' host: type: string maps: type: array items: $ref: '#/definitions/database.DatabaseMap' orderBy: type: string pageSize: type: integer port: type: integer protocol: type: string secretName: type: string secretType: $ref: '#/definitions/secret.SecretType' username: type: string database.UpdateModel: type: object properties: database: type: string x-nullable: true engine: allOf: - $ref: '#/definitions/database.Engine' x-nullable: true host: type: string x-nullable: true maps: type: array items: $ref: '#/definitions/database.DatabaseMap' x-nullable: true orderBy: type: string x-nullable: true pageSize: type: integer x-nullable: true port: type: integer x-nullable: true protocol: type: string x-nullable: true secret: type: string x-nullable: true secretType: allOf: - $ref: '#/definitions/secret.SecretType' x-nullable: true username: type: string x-nullable: true database.WriteModel: type: object properties: database: type: string engine: $ref: '#/definitions/database.Engine' host: type: string maps: type: array items: $ref: '#/definitions/database.DatabaseMap' orderBy: type: string pageSize: type: integer port: type: integer protocol: type: string secret: type: string secretType: $ref: '#/definitions/secret.SecretType' username: type: string datatypes.DataType: type: object properties: fields: type: array items: $ref: '#/definitions/datatypes.Field' name: type: string type: $ref: '#/definitions/endpoint.DataType' datatypes.DataTypes: type: object properties: dataTypes: type: array items: $ref: '#/definitions/datatypes.DataType' datatypes.Field: type: object properties: column: type: string deprecated: type: boolean fieldType: $ref: '#/definitions/datatypes.FieldType' name: type: string datatypes.FieldType: type: object properties: name: type: string options: type: array items: type: string type: type: string discovery.ApproverCreateRequest: type: object required: - email properties: accountId: description: 'Optional: scope to specific account. If nil, approver has no account restriction.' type: integer canGrantApprovers: description: 'Default: false' type: boolean email: type: string reason: type: string discovery.ApproverListResponse: type: object properties: approvers: type: array items: $ref: '#/definitions/discovery.ApproverReadModel' nextPageToken: type: string discovery.ApproverReadModel: type: object properties: accountId: type: integer accountName: type: string active: type: boolean canGrantApprovers: type: boolean createdAt: type: string email: type: string grantReason: type: string grantedBy: type: string id: type: integer revokeReason: type: string revokedAt: type: string revokedBy: type: string updatedAt: type: string discovery.ApproverRevokeRequest: type: object properties: reason: type: string discovery.ConnectionListResponse: type: object properties: connections: type: array items: $ref: '#/definitions/discovery.ConnectionReadModel' nextPageToken: type: string discovery.ConnectionPatchModel: type: object properties: allowAnalysisMode: description: Reduced exfiltration penalties type: boolean connectionConfig: type: object additionalProperties: {} defaultRowLimit: type: integer description: type: string enabled: type: boolean maxResultBytes: description: Per-connection byte limit type: integer name: type: string secretValue: description: Updates Secret Manager type: string timeoutSeconds: type: integer discovery.ConnectionReadModel: type: object properties: allowAnalysisMode: description: Reduced exfiltration penalties for dev/staging type: boolean connectionConfig: type: object additionalProperties: {} connectionType: $ref: '#/definitions/discovery.ConnectionType' createdAt: type: string defaultRowLimit: type: integer deletedAt: description: Set when soft-deleted; secret has been destroyed and connection is rejected by all execution paths type: string description: type: string enabled: type: boolean id: type: integer maxResultBytes: description: Per-connection byte limit (nil = use default) type: integer name: type: string supportsSQL: type: boolean timeoutSeconds: type: integer updatedAt: type: string discovery.ConnectionTestResult: type: object properties: errorMessage: type: string latencyMs: type: integer success: type: boolean discovery.ConnectionType: type: string enum: - database - lakehouse x-enum-varnames: - ConnectionTypeDatabase - ConnectionTypeLakehouse discovery.ConnectionWriteModel: type: object required: - connectionConfig - connectionType - name properties: allowAnalysisMode: description: Reduced exfiltration penalties type: boolean connectionConfig: type: object additionalProperties: {} connectionType: $ref: '#/definitions/discovery.ConnectionType' defaultRowLimit: type: integer description: type: string maxResultBytes: description: Per-connection byte limit type: integer name: type: string secretValue: description: Written to Secret Manager, not stored type: string timeoutSeconds: type: integer discovery.ExtractionCreateRequest: type: object required: - connectionId - params - sessionId properties: connectionId: description: Must be in session's grants type: integer extractionType: description: 'Default: sql_query' allOf: - $ref: '#/definitions/discovery.ExtractionType' maxRows: description: Override connection default type: integer params: type: object additionalProperties: {} sessionId: type: string discovery.ExtractionListResponse: type: object properties: extractions: type: array items: $ref: '#/definitions/discovery.ExtractionReadModel' nextPageToken: type: string discovery.ExtractionReadModel: type: object properties: bytesReturned: type: integer connectionId: type: integer createdAt: type: string errorMessage: type: string executionMs: type: integer exfiltrationScore: type: number extractionType: $ref: '#/definitions/discovery.ExtractionType' id: type: string params: type: object additionalProperties: {} requesterEmail: type: string resultLocation: type: string rowCount: type: integer sessionId: type: string sql: type: string status: $ref: '#/definitions/discovery.ExtractionStatus' discovery.ExtractionResultModel: type: object properties: bytesReturned: type: integer columns: type: array items: type: string connectionId: type: integer createdAt: type: string errorMessage: type: string executionMs: type: integer exfiltrationScore: type: number extractionType: $ref: '#/definitions/discovery.ExtractionType' id: type: string params: type: object additionalProperties: {} requesterEmail: type: string resultLocation: type: string rowCount: type: integer rows: type: array items: type: array items: {} sessionId: type: string sql: type: string status: $ref: '#/definitions/discovery.ExtractionStatus' discovery.ExtractionStatus: type: string enum: - pending - running - success - failed - blocked - timeout x-enum-varnames: - ExtractionStatusPending - ExtractionStatusRunning - ExtractionStatusSuccess - ExtractionStatusFailed - ExtractionStatusBlocked - ExtractionStatusTimeout discovery.ExtractionType: type: string enum: - sql_query x-enum-varnames: - ExtractionTypeSQLQuery discovery.GrantType: type: string enum: - data_access - approver_access - subscription_access x-enum-varnames: - GrantTypeDataAccess - GrantTypeApproverAccess - GrantTypeSubscriptionAccess discovery.SessionApproveRequest: type: object properties: comment: type: string discovery.SessionCancelRequest: type: object properties: reason: type: string discovery.SessionCreateRequest: description: Request to create a PAM session for database access or approver delegation. type: object required: - expireTime - reason properties: canGrantApproverAccess: description: 'For approver_access grants: if true, recipient can grant approver access to others. Only root approvers can set this to true.' type: boolean example: false connectionIds: description: 'IDs of connections to grant access to. For data_access grants, either this (one or more) or grantAllConnections=true is required.' type: array items: type: integer example: - 1 - 2 - 3 expireTime: description: When this session should expire (RFC3339 format). Must be in the future. type: string example: '2024-12-31T23:59:59Z' grantAllConnections: description: 'Wildcard scope (data_access only): when true, the session covers every enabled connection in the requester''s account at query time. Useful for trusted users (CTO, account admins) where enumeration is brittle as the data estate evolves — connections added after approval are automatically covered. Pass either this OR connectionIds, not both; the wildcard supersedes any explicit list.' type: boolean example: false grantType: description: 'Type of access: "data_access" (query databases), "approver_access" (approve other sessions), or "subscription_access" (self-attested, time-boxed grant to run AI CLI tools off the LLM gateway — no connection scope, no recipient, born approved, capped at 24h). Default: data_access' enum: - data_access - approver_access - subscription_access allOf: - $ref: '#/definitions/discovery.GrantType' example: data_access reason: description: Business justification for requesting access type: string example: Need to investigate claim processing issue recipientEmail: description: 'For approver_access grants: email of user to grant approver rights to' type: string example: newapprover@example.com discovery.SessionDenyRequest: type: object required: - reason properties: reason: type: string discovery.SessionExtendRequest: type: object required: - expireTime - reason properties: expireTime: description: New expiration time (must be after current expires_at) type: string reason: description: Reason for requesting extension type: string discovery.SessionGrantReadModel: type: object properties: connectionId: type: integer connectionName: type: string discovery.SessionGrantRequest: description: Approver creates a pre-approved PAM session for another user. type: object required: - expireTime - reason - requesterEmail properties: connectionIds: description: 'IDs of connections to grant access to. Either this (one or more) or grantAllConnections=true is required; empty + false is rejected. `validate:"required,min=1"` is intentionally NOT used here because the wildcard alternative makes connectionIds non-required at the validation layer; the manager enforces the "one or the other" rule with a clearer error message.' type: array items: type: integer example: - 1 - 2 - 3 expireTime: description: 'When this session should expire (RFC3339 format). Must be in the future — past timestamps are rejected with a validation error.' type: string example: '2099-12-31T23:59:59Z' grantAllConnections: description: 'Wildcard scope: when true, the granted session covers every enabled connection in the recipient''s account at query time. For trusted users where explicit enumeration is brittle as the estate evolves. Pass either this OR connectionIds, not both.' type: boolean example: false reason: description: 'Business justification for the grant. Audit trail for the approver''s decision to provision access without an explicit request from the recipient.' type: string example: Pre-provisioning demo access for a sandbox account requesterEmail: description: 'Email of the user the session is being created for. NOT validated against the user table at grant time — the recipient may be invited later. If the email is never provisioned, the session simply won''t be usable when they try (userscope middleware returns 404 on unknown emails). The approver assumes the trust responsibility for the email being correct.' type: string example: newuser@example.com discovery.SessionLaunchRequest: description: Record of a single AI CLI tool launch under a subscription_access session. type: object properties: cliVersion: description: Version string of the CLI binary. Required; capped at 64 characters. type: string example: 0.1.42 cwd: description: Working directory the tool was launched from. Optional; capped at 1024 characters. type: string example: /Users/dev/project tool: description: AI CLI tool being launched. Must be exactly "claude" or "codex". type: string enum: - claude - codex example: claude discovery.SessionLaunchResponse: description: A recorded AI CLI tool launch under a subscription_access session. type: object properties: cliVersion: description: Version of the CLI binary. type: string example: 0.1.42 cwd: description: Working directory the tool was launched from. type: string example: /Users/dev/project id: description: Server-generated unique identifier for this launch record (UUID). type: string example: 550e8400-e29b-41d4-a716-446655440000 sessionId: description: The subscription_access session this launch was recorded under. type: string example: 550e8400-e29b-41d4-a716-446655440000 startTime: description: When the launch was recorded (RFC3339). type: string example: '2024-12-31T23:59:59Z' tool: description: AI CLI tool that was launched. type: string enum: - claude - codex example: claude discovery.SessionListResponse: type: object properties: nextPageToken: type: string sessions: type: array items: $ref: '#/definitions/discovery.SessionReadModel' discovery.SessionReadModel: description: PAM session granting time-limited access to database connections. type: object properties: approvalComment: description: Optional comment from the approver type: string approvedAt: description: When this session was approved type: string approverEmail: description: Email of the approver who approved/denied this request type: string example: admin@example.com canGrantApproverAccess: description: 'If true and grantType is "approver_access", this approver can grant approver access to others. Only the root approver can set this to true.' type: boolean example: false createdAt: description: When this session request was created type: string denialReason: description: Reason given if the session was denied type: string expireTime: description: 'User-requested expiration time (RFC3339 format). Set by requester in SessionCreateRequest. On approval, this value is typically copied to ExpiresAt (which is the enforced expiration).' type: string example: '2024-12-31T23:59:59Z' expiresAt: description: 'Actual enforced expiration time. Set on approval (typically = ExpireTime, but approver may adjust). This is the authoritative expiration used for session validity checks.' type: string grantAllConnections: description: 'Wildcard scope: when true, this data_access session covers every enabled connection in its account at query time (resolved live, so connections added after approval are automatically covered). Applicable only when grantType=data_access.' type: boolean example: false grantType: description: 'Type of access granted: "data_access" (execute queries), "approver_access" (approve sessions), or "subscription_access" (self-attested, off-gateway AI CLI grant with no connection scope).' enum: - data_access - approver_access - subscription_access allOf: - $ref: '#/definitions/discovery.GrantType' example: data_access grants: description: 'Connections this session grants access to. Omitted from the JSON payload when GrantAllConnections is true (the slice is nil and `omitempty` drops it) — clients should treat a missing `grants` field as "no explicit grants" and rely on `grantAllConnections` to know whether the wildcard scope applies.' type: array items: $ref: '#/definitions/discovery.SessionGrantReadModel' id: description: Unique identifier for this session (UUID format) type: string example: 550e8400-e29b-41d4-a716-446655440000 reason: description: Business justification for requesting access type: string example: Need to investigate claim processing issue recipientEmail: description: 'For approver_access grants: the email of the user receiving approver rights. Distinguishes requester (granter) from recipient (grantee) in the delegation chain.' type: string example: newapprover@example.com requesterEmail: description: Email of the user who requested this session type: string example: user@example.com revokedAt: description: When this session was manually revoked (if applicable) type: string revokedBy: description: Email of user who revoked the session type: string status: description: 'Current status: pending, approved, denied, expired, revoked, cancelled, or extension_pending' enum: - pending - approved - denied - expired - revoked - cancelled - extension_pending allOf: - $ref: '#/definitions/discovery.SessionStatus' example: approved updatedAt: description: When this session was last updated type: string discovery.SessionRevokeRequest: type: object properties: reason: type: string discovery.SessionStatus: type: string enum: - pending - approved - denied - expired - revoked - cancelled - extension_pending x-enum-varnames: - SessionStatusPending - SessionStatusApproved - SessionStatusDenied - SessionStatusExpired - SessionStatusRevoked - SessionStatusCancelled - SessionStatusExtensionPending duckdb.Config: type: object properties: files: type: array items: $ref: '#/definitions/duckdb.File' duckdb.File: type: object required: - tableName properties: fileNamingConvention: type: string tableName: type: string encryption.Method: type: string enum: - None - PGP x-enum-varnames: - MethodNone - MethodPGP encryption.ReadModel: type: object properties: method: $ref: '#/definitions/encryption.Method' passphraseSecretName: description: Used for Source Endpoint Decryption type: string privateKeySecretName: description: Used for Source Endpoint Decryption type: string publicKey: description: Used for Destination Endpoint Decryption type: string encryption.UpdateModel: type: object properties: method: allOf: - $ref: '#/definitions/encryption.Method' x-nullable: true passphrase: type: string x-nullable: true privateKey: type: string x-nullable: true publicKey: type: string x-nullable: true encryption.WriteModel: type: object properties: method: $ref: '#/definitions/encryption.Method' passphrase: description: Used for Source Endpoint Decryption type: string privateKey: description: Used for Source Endpoint Decryption type: string publicKey: description: Used for Destination Endpoint Decryption type: string endpoint.ConnectionName: type: object properties: id: type: integer name: type: string endpoint.DataType: type: string enum: - Accumulators - Authorizations - Bytes - Eligibility - Groups - MedicalClaimServiceLines - Providers - RxClaimServiceLines - MedicalAndRxClaimLines - Test - TransactionMetadata - Generic - RecordLevelMetadata - PlanNetworks - ProviderNetworkDirectory - HmClaimsExtended - HmProvidersExtended - Strings x-enum-varnames: - DataTypeAccumulators - DataTypeAuthorizations - DataTypeBytes - DataTypeEligibility - DataTypeGroups - DataTypeMedicalClaimServiceLines - DataTypeProviders - DataTypeRxClaimServiceLines - DataTypeMedicalAndRxClaimLines - DataTypeTest - DataTypeTransactionMetadata - DataTypeGeneric - DataTypeRecordLevelMetadata - DataTypePlanNetworks - DataTypeProviderNetworkDirectory - DataTypeHmClaimsExtended - DataTypeHmProvidersExtended - DataTypeStrings endpoint.EndpointType: type: string enum: - Destination - Source x-enum-varnames: - EndpointTypeDestination - EndpointTypeSource endpoint.Field: type: object properties: length: type: integer name: type: string start: type: integer endpoint.File: type: object properties: duckDb: $ref: '#/definitions/duckdb.Config' fields: type: array items: $ref: '#/definitions/endpoint.Field' filterPattern: type: string filterType: $ref: '#/definitions/endpoint.FileFilterType' headerRow: type: integer headerless: type: boolean map: type: string example: SELECT * FROM data; mapType: $ref: '#/definitions/endpoint.MapType' nameTemplate: type: string recordStartRow: type: integer resources: type: object additionalProperties: type: string skipLinesBottom: type: boolean skipLinesTop: type: boolean trailerRowCount: type: integer type: $ref: '#/definitions/endpoint.FileType' endpoint.FileFilterType: type: string enum: - StartsWith - EndsWith - Contains - Regex x-enum-varnames: - FileFilterTypeStartsWith - FileFilterTypeEndsWith - FileFilterTypeContains - FileFilterTypeRegex endpoint.FileType: type: string enum: - CSV - PSV - TSV - FixedWidth x-enum-varnames: - FileTypeCsv - FileTypePsv - FileTypeTsv - FileTypeFixedWidth endpoint.FileUpdate: type: object properties: duckDb: allOf: - $ref: '#/definitions/duckdb.Config' x-nullable: true fields: type: array items: $ref: '#/definitions/endpoint.Field' x-nullable: true filterPattern: type: string x-nullable: true filterType: allOf: - $ref: '#/definitions/endpoint.FileFilterType' x-nullable: true headerRow: type: integer x-nullable: true headerless: type: boolean x-nullable: true map: type: string x-nullable: true mapType: allOf: - $ref: '#/definitions/endpoint.MapType' x-nullable: true nameTemplate: type: string x-nullable: true recordStartRow: type: integer x-nullable: true skipLinesBottom: type: boolean x-nullable: true skipLinesTop: type: boolean x-nullable: true trailerRowCount: type: integer x-nullable: true type: allOf: - $ref: '#/definitions/endpoint.FileType' x-nullable: true endpoint.LambdaList: type: object properties: lambdas: type: array items: $ref: '#/definitions/endpoint.LambdaResponse' nextPageToken: type: string endpoint.LambdaResponse: type: object properties: id: type: string name: type: string endpoint.ListResponse: type: object properties: endpoints: type: array items: $ref: '#/definitions/endpoint.ReadModel' nextPageToken: type: string endpoint.LookbackModifiedByUser: type: object properties: accountId: type: integer email: type: string id: type: integer endpoint.LoopbackUnit: type: string enum: - minutes - hours x-enum-varnames: - LoopbackUnitMinutes - LoopbackUnitHours endpoint.MapType: type: string enum: - SQL - Python - DuckDB x-enum-varnames: - MapTypeSql - MapTypePython - MapTypeDuckDB endpoint.Operation: type: string enum: - Map - Transfer x-enum-varnames: - OperationMap - OperationTransfer endpoint.Protocol: type: string enum: - SFTP - Snowflake - API - FlumeTransactions - FlumeRecordMetadata - Database - CloudStorage - FlumeLakehouse x-enum-varnames: - ProtocolSftp - ProtocolSnowflake - ProtocolApi - ProtocolFlumeTransactions - ProtocolFlumeRecordMetadata - ProtocolDatabase - ProtocolCloudStorage - ProtocolFlumeLakehouse endpoint.QueryEndpointRequest: type: object properties: sql: type: string endpoint.ReadModel: type: object required: - dataType - name - operation - type properties: accountId: type: integer aiEnabled: type: boolean api: $ref: '#/definitions/api.ReadModel' archived: type: boolean cloudStorage: $ref: '#/definitions/cloudstorage.ReadModel' connection: $ref: '#/definitions/endpoint.ConnectionName' controlFile: $ref: '#/definitions/endpoint.File' created: type: string dataType: $ref: '#/definitions/endpoint.DataType' database: $ref: '#/definitions/database.ReadModel' description: type: string file: $ref: '#/definitions/endpoint.File' fileSchedule: type: string flumeLakehouse: $ref: '#/definitions/flumelakehouse.ReadModel' hasControlFile: type: boolean id: type: integer incrementalRecords: type: boolean lastTransaction: $ref: '#/definitions/endpoint.TransactionSummary' lookbackModifiedBy: $ref: '#/definitions/endpoint.LookbackModifiedByUser' lookbackUnit: $ref: '#/definitions/endpoint.LoopbackUnit' lookbackValue: type: integer missingExpectedSourceFile: type: boolean name: type: string nextTransaction: type: string operation: $ref: '#/definitions/endpoint.Operation' protocol: $ref: '#/definitions/endpoint.Protocol' recentTransactions: $ref: '#/definitions/endpoint.RecentTransactions' recordDestinationId: description: if Protocol is FlumeRecordMetadata, the destination ID whose metadata to use type: integer schedule: type: string sftp: $ref: '#/definitions/sftp.ReadModel' shardKeyRegex: type: string sharded: type: boolean snowflake: $ref: '#/definitions/snowflake.ReadModel' state: $ref: '#/definitions/endpoint.State' supplementalDataTypes: type: array items: $ref: '#/definitions/endpoint.DataType' type: $ref: '#/definitions/endpoint.EndpointType' updated: type: string workerMemoryGb: type: integer minimum: 1 workerSize: $ref: '#/definitions/endpoint.WorkerSize' endpoint.RecentTransactions: type: object properties: last: $ref: '#/definitions/endpoint.TransactionSummary' lastFinished: $ref: '#/definitions/endpoint.TransactionSummary' lastFinishedOp: $ref: '#/definitions/endpoint.TransactionSummary' lastSuccessful: $ref: '#/definitions/endpoint.TransactionSummary' lastSuccessfulNonExtract: $ref: '#/definitions/endpoint.TransactionSummary' lastVisible: $ref: '#/definitions/endpoint.TransactionSummary' endpoint.State: type: string enum: - Idle - Running - Error - Stopped x-enum-varnames: - StateIdle - StateRunning - StateError - StateStopped endpoint.TransactionSummary: type: object properties: endTime: type: string id: type: integer maxMemoryMb: type: integer startTime: type: string state: $ref: '#/definitions/transaction.State' endpoint.UpdateModel: type: object properties: aiEnabled: type: boolean x-nullable: true api: allOf: - $ref: '#/definitions/api.UpdateModel' x-nullable: true archived: type: boolean default: false x-nullable: true cloudStorage: allOf: - $ref: '#/definitions/cloudstorage.UpdateModel' x-nullable: true connectionId: type: integer x-nullable: true controlFile: allOf: - $ref: '#/definitions/endpoint.FileUpdate' x-nullable: true dataType: allOf: - $ref: '#/definitions/endpoint.DataType' x-nullable: true database: allOf: - $ref: '#/definitions/database.UpdateModel' x-nullable: true description: type: string x-nullable: true file: allOf: - $ref: '#/definitions/endpoint.FileUpdate' x-nullable: true fileSchedule: type: string x-nullable: true flumeLakehouse: allOf: - $ref: '#/definitions/flumelakehouse.UpdateModel' x-nullable: true hasControlFile: type: boolean x-nullable: true incrementalRecords: type: boolean x-nullable: true lookbackUnit: allOf: - $ref: '#/definitions/endpoint.LoopbackUnit' x-nullable: true lookbackValue: type: integer x-nullable: true name: type: string x-nullable: true operation: allOf: - $ref: '#/definitions/endpoint.Operation' x-nullable: true protocol: allOf: - $ref: '#/definitions/endpoint.Protocol' x-nullable: true recordDestinationId: description: if Protocol is FlumeRecordMetadata, the destination ID whose metadata to use type: integer x-nullable: true schedule: type: string x-nullable: true sftp: allOf: - $ref: '#/definitions/sftp.UpdateModel' x-nullable: true shardKeyRegex: type: string x-nullable: true sharded: type: boolean x-nullable: true snowflake: allOf: - $ref: '#/definitions/snowflake.UpdateModel' x-nullable: true supplementalDataTypes: type: array items: $ref: '#/definitions/endpoint.DataType' x-nullable: true type: allOf: - $ref: '#/definitions/endpoint.EndpointType' x-nullable: true workerMemoryGb: type: integer x-nullable: true workerSize: allOf: - $ref: '#/definitions/endpoint.WorkerSize' x-nullable: true endpoint.WorkerSize: type: string enum: - small - medium - large - xlarge - max x-enum-varnames: - WorkerSizeSmall - WorkerSizeMedium - WorkerSizeLarge - WorkerSizeXLarge - WorkerSizeMax endpoint.WriteModel: type: object required: - connectionId - dataType - name - operation - type properties: aiEnabled: type: boolean api: $ref: '#/definitions/api.WriteModel' cloudStorage: $ref: '#/definitions/cloudstorage.WriteModel' connectionId: type: integer controlFile: $ref: '#/definitions/endpoint.File' dataType: $ref: '#/definitions/endpoint.DataType' database: $ref: '#/definitions/database.WriteModel' description: type: string file: $ref: '#/definitions/endpoint.File' fileSchedule: type: string flumeLakehouse: $ref: '#/definitions/flumelakehouse.WriteModel' hasControlFile: type: boolean incrementalRecords: type: boolean lookbackModifiedBy: $ref: '#/definitions/endpoint.LookbackModifiedByUser' lookbackUnit: $ref: '#/definitions/endpoint.LoopbackUnit' lookbackValue: type: integer name: type: string operation: $ref: '#/definitions/endpoint.Operation' protocol: $ref: '#/definitions/endpoint.Protocol' recordDestinationId: description: if Protocol is FlumeRecordMetadata, the destination ID whose metadata to use type: integer schedule: type: string sftp: $ref: '#/definitions/sftp.WriteModel' shardKeyRegex: type: string sharded: type: boolean snowflake: $ref: '#/definitions/snowflake.WriteModel' supplementalDataTypes: type: array items: $ref: '#/definitions/endpoint.DataType' type: $ref: '#/definitions/endpoint.EndpointType' workerMemoryGb: type: integer minimum: 1 workerSize: $ref: '#/definitions/endpoint.WorkerSize' endpointmap.FieldType: type: string enum: - File - ControlFile - API - Database - FlumeLakehouse x-enum-varnames: - FieldTypeFile - FieldTypeControlFile - FieldTypeApi - FieldTypeDatabase - FieldTypeFlumeLakehouse endpointmap.ListResponse: type: object properties: endpointMaps: type: array items: $ref: '#/definitions/endpointmap.ReadModel' nextPageToken: type: string endpointmap.MapVersion: type: object properties: createdAt: type: string createdBy: $ref: '#/definitions/user.ReadModel' id: type: integer map: type: string version: type: integer endpointmap.ReadModel: type: object properties: accountId: type: integer fieldType: $ref: '#/definitions/endpointmap.FieldType' id: type: integer maps: type: array items: $ref: '#/definitions/endpointmap.MapVersion' name: type: string ordinal: type: integer flag.Flag: type: object properties: key: type: string value: type: string flag.ListReadModel: type: object properties: flags: type: array items: $ref: '#/definitions/flag.Flag' flitclient.IngestResponse: type: object properties: message: type: string rowsInserted: type: integer success: type: boolean flitclient.WriteResponse: type: object properties: message: type: string rowsAffected: type: integer success: type: boolean flumelakehouse.FlumeLakehouseMap: type: object properties: map: type: string name: type: string ordinal: type: integer flumelakehouse.ReadModel: type: object properties: credentialType: $ref: '#/definitions/flumelakehousecredentials.CredentialType' maps: type: array items: $ref: '#/definitions/flumelakehouse.FlumeLakehouseMap' secretName: type: string flumelakehouse.UpdateModel: type: object properties: credentialType: allOf: - $ref: '#/definitions/flumelakehousecredentials.CredentialType' x-nullable: true credentials: allOf: - $ref: '#/definitions/flumelakehousecredentials.FlumeLakehouseCredentials' x-nullable: true maps: type: array items: $ref: '#/definitions/flumelakehouse.FlumeLakehouseMap' x-nullable: true flumelakehouse.WriteModel: type: object properties: credentialType: $ref: '#/definitions/flumelakehousecredentials.CredentialType' credentials: $ref: '#/definitions/flumelakehousecredentials.FlumeLakehouseCredentials' maps: type: array items: $ref: '#/definitions/flumelakehouse.FlumeLakehouseMap' flumelakehousecredentials.CatalogConfig: type: object properties: name: type: string properties: type: object additionalProperties: type: string type: description: postgresql, sqlserver, iceberg type: string flumelakehousecredentials.CredentialType: type: string enum: - AwsStatic - AwsWebIdentity - GcpServiceAccount - AzureSharedKey - AzureSharedAccessSignature - AzureConnectionString x-enum-varnames: - CredentialTypeAwsStatic - CredentialTypeAwsWebIdentity - CredentialTypeGcpServiceAccount - CredentialTypeAzureSharedKey - CredentialTypeAzureSharedAccessSignature - CredentialTypeAzureConnectionString flumelakehousecredentials.FlumeLakehouseCredentials: type: object properties: catalogConfigs: type: array items: $ref: '#/definitions/flumelakehousecredentials.CatalogConfig' graph.Meta: type: object properties: took: type: string graph.QueryMeta: type: object properties: rowCount: type: integer took: type: string truncated: type: boolean graph.QueryRequest: type: object required: - cypher properties: cypher: type: string graph.QueryResponse: type: object properties: _meta: $ref: '#/definitions/graph.QueryMeta' columns: type: array items: type: string results: type: array items: type: object additionalProperties: {} graph.SearchMeta: type: object properties: mode: type: string resultCount: type: integer took: type: string graph.SearchResponse: type: object properties: _meta: $ref: '#/definitions/graph.SearchMeta' results: type: array items: $ref: '#/definitions/knowledgestore.SearchResult' graph.StatusResponse: type: object properties: _meta: $ref: '#/definitions/graph.Meta' edgeCount: type: integer lastLoaded: type: string nodeCount: type: integer status: type: string job.EndpointSummary: type: object properties: aiEnabled: type: boolean connectionId: type: integer id: type: integer name: type: string operation: $ref: '#/definitions/endpoint.Operation' state: $ref: '#/definitions/endpoint.State' job.ListResponse: type: object properties: jobs: type: array items: $ref: '#/definitions/job.ReadModel' nextPageToken: type: string job.ReadModel: type: object required: - name properties: accountId: type: integer aiEnabled: type: boolean aiWorkflowSubmitted: type: boolean created: type: string dataType: $ref: '#/definitions/endpoint.DataType' destinationEndpoint: $ref: '#/definitions/job.EndpointSummary' id: type: integer ignoreObjectInstances: type: boolean name: type: string sourceEndpoints: type: array items: $ref: '#/definitions/job.EndpointSummary' status: $ref: '#/definitions/job.Status' supplementalDataTypes: type: array items: $ref: '#/definitions/endpoint.DataType' updated: type: string job.Status: type: string enum: - Test - Production - Published - Draft - Archived - Paused x-enum-varnames: - StatusTest - StatusProduction - StatusPublished - StatusDraft - StatusArchived - StatusPaused job.TestFile: type: object required: - endpointId properties: endpointId: type: integer file: type: string job.TestRequest: type: object required: - files properties: files: type: array items: $ref: '#/definitions/job.TestFile' job.UpdateModel: type: object properties: aiEnabled: type: boolean default: false x-nullable: true aiWorkflowSubmitted: type: boolean x-nullable: true destinationEndpointId: type: integer x-nullable: true ignoreObjectInstances: type: boolean name: type: string x-nullable: true sourceEndpointIds: type: array items: type: integer x-nullable: true status: allOf: - $ref: '#/definitions/job.Status' x-nullable: true job.WriteModel: type: object required: - name properties: aiEnabled: type: boolean default: false aiWorkflowSubmitted: type: boolean default: false destinationEndpointId: type: integer ignoreObjectInstances: type: boolean name: type: string sourceEndpointIds: type: array items: type: integer status: $ref: '#/definitions/job.Status' knowledge.ApproveReviewItemRequest: type: object properties: recall_policy: description: RecallPolicy overrides the auto-injection policy the entity goes live under. allOf: - $ref: '#/definitions/knowledgestore.RecallPolicy' example: auto verification_interval: description: 'VerificationInterval overrides the re-verification cadence — an ISO-8601 duration string such as "P90D", NOT a nanosecond count (see knowledgestore.Duration). It is also the one FR-27 field an approver can supply for a proposal that carries none, which is what keeps a promotion completable without a manage-surface round trip.' type: string example: P90D knowledge.AttachCandidate: type: object properties: fqn: type: string label: type: string parent: type: string snippet: type: string knowledge.AttachCandidatesResponse: type: object properties: candidates: type: array items: $ref: '#/definitions/knowledge.AttachCandidate' conflict_warning: $ref: '#/definitions/knowledge.ConflictWarningResp' knowledge.ConflictEdgeRef: type: object properties: other_fqn: type: string knowledge.ConflictWarningResp: type: object properties: existing_fqn: type: string kind: type: string example: pitfall target_fqn: type: string knowledge.CreateArtifactRequest: type: object required: - kind properties: bytes: description: 'Bytes is the raw binary payload for a document/image artifact. Go''s encoding/json marshals a []byte as a base64 JSON string, so the wire representation is base64; the swaggertype and format tags below record that in the generated spec and client, which would otherwise model a []byte as an array of integers.' type: string format: byte content_hash: type: string extracted_text: type: string kind: type: string example: code language: type: string example: trinosql media_type: type: string example: application/sql scope: type: string example: account sensitivity: type: string example: phi_bearing source: type: string knowledge.CreateArtifactResponse: type: object properties: content_hash: type: string example: sha256-9f2c1a knowledge.DisambiguationResponse: type: object properties: candidates: type: array items: $ref: '#/definitions/knowledgemanager.AttachCandidate' error: type: string knowledge.EntityArtifact: type: object properties: content_hash: type: string kind: allOf: - $ref: '#/definitions/knowledgestore.ArtifactKind' example: code language: type: string media_type: type: string sensitivity: type: string example: phi_bearing knowledge.EntityAttachment: type: object properties: confidence: type: number inheritance: allOf: - $ref: '#/definitions/knowledgestore.InheritanceMode' example: exact target_fqn: type: string target_label: type: string knowledge.EntityBadges: type: object properties: conflict: type: boolean freshness: allOf: - $ref: '#/definitions/knowledgestore.FreshnessBand' example: fresh needs_review: type: boolean phi: type: boolean status: allOf: - $ref: '#/definitions/knowledgestore.KnowledgeStatus' example: active knowledge.EntityLifecycle: type: object properties: last_validated_against_schema: type: string recall_policy: allOf: - $ref: '#/definitions/knowledgestore.RecallPolicy' example: auto status: allOf: - $ref: '#/definitions/knowledgestore.KnowledgeStatus' example: active supersedes_fqn: type: string valid_from: type: string valid_to: type: string knowledge.EntityProvenance: type: object properties: authored_by: type: string confidence: type: number corroborated_by: type: array items: type: string created_by: type: string curator_role: type: string example: system_admin last_verified_at: type: string source_refs: type: array items: type: string source_type: type: string example: curator updated_by: type: string verification_interval: type: string verified_by: type: string knowledge.FeedbackEvent: type: object properties: conversation_id: type: string fqn: type: string message_id: type: string note: type: string vote: allOf: - $ref: '#/definitions/knowledge.FeedbackVote' example: up knowledge.FeedbackEventListResponse: type: object properties: events: type: array items: $ref: '#/definitions/knowledge.FeedbackEvent' knowledge.FeedbackRequest: type: object required: - vote properties: conversation_id: type: string message_id: type: string note: type: string vote: description: up | down type: string example: up knowledge.FeedbackVote: type: string enum: - up - down x-enum-varnames: - VoteUp - VoteDown knowledge.GateDecision: type: string enum: - none - light - heavy x-enum-varnames: - GateNone - GateLight - GateHeavy knowledge.GraphNodeBadges: type: object properties: conflict: type: boolean freshness: allOf: - $ref: '#/definitions/knowledgestore.FreshnessBand' example: fresh phi: type: boolean status: allOf: - $ref: '#/definitions/knowledgestore.KnowledgeStatus' example: active knowledge.GraphPeekAttachment: type: object properties: inheritance: allOf: - $ref: '#/definitions/knowledgestore.InheritanceMode' example: exact target_fqn: type: string target_label: type: string knowledge.GraphPeekNode: type: object properties: attachments: type: array items: $ref: '#/definitions/knowledge.GraphPeekAttachment' badge: $ref: '#/definitions/knowledgestore.KnowledgeResultBadge' body_excerpt: type: string conflict: type: boolean fqn: type: string kind: type: string example: pitfall phi: type: boolean scope: $ref: '#/definitions/knowledge.KnowledgeScope' title: type: string knowledge.InjectedItem: type: object properties: badge: $ref: '#/definitions/knowledgestore.KnowledgeResultBadge' conflict: description: 'Conflict and PHI are TRI-STATE: true, false, or null for "not established". They were plain booleans, which meant every row this API served asserted a definite negative — including for entities whose governance nothing had read. For `phi` that is the unsafe direction of an unsafe field: a curator opening the dock to judge whether something should have reached a model was told "no PHI" about an entity nobody classified. The rule is that unknown stays unknown; the same reasoning reviewmanager''s ToolCall.ResultEmpty documents for its own tri-state, and the same distinction §3.1 already draws by OMITTING recall_trace rather than sending it empty. omitempty, so unknown is ABSENCE rather than an explicit null. Two reasons, and the first is decisive: swag renders a *bool as a plain `boolean`, so a null on the wire would contradict the generated contract the SPA builds its types from (A5) — the field would be typed `boolean` and arrive null. Absence is expressible in that contract; null is not. It is also unambiguous, which an earlier version of this comment got wrong: the previous shape was a plain bool with no omitempty, so an older server ALWAYS sent the key. An absent phi therefore cannot be version skew — it can only be this server saying "not established".' type: boolean fqn: type: string kind: type: string example: pitfall phi: type: boolean scope: $ref: '#/definitions/knowledge.KnowledgeScope' title: type: string knowledge.KnowledgeEntityPayload: type: object properties: account_id: type: string applicability: type: string artifacts: type: array items: $ref: '#/definitions/knowledge.EntityArtifact' attachments: type: array items: $ref: '#/definitions/knowledge.EntityAttachment' badges: $ref: '#/definitions/knowledge.EntityBadges' body: type: string conflict_edges: type: array items: $ref: '#/definitions/knowledge.ConflictEdgeRef' description: type: string fqn: type: string kind: type: string example: pitfall lifecycle: $ref: '#/definitions/knowledge.EntityLifecycle' provenance: $ref: '#/definitions/knowledge.EntityProvenance' scope_id: type: string example: acct-benchmark-a scope_type: allOf: - $ref: '#/definitions/knowledgestore.KnowledgeScopeType' example: account tags: type: array items: type: string title: type: string knowledge.KnowledgeGraphEdge: type: object properties: id: type: string source: type: string target: type: string type: type: string example: APPLIES_TO knowledge.KnowledgeGraphNode: type: object properties: badges: $ref: '#/definitions/knowledge.GraphNodeBadges' fqn: type: string id: type: string kind: type: string example: pitfall label: type: string example: Knowledge knowledge.KnowledgeGraphResponse: type: object properties: edges: type: array items: $ref: '#/definitions/knowledge.KnowledgeGraphEdge' nodes: type: array items: $ref: '#/definitions/knowledge.KnowledgeGraphNode' knowledge.KnowledgeListResponse: type: object properties: _meta: $ref: '#/definitions/knowledge.Meta' results: type: array items: $ref: '#/definitions/knowledgestore.KnowledgeEntity' knowledge.KnowledgePrefixBlock: type: object properties: content: description: Content is the rendered block text ({ontology} or {index}). type: string version: description: Version is the block's monotonic version (ontology_version / account_index_version). type: integer knowledge.KnowledgePrefixResponse: type: object properties: index: $ref: '#/definitions/knowledge.KnowledgePrefixBlock' ontology: $ref: '#/definitions/knowledge.KnowledgePrefixBlock' knowledge.KnowledgeScope: type: object properties: scope_id: type: string example: acct-benchmark-a scope_type: allOf: - $ref: '#/definitions/knowledgestore.KnowledgeScopeType' example: account knowledge.LinkArtifactRequest: type: object required: - content_hash - edge properties: content_hash: type: string example: sha256-9f2c1a edge: type: string example: COMPUTED_BY knowledge.MergeReviewItemRequest: type: object required: - target_fqn properties: target_fqn: type: string example: knowledge/019f8899-d6c2-761e-b01e-3fa71d083a7b knowledge.Meta: type: object properties: took: type: string knowledge.PatchKnowledgeRequest: type: object properties: applicability: type: string body: type: string description: type: string last_verified_at: type: string recall_policy: $ref: '#/definitions/knowledgestore.RecallPolicy' status: $ref: '#/definitions/knowledgestore.KnowledgeStatus' tags: type: array items: type: string title: type: string verified_by: type: string knowledge.PromotionArtifactCheck: type: object properties: content_hash: type: string current_content_hash: description: 'CurrentContentHash names the head that replaced this version; absent when the version IS the head. On a forked revision history it names ONE of several heads (content-addressing lets a version have multiple successors, so there is no unique "latest") — `revised` is the field that carries the verdict.' type: string kind: allOf: - $ref: '#/definitions/knowledgestore.ArtifactKind' example: code revised: type: boolean knowledge.PromotionArtifactFreshness: type: object properties: artifacts: type: array items: $ref: '#/definitions/knowledge.PromotionArtifactCheck' verdict: allOf: - $ref: '#/definitions/knowledge.PromotionFreshnessVerdict' example: fresh knowledge.PromotionFreshnessVerdict: type: string enum: - fresh - artifact_revised - no_artifacts - unknown x-enum-varnames: - FreshnessFresh - FreshnessArtifactRevised - FreshnessNoArtifacts - FreshnessUnknown knowledge.PromotionPreflightResponse: type: object properties: artifact_freshness: $ref: '#/definitions/knowledge.PromotionArtifactFreshness' missing_evidence: type: array items: type: string proposal: $ref: '#/definitions/knowledge.ProposalPayload' review_item_id: type: string knowledge.ProposalListResponse: type: object properties: proposals: type: array items: $ref: '#/definitions/knowledge.ProposalPayload' knowledge.ProposalPayload: type: object properties: body: type: string confidence: type: number evidence_link: description: to the source tool output type: string fqn: type: string kind: type: string example: pitfall proposed_target: description: proposed attachment type: string reason: type: string recall_policy: allOf: - $ref: '#/definitions/knowledgestore.RecallPolicy' example: auto scope_id: type: string scope_type: allOf: - $ref: '#/definitions/knowledgestore.KnowledgeScopeType' example: account sensitivity: type: string title: type: string knowledge.RecallTraceItem: type: object properties: fqn: type: string kind: type: string example: pitfall title: type: string knowledge.RejectReviewItemRequest: type: object properties: reason: type: string example: unverifiable against the estate knowledge.ReviewItemPayload: type: object properties: assigned_to: type: string created_at: type: string item_type: allOf: - $ref: '#/definitions/knowledgestore.ReviewItemType' example: proposed_knowledge proposed_payload: type: object reason: type: string review_item_id: type: string status: allOf: - $ref: '#/definitions/knowledgestore.ReviewItemStatus' example: open knowledge.ReviewQueueResponse: type: object properties: items: type: array items: $ref: '#/definitions/knowledge.ReviewItemPayload' knowledge.SupersedeRequest: type: object required: - payload properties: payload: $ref: '#/definitions/knowledgemanager.CreateKnowledgeInput' knowledge.SuppressedItem: type: object properties: fqn: type: string kind: type: string example: definition reason: allOf: - $ref: '#/definitions/knowledge.SuppressionReason' example: budget title: type: string knowledge.SuppressionReason: type: string enum: - budget - expired - out_of_scope - lower_rank - non_active x-enum-varnames: - SuppressBudget - SuppressExpired - SuppressOutOfScope - SuppressLowerRank - SuppressNonActive knowledge.TurnKnowledgePayload: type: object properties: conversation_id: type: string gate_decision: allOf: - $ref: '#/definitions/knowledge.GateDecision' example: heavy injected: type: array items: $ref: '#/definitions/knowledge.InjectedItem' message_id: type: string recall_trace: description: RecallTrace is the at-a-glance banner list; ABSENT on a zero-injection turn. type: array items: $ref: '#/definitions/knowledge.RecallTraceItem' suppressed: description: 'C14 branch A — the suppressed set enumerated inline. Mutually exclusive with SuppressedRef; a builder picks a branch by measurement.' type: array items: $ref: '#/definitions/knowledge.SuppressedItem' suppressed_count: description: the "+N considered, not injected" headline type: integer suppressed_detail_ref: description: 'C14 branch B — a handle the dock fetches on expand when inlining the full suppressed set is too heavy for the turn payload.' type: string knowledgemanager.AttachCandidate: type: object properties: fqn: type: string label: type: string parent: type: string snippet: type: string knowledgemanager.AttachInput: type: object required: - inheritance properties: confidence: description: 'Confidence is the optional [0,1] score for the attachment. Omit it to leave confidence unset; a supplied value (including 0) is persisted distinctly from unset, so "zero confidence" and "no confidence" do not collapse.' type: number create_target_term: description: 'CreateTargetTerm is the zero-candidate confirm step: when a target text resolves to no candidate, the curator may confirm creating a :BusinessTerm to attach to. When set, the manager mints the term and attaches the source to it in one call (the offer→confirm flow), emitting the business-term-fallback metric.' allOf: - $ref: '#/definitions/knowledgemanager.NewBusinessTerm' inheritance: $ref: '#/definitions/knowledgestore.InheritanceMode' proceed: description: 'Proceed acknowledges a same-kind/same-target conflict warning: the first interactive attach returns the warning and writes nothing; a follow-up with Proceed=true writes the :APPLIES_TO edge AND records the :CONFLICTS_WITH edge (FR-5). It has no effect when no conflict exists. The two-call confirm is STATELESS, so Proceed is a blanket acknowledgment of WHATEVER CONFLICTS EXIST AT PROCEED TIME, not of the specific conflicts a prior call surfaced: a first call with Proceed=true skips the warning entirely, and a conflict created between the warn and the proceed is written past without ever having been shown. Accepted deliberately — FR-5''s mechanical invariants still hold either way (every conflict is detected, recorded as :CONFLICTS_WITH with an `attached` audit event, and echoed in the result), so nothing is absorbed silently; only the ORDER of "shown" versus "written" differs. If multi-curator concurrency arrives, replace this with acknowledged-fqn semantics (e.g. proceed_past: [existing_fqns]) rather than widening the blanket flag.' type: boolean source_fqn: type: string target_fqns: type: array items: type: string target_text: type: string knowledgemanager.AttachResult: type: object properties: additional_conflicts: description: 'AdditionalConflicts carries the second-and-later conflicts when multiple explicit targets each hit a same-kind active (FR-5: every conflict is surfaced, none silently absorbed). Additive so existing consumers of the singular field keep working; empty when at most one conflict exists.' type: array items: $ref: '#/definitions/knowledgemanager.ConflictWarning' conflict_warning: $ref: '#/definitions/knowledgemanager.ConflictWarning' edges: type: array items: $ref: '#/definitions/knowledgestore.AppliesToEdge' knowledgemanager.BulkItem: type: object required: - payload properties: inheritance: $ref: '#/definitions/knowledgestore.InheritanceMode' payload: $ref: '#/definitions/knowledgemanager.CreateKnowledgeInput' target_fqn: type: string target_text: type: string knowledgemanager.BulkItemError: type: object properties: error: $ref: '#/definitions/knowledgemanager.KnowledgeWriteError' index: type: integer knowledgemanager.BulkResult: type: object properties: deferred: description: 'Deferred holds the bulk_seed_ambiguity rows raised by this run. On an executed run these are the PERSISTED rows, fully identified. On a dry run they are PREVIEWS of the rows that would be created: item_type, status, reason, account_id and proposed_payload are exact, while review_item_id, source_event_id and created_at are minted at persist time and so carry no value here. Nothing else returns a ReviewItem with unset identity fields. On the wire that means the two ids are OMITTED from a preview row (they carry omitempty for exactly this path), matching the generated optional TS type. The one residue is created_at: time.Time has no useful zero-omission, so a preview stamps it "0001-01-01T00:00:00Z". A consumer must therefore treat created_at on a dry-run row as absent rather than parse it — `new Date(row.created_at)` yields a year-1 date, which is worse than an absent one because nothing downstream flags it. Removing that last one needs a preview-specific type or *time.Time; both change the contract and are scoped out of this ticket.' type: array items: $ref: '#/definitions/knowledgestore.ReviewItem' errors: type: array items: $ref: '#/definitions/knowledgemanager.BulkItemError' written: type: integer knowledgemanager.BulkWriteInput: type: object required: - manifest properties: dry_run: type: boolean manifest: type: array items: $ref: '#/definitions/knowledgemanager.BulkItem' knowledgemanager.ConflictWarning: type: object properties: existing_fqn: type: string kind: type: string target_fqn: type: string knowledgemanager.CreateKnowledgeInput: type: object required: - description - kind - knowledge_scope_type - title properties: applicability: type: string authored_by: type: string body: type: string confidence: type: number description: type: string kind: type: string knowledge_scope_id: description: 'ScopeID is required for the project, user, and session scopes (each names a specific subject) and MAY be empty for account (defaults to the request-context account) and flume_core (global, no id). See Validate.' type: string knowledge_scope_type: $ref: '#/definitions/knowledgestore.KnowledgeScopeType' proposed_target: description: 'ProposedTarget is the attachment target the proposer named, as TEXT. Required to approve (FR-27 "resolved attachment target"). It is deliberately neither of the two things it resembles: not an :APPLIES_TO edge (attach needs a RESOLVED fqn, and a proposer has not resolved anything), and not Applicability (which is prose about WHEN the knowledge applies, not WHAT it attaches to). Resolution is the curator''s job on the manage surface before approval.' type: string recall_policy: $ref: '#/definitions/knowledgestore.RecallPolicy' sensitivity: description: 'Sensitivity is the proposer''s PHI classification (none | phi_adjacent | phi_bearing). Required to approve (FR-27 "sensitivity classification"); an unclassified entity is not injectable (PHI policy §4).' type: string example: none source_refs: type: array items: type: string source_type: type: string status: $ref: '#/definitions/knowledgestore.KnowledgeStatus' tags: type: array items: type: string title: type: string valid_from: type: string valid_to: type: string verification_interval: description: 'VerificationInterval is the re-verification cadence (an ISO-8601 duration string such as "P90D" — see knowledgestore.Duration), required to approve (FR-27 "verification interval"). It is accepted at PROPOSE time, which is a deviation worth stating: it is an approver-shaped decision, and the natural home would be the approve request. But the review-queue''s approve is a bodyless POST by contract, so with no create-time field a proposal could carry no interval by any route the SPA has, and every promotion would block on missing evidence permanently. The approve route still accepts an override, so the approver keeps the final say; this field is what lets the proposal arrive with a defensible default already on it.' type: string example: P90D knowledgemanager.KnowledgeWriteError: type: object properties: code: $ref: '#/definitions/knowledgemanager.KnowledgeWriteErrorCode' field: type: string message: type: string knowledgemanager.KnowledgeWriteErrorCode: type: string enum: - invalid_input - disambiguation_required - conflict - scope_forbidden - not_found - internal x-enum-varnames: - KnowledgeWriteInvalidInput - KnowledgeWriteDisambiguationRequired - KnowledgeWriteConflict - KnowledgeWriteScopeForbidden - KnowledgeWriteNotFound - KnowledgeWriteInternal knowledgemanager.NewBusinessTerm: type: object required: - name properties: description: type: string name: type: string knowledgestore.AppliesToEdge: type: object properties: confidence: description: 'Confidence is presence-aware: nil means "no confidence supplied" (the property is omitted at persistence), while a non-nil pointer persists its value — including a legal 0.0 — so "zero confidence" and "unset" round-trip distinctly instead of collapsing to the same stored state.' type: number created_at: type: string created_by: type: string inheritance: allOf: - $ref: '#/definitions/knowledgestore.InheritanceMode' example: exact source_fqn: type: string target_fqn: type: string knowledgestore.ArtifactKind: type: string enum: - code - document - image x-enum-varnames: - ArtifactKindCode - ArtifactKindDocument - ArtifactKindImage knowledgestore.FreshnessBand: type: string enum: - fresh - aging - stale - expired - needs_review x-enum-varnames: - FreshnessFresh - FreshnessAging - FreshnessStale - FreshnessExpired - FreshnessNeedsReview knowledgestore.InheritanceMode: type: string enum: - exact - descendants x-enum-varnames: - InheritanceExact - InheritanceDescendants knowledgestore.KnowledgeEntity: type: object properties: account_id: type: string example: '12345' applicability: type: string authored_by: type: string body: type: string x-body-soft-cap-warning: true confidence: type: number corroborated_by: type: array items: type: string created_at: type: string created_by: type: string curator_role: type: string example: system_admin description: type: string example: Rows written before 2021-03 have a null paid_amt. fqn: type: string example: knowledge/019f8899-d6c2-761f-9019-4ad5e8167402 kind: type: string example: pitfall knowledge_scope_id: type: string example: '12345' knowledge_scope_type: allOf: - $ref: '#/definitions/knowledgestore.KnowledgeScopeType' example: account last_validated_against_schema: type: string last_verified_at: type: string recall_policy: allOf: - $ref: '#/definitions/knowledgestore.RecallPolicy' example: auto source_refs: type: array items: type: string source_type: type: string example: curator status: allOf: - $ref: '#/definitions/knowledgestore.KnowledgeStatus' example: active supersedes_fqn: type: string tags: type: array items: type: string title: type: string example: paid_amt is null before the 2021 migration updated_at: type: string updated_by: type: string valid_from: type: string valid_to: type: string verification_interval: type: string verified_by: type: string knowledgestore.KnowledgeResultBadge: type: object properties: freshness: description: Freshness is the verification/recency band (see FreshnessBand). allOf: - $ref: '#/definitions/knowledgestore.FreshnessBand' example: fresh source: description: Source is the provenance gradient label (e.g. "curator", "scan", "inferred"). type: string example: curator knowledgestore.KnowledgeScopeType: type: string enum: - flume_core - account - project - user - session x-enum-varnames: - ScopeTypeFlumeCore - ScopeTypeAccount - ScopeTypeProject - ScopeTypeUser - ScopeTypeSession knowledgestore.KnowledgeStatus: type: string enum: - proposed - active - superseded - archived - rejected - tombstoned x-enum-varnames: - StatusProposed - StatusActive - StatusSuperseded - StatusArchived - StatusRejected - StatusTombstoned knowledgestore.RecallPolicy: type: string enum: - auto - manual - never x-enum-varnames: - RecallAuto - RecallManual - RecallNever knowledgestore.ReviewItem: type: object properties: account_id: type: string assigned_to: type: string created_at: type: string item_type: allOf: - $ref: '#/definitions/knowledgestore.ReviewItemType' example: bulk_seed_ambiguity proposed_payload: type: object reason: type: string review_item_id: type: string source_event_id: type: string status: allOf: - $ref: '#/definitions/knowledgestore.ReviewItemStatus' example: open knowledgestore.ReviewItemStatus: type: string enum: - open - accepted - rejected - dismissed x-enum-varnames: - ReviewOpen - ReviewAccepted - ReviewRejected - ReviewDismissed knowledgestore.ReviewItemType: type: string enum: - proposed_knowledge - bulk_seed_ambiguity - feedback_flag x-enum-varnames: - ReviewTypeProposedKnowledge - ReviewTypeBulkSeedAmbiguity - ReviewTypeFeedbackFlag knowledgestore.SearchResult: type: object properties: fqn: type: string label: type: string name: type: string properties: type: object additionalProperties: {} score: type: number object.CanonicalColumn: type: object required: - column - dataType properties: column: type: string dataType: $ref: '#/definitions/endpoint.DataType' object.ListResponse: type: object properties: nextPageToken: type: string objects: type: array items: $ref: '#/definitions/object.ReadModel' object.ReadModel: type: object required: - canonicalColumns - name properties: canonicalColumns: type: array items: $ref: '#/definitions/object.CanonicalColumn' id: type: integer name: type: string numInstances: type: integer object.UpdateModel: type: object properties: canonicalColumns: type: array items: $ref: '#/definitions/object.CanonicalColumn' name: type: string object.WriteModel: type: object required: - canonicalColumns - name properties: canonicalColumns: type: array items: $ref: '#/definitions/object.CanonicalColumn' name: type: string objectinstance.BulkWriteModel: type: object properties: instances: type: array items: $ref: '#/definitions/objectinstance.WriteModel' objectinstance.CustomValue: type: object properties: key: type: string value: type: string objectinstance.CustomValuesByConnection: type: object additionalProperties: type: array items: $ref: '#/definitions/objectinstance.CustomValue' objectinstance.ListResponse: type: object properties: instances: type: array items: $ref: '#/definitions/objectinstance.ReadModel' nextPageToken: type: string objectinstance.ObjectSummary: type: object properties: id: type: integer name: type: string objectinstance.ReadModel: type: object required: - canonicalValue - connectionIds - jobIds - name properties: canonicalValue: type: string connectionCustomValues: $ref: '#/definitions/objectinstance.CustomValuesByConnection' connectionIds: type: array uniqueItems: true items: type: integer id: type: integer jobIds: type: array uniqueItems: true items: type: integer name: type: string object: $ref: '#/definitions/objectinstance.ObjectSummary' objectinstance.UpdateModel: type: object properties: canonicalValue: type: string connectionCustomValues: $ref: '#/definitions/objectinstance.CustomValuesByConnection' connectionIds: type: array uniqueItems: true items: type: integer jobIds: type: array uniqueItems: true items: type: integer name: type: string objectinstance.WriteModel: type: object required: - canonicalValue - connectionIds - jobIds - name properties: canonicalValue: type: string connectionCustomValues: $ref: '#/definitions/objectinstance.CustomValuesByConnection' connectionIds: type: array uniqueItems: true items: type: integer jobIds: type: array uniqueItems: true items: type: integer name: type: string report.GroupsTradedLine: type: object properties: accountId: type: integer groups: type: integer month: type: string tradingPartner: type: string responses.ErrorResponse: type: object properties: code: type: integer details: type: array items: type: string message: type: string secret.ApiCloudCredSecret: type: object properties: name: type: string value: $ref: '#/definitions/cloudstoragecredentials.CloudStorageCredentials' secret.ApiEncryptionSecret: type: object properties: passphrase: $ref: '#/definitions/secret.ApiSecret' privateKey: $ref: '#/definitions/secret.ApiSecret' secret.ApiFlumeLakehouseSecret: type: object properties: name: type: string value: $ref: '#/definitions/flumelakehousecredentials.FlumeLakehouseCredentials' secret.ApiSecret: type: object properties: name: type: string value: type: string secret.SecretType: type: string enum: - Password - PrivateKey x-enum-varnames: - SecretTypePassword - SecretTypePrivateKey sftp.ReadModel: type: object properties: deleteAfterPickup: type: boolean encryption: $ref: '#/definitions/encryption.ReadModel' host: type: string hostKeyAlgorithm: type: string keyExchange: type: string path: type: string port: type: integer secretName: type: string secretType: $ref: '#/definitions/secret.SecretType' serverCipher: type: string serverPublicKey: type: string sortDescending: type: boolean sortingMethod: $ref: '#/definitions/sorting.Method' username: type: string sftp.UpdateModel: type: object properties: deleteAfterPickup: type: boolean x-nullable: true encryption: $ref: '#/definitions/encryption.UpdateModel' host: type: string x-nullable: true hostKeyAlgorithm: type: string x-nullable: true keyExchange: type: string x-nullable: true path: type: string x-nullable: true port: type: integer x-nullable: true secret: type: string x-nullable: true secretType: allOf: - $ref: '#/definitions/secret.SecretType' x-nullable: true serverCipher: type: string x-nullable: true serverPublicKey: type: string x-nullable: true sortDescending: type: boolean x-nullable: true sortingMethod: allOf: - $ref: '#/definitions/sorting.Method' x-nullable: true username: type: string x-nullable: true sftp.WriteModel: type: object properties: deleteAfterPickup: type: boolean encryption: $ref: '#/definitions/encryption.WriteModel' host: type: string hostKeyAlgorithm: type: string keyExchange: type: string path: type: string port: type: integer secret: type: string secretType: $ref: '#/definitions/secret.SecretType' serverCipher: type: string serverPublicKey: type: string sortDescending: type: boolean sortingMethod: $ref: '#/definitions/sorting.Method' username: type: string shard.BulkWriteModel: type: object properties: shards: type: array items: $ref: '#/definitions/shard.WriteModel' shard.ReadModel: type: object required: - key properties: accountId: type: integer endpointId: type: integer id: type: integer key: type: string lastTransaction: $ref: '#/definitions/shard.TransactionSummary' nextTransaction: type: string recentTransactions: $ref: '#/definitions/shard.RecentTransactions' state: $ref: '#/definitions/endpoint.State' shard.RecentTransactions: type: object properties: last: $ref: '#/definitions/shard.TransactionSummary' lastFinished: $ref: '#/definitions/shard.TransactionSummary' lastFinishedOp: $ref: '#/definitions/shard.TransactionSummary' lastSuccessful: $ref: '#/definitions/shard.TransactionSummary' lastVisible: $ref: '#/definitions/shard.TransactionSummary' shard.TransactionSummary: type: object properties: endTime: type: string id: type: integer startTime: type: string state: $ref: '#/definitions/transaction.State' shard.WriteModel: type: object required: - key properties: key: type: string snowflake.Field: type: object required: - name - type properties: name: type: string primaryKey: type: boolean type: type: string snowflake.ReadModel: type: object properties: account: type: string database: type: string defaultSchema: type: string fields: type: array items: $ref: '#/definitions/snowflake.Field' host: type: string port: description: not in frontend type: integer role: type: string secretName: type: string secretType: $ref: '#/definitions/secret.SecretType' stage: type: string table: type: string username: type: string warehouse: type: string snowflake.UpdateModel: type: object properties: account: type: string x-nullable: true database: type: string x-nullable: true defaultSchema: type: string x-nullable: true fields: type: array items: $ref: '#/definitions/snowflake.Field' x-nullable: true host: type: string x-nullable: true port: description: not in frontend type: integer x-nullable: true role: type: string x-nullable: true secret: type: string x-nullable: true secretType: allOf: - $ref: '#/definitions/secret.SecretType' x-nullable: true stage: type: string x-nullable: true table: type: string x-nullable: true username: type: string x-nullable: true warehouse: type: string x-nullable: true snowflake.WriteModel: type: object properties: account: type: string database: type: string defaultSchema: type: string fields: type: array items: $ref: '#/definitions/snowflake.Field' host: type: string port: description: not in frontend type: integer role: type: string secret: type: string secretType: $ref: '#/definitions/secret.SecretType' stage: type: string table: type: string username: type: string warehouse: type: string sorting.Method: type: string enum: - Default - FileName - LastModified x-enum-varnames: - MethodDefault - MethodFileName - MethodLastModified sourcefile.ArchiveType: type: string enum: - Zip - Gzip - Bzip2 - Tar - TarGzip - TarBzip2 - 7zip x-enum-varnames: - ArchiveTypeZip - ArchiveTypeGzip - ArchiveTypeBzip2 - ArchiveTypeTar - ArchiveTypeTarGzip - ArchiveTypeTarBzip2 - ArchiveType7zip sourcefile.BulkPatchModel: type: object required: - endpointId - ids properties: endpointId: type: integer ids: type: array minItems: 1 items: type: integer isProcessed: type: boolean isStaged: type: boolean sourcefile.BulkWriteModel: type: object properties: sourceFiles: type: array items: $ref: '#/definitions/sourcefile.WriteModel' sourcefile.ControlFile: type: object properties: blobKey: type: string fileName: type: string lastModified: type: string sizeBytes: type: integer sourcefile.ListResponse: type: object properties: nextPageToken: type: string sourceFiles: type: array items: $ref: '#/definitions/sourcefile.ReadModel' sourcefile.PatchModel: type: object properties: controlFile: $ref: '#/definitions/sourcefile.ControlFile' fileDisappeared: type: boolean isProcessed: type: boolean isStaged: type: boolean shardBatchKey: type: string sizeBytes: type: integer sourcefile.ReadModel: type: object properties: accountId: type: integer archiveFileName: type: string archiveType: $ref: '#/definitions/sourcefile.ArchiveType' blobKey: type: string controlFile: $ref: '#/definitions/sourcefile.ControlFile' discoveredAt: type: string discoveredRank: type: integer duckDbBatchKey: type: string duckDbTable: type: string endpointId: type: integer fileDisappeared: type: boolean fileName: type: string id: type: integer isArchive: type: boolean isProcessed: type: boolean isStaged: type: boolean lastModified: type: string shardBatchKey: type: string sizeBytes: type: integer sourcefile.WriteModel: type: object required: - endpointId - fileName - lastModified - sizeBytes properties: archiveFileName: type: string archiveType: $ref: '#/definitions/sourcefile.ArchiveType' blobKey: type: string controlFile: $ref: '#/definitions/sourcefile.ControlFile' discoveredAt: type: string discoveredRank: type: integer duckDbBatchKey: type: string duckDbTable: type: string endpointId: type: integer fileName: type: string isArchive: type: boolean isProcessed: type: boolean isStaged: type: boolean lastModified: type: string shardBatchKey: type: string sizeBytes: type: integer telemetry.ReadModel: type: object properties: averageRecordsPerTransaction: type: number computedAt: type: string contractUsage: type: number totalRecordVolume: type: integer totalTransactions: type: integer transactionSuccessRate: type: number transaction.FileDetail: type: object properties: archiveFileName: type: string compressedFilesFound: type: array items: type: string downloadDurationMillis: type: integer lastModifiedTime: type: string name: type: string recordsIn: type: integer recordsOut: type: integer retrievalTime: type: string sizeBytes: type: integer uploadDurationMillis: type: integer transaction.ListReadModel: type: object properties: nextPageToken: type: string transactions: type: array items: $ref: '#/definitions/transaction.ReadModel' transaction.Operation: type: string enum: - SourceMap - SourceTransfer - SourceExtract - SourceMapBatchLoad - SourceMapBatchProcess - DestinationMap - DestinationTransfer x-enum-varnames: - OperationSourceMap - OperationSourceTransfer - OperationSourceExtract - OperationSourceMapBatchLoad - OperationSourceMapBatchProcess - OperationDestinationMap - OperationDestinationTransfer transaction.ReadModel: type: object properties: accountId: type: integer durationMillis: type: integer endTime: type: string endpointId: type: integer groupIds: type: array items: type: string id: type: integer maxMemoryMB: type: integer operation: $ref: '#/definitions/transaction.Operation' shardBatchKey: type: string shardId: type: integer startTime: type: string state: $ref: '#/definitions/transaction.State' steps: $ref: '#/definitions/transaction.Steps' trigger: $ref: '#/definitions/transaction.Trigger' triggeredBy: type: string workerId: type: string transaction.State: type: string enum: - Scheduled - Running - Succeeded - SucceededNoOp - FailedRecoverable - FailedNonrecoverable - FailedValidation - Cancelled - FailedMissingSourceFile x-enum-varnames: - StateScheduled - StateRunning - StateSucceeded - StateSucceededNoOp - StateFailedRecoverable - StateFailedNonrecoverable - StateFailedValidation - StateCancelled - StateFailedMissingSourceFile transaction.Step: type: object properties: endTime: type: string error: type: string errorLogBlobKey: type: string file: $ref: '#/definitions/transaction.FileDetail' logBlobKey: type: string logs: type: string startTime: type: string state: $ref: '#/definitions/transaction.State' watermark: type: string watermarkBlobKey: type: string transaction.Steps: type: object properties: extract: $ref: '#/definitions/transaction.Step' load: $ref: '#/definitions/transaction.Step' transform: $ref: '#/definitions/transaction.Step' transaction.Trigger: type: string enum: - Manual - Schedule - Subsequent x-enum-varnames: - TriggerManual - TriggerSchedule - TriggerSubsequent transaction.WriteModel: type: object required: - state - trigger properties: endTime: type: string groupIds: type: array items: type: string operation: $ref: '#/definitions/transaction.Operation' shardBatchKey: type: string shardId: type: integer state: $ref: '#/definitions/transaction.State' steps: $ref: '#/definitions/transaction.Steps' trigger: $ref: '#/definitions/transaction.Trigger' workerId: type: string user.ListModel: type: object properties: nextPageToken: type: string users: type: array items: $ref: '#/definitions/user.ReadModel' user.QueryEngineGrantRequest: type: object required: - duration_hours - reason properties: duration_hours: type: integer maximum: 24 minimum: 1 reason: type: string user.QueryEngineGrantResponse: type: object properties: expiresAt: type: string message: type: string reason: type: string userId: type: integer user.ReadModel: type: object properties: accountId: type: integer active: type: boolean aiEnabled: type: boolean created: type: string email: type: string firstName: type: string id: type: integer isAccessGranter: type: boolean lastName: type: string queryEngineAccessExpiresAt: type: string queryEngineAccessReason: type: string receiveEmailAlerts: type: boolean role: $ref: '#/definitions/user.Role' updated: type: string user.Role: type: string enum: - SystemAdmin - Admin - Editor - Viewer x-enum-varnames: - RoleSystemAdmin - RoleAdmin - RoleEditor - RoleViewer user.SelfUser: type: object properties: accountId: type: integer aiEnabled: type: boolean email: type: string isAccessGranter: type: boolean receiveEmailAlerts: type: boolean role: $ref: '#/definitions/user.Role' user.SelfUserPatchModel: type: object properties: receiveEmailAlerts: type: boolean user.WriteModel: type: object required: - active - email - firstName - lastName - role properties: active: description: pointer so we can distinguish between false and not set type: boolean aiEnabled: type: boolean email: type: string firstName: type: string lastName: type: string role: $ref: '#/definitions/user.Role' workersize.ListResponse: type: object properties: nextPageToken: type: string workerSizes: type: array items: $ref: '#/definitions/workersize.ReadModel' workersize.ReadModel: type: object properties: cpuLimit: type: integer id: type: integer label: $ref: '#/definitions/endpoint.WorkerSize' memoryLimit: type: integer workersize.UpdateModel: type: object properties: cpuLimit: type: integer x-nullable: true memoryLimit: type: integer x-nullable: true securityDefinitions: OAuth2Implicit: type: oauth2 flow: implicit authorizationUrl: https://auth.flumehealth.com/authorize?audience=https://console.flumehealth.com/api scopes: email: User email address openid: OpenID Connect scope profile: User profile information