openapi: 3.0.0 info: title: 'VerifyWise API' description: 'AI Governance Platform API' version: 2.0.0 servers: - url: /api description: 'Main API server' components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT parameters: ProjectId: name: id in: path required: true description: 'The numeric project ID' schema: type: integer example: 1 PolicyId: name: id in: path required: true description: 'Numeric ID of the policy' schema: type: integer example: 42 schemas: Error: type: object properties: data: type: string AiRiskClassification: type: string enum: - Prohibited - 'High risk' - 'Limited risk' - 'Minimal risk' - GPAI - 'General Risk' - 'Out of scope' description: 'EU AI Act risk classification level' HighRiskRole: type: string enum: - Deployer - Provider description: 'Role of the organization under the EU AI Act for high-risk systems' ProjectStatus: type: string enum: - 'Not started' - 'In progress' - 'Under review' - Completed - Closed - 'On hold' - Rejected description: 'Current lifecycle status of the project' CreateProjectRequest: type: object required: - project_title - owner - start_date - framework properties: project_title: type: string example: 'Customer Support Chatbot' owner: type: integer example: 1 start_date: type: string format: date-time example: '2026-01-15T00:00:00.000Z' geography: type: integer default: 1 example: 1 ai_risk_classification: $ref: '#/components/schemas/AiRiskClassification' type_of_high_risk_role: $ref: '#/components/schemas/HighRiskRole' goal: type: string nullable: true example: 'Automate tier-1 support queries' target_industry: type: string nullable: true example: 'Financial Services' description: type: string nullable: true example: 'An LLM-powered chatbot for handling customer inquiries' status: $ref: '#/components/schemas/ProjectStatus' is_organizational: type: boolean default: false members: type: array items: type: integer example: - 2 - 3 - 5 framework: type: array items: type: integer example: - 1 - 2 approval_workflow_id: type: integer nullable: true example: null enable_ai_data_insertion: type: boolean default: false UpdateProjectRequest: type: object properties: project_title: type: string owner: type: integer start_date: type: string format: date-time geography: type: integer ai_risk_classification: $ref: '#/components/schemas/AiRiskClassification' type_of_high_risk_role: $ref: '#/components/schemas/HighRiskRole' goal: type: string nullable: true target_industry: type: string nullable: true description: type: string nullable: true status: $ref: '#/components/schemas/ProjectStatus' last_updated: type: string format: date-time last_updated_by: type: integer members: type: array items: type: integer example: - 2 - 3 - 5 ProjectFramework: type: object properties: project_framework_id: type: integer framework_id: type: integer name: type: string example: 'EU AI Act' Project: type: object properties: id: type: integer example: 42 uc_id: type: string nullable: true example: UC-7 project_title: type: string example: 'Customer Support Chatbot' owner: type: integer example: 1 start_date: type: string format: date-time nullable: true geography: type: integer nullable: true example: 1 ai_risk_classification: oneOf: - $ref: '#/components/schemas/AiRiskClassification' - type: 'null' type_of_high_risk_role: oneOf: - $ref: '#/components/schemas/HighRiskRole' - type: 'null' use_case_category: type: string nullable: true use_case_purpose: type: string nullable: true use_case_audience: type: string nullable: true deployment_context: type: string nullable: true goal: type: string nullable: true target_industry: type: string nullable: true description: type: string nullable: true status: $ref: '#/components/schemas/ProjectStatus' last_updated: type: string format: date-time nullable: true last_updated_by: type: integer nullable: true created_at: type: string format: date-time is_organizational: type: boolean is_demo: type: boolean _source: type: string nullable: true framework: type: array items: $ref: '#/components/schemas/ProjectFramework' members: type: array items: type: integer ProjectListItem: allOf: - $ref: '#/components/schemas/Project' - type: object properties: has_pending_approval: type: boolean approval_status: type: string nullable: true enum: - pending - rejected - null ProjectDetail: allOf: - $ref: '#/components/schemas/Project' - type: object properties: owner_name: type: string example: 'John Doe' has_pending_approval: type: boolean approval_status: type: string nullable: true enum: - pending - rejected - null ProjectWithMembers: allOf: - $ref: '#/components/schemas/Project' - type: object properties: members: type: array items: type: integer ProjectStats: type: object properties: user: type: object properties: name: type: string surname: type: string email: type: string format: email project_last_updated: type: string format: date-time userWhoUpdated: type: object properties: id: type: integer name: type: string surname: type: string email: type: string format: email ProjectRiskCount: type: object properties: risk_level_autocalculated: type: string example: High count: type: string example: '3' VendorRiskCount: type: object properties: risk_level: type: string example: Critical count: type: string example: '2' ComplianceProgress: type: object properties: allsubControls: oneOf: - type: string - type: integer example: '45' allDonesubControls: oneOf: - type: string - type: integer example: '12' AssessmentProgress: type: object properties: totalQuestions: oneOf: - type: string - type: integer example: '80' answeredQuestions: oneOf: - type: string - type: integer example: '35' ControlCategory: type: object properties: id: type: integer project_id: type: integer name: type: string organization_id: type: integer controls: type: array items: type: object properties: id: type: integer control_category_id: type: integer title: type: string description: type: string status: type: string numberOfSubcontrols: type: integer numberOfDoneSubcontrols: type: integer subControls: type: array items: type: object properties: {id: {type: integer}, control_id: {type: integer}, title: {type: string}, description: {type: string}, status: {type: string, enum: [Draft, 'In progress', Done]}, organization_id: {type: integer}} ErrorResponse: type: object properties: message: type: string example: 'Not Found' data: example: {} ServerError: type: object properties: message: type: string example: 'Internal Server Error' error: type: string example: 'Unexpected error occurred' UserSafe: type: object description: 'User object with password_hash excluded' properties: id: type: integer example: 1 name: type: string example: John surname: type: string example: Doe email: type: string format: email example: john@example.com role_id: type: integer description: '1=Admin, 2=Reviewer, 3=Editor, 4=Auditor, 5=SuperAdmin' example: 1 createdAt: type: string format: date-time last_login: type: string format: date-time nullable: true updatedAt: type: string format: date-time is_demo: type: boolean default: false organization_id: type: integer nullable: true example: 1 profile_photo_id: type: integer nullable: true sso_provider: type: string nullable: true enum: - AzureAD - null sso_user_id: type: string nullable: true required: - id - name - surname - email - role_id - createdAt StatusEnvelope: type: object properties: message: type: string description: 'HTTP status text (e.g. "OK", "Created", "Accepted")' data: description: 'Response payload (varies by endpoint)' ErrorEnvelope: type: object properties: message: type: string description: 'HTTP status text or error category' data: type: string description: 'Error detail message' ProgressResponse: type: object properties: assessmentsMetadata: type: array items: type: object properties: projectId: type: integer totalAssessments: type: integer doneAssessments: type: integer controlsMetadata: type: array items: type: object properties: projectId: type: integer totalSubControls: type: integer doneSubControls: type: integer allTotalAssessments: type: integer allDoneAssessments: type: integer allTotalSubControls: type: integer allDoneSubControls: type: integer Vendor: type: object properties: id: type: integer description: 'Auto-generated primary key' example: 42 order_no: type: integer nullable: true description: 'Display order number' vendor_name: type: string description: 'Name of the vendor' example: 'Acme Corp' vendor_provides: type: string description: 'What the vendor provides' example: 'Cloud hosting services' assignee: type: integer description: 'User ID of the assigned owner' example: 5 website: type: string description: 'Vendor website URL' example: 'https://acme.example.com' vendor_contact_person: type: string description: 'Name of the vendor contact' example: 'Jane Doe' review_result: type: string nullable: true description: 'Free-text review result summary' review_status: type: string nullable: true enum: - 'Not started' - 'In review' - Reviewed - 'Requires follow-up' default: 'Not started' description: 'Current review lifecycle status' reviewer: type: integer nullable: true description: 'User ID of the reviewer' review_date: type: string format: date-time nullable: true description: 'Date the review was performed (ISO 8601)' is_demo: type: boolean default: false description: 'Whether this is a demo vendor (read-only after creation)' projects: type: array items: type: integer description: 'Array of associated project IDs' data_sensitivity: type: string nullable: true enum: - None - 'Internal only' - 'Personally identifiable information (PII)' - 'Financial data' - 'Health data (e.g. HIPAA)' - 'Model weights or AI assets' - 'Other sensitive data' description: 'Scorecard - type of data the vendor accesses' business_criticality: type: string nullable: true enum: - 'Low (vendor supports non-core functions)' - 'Medium (affects operations but is replaceable)' - 'High (critical to core services or products)' description: 'Scorecard - how critical the vendor is to operations' past_issues: type: string nullable: true enum: - None - 'Minor incident (e.g. small delay, minor bug)' - 'Major incident (e.g. data breach, legal issue)' description: 'Scorecard - history of past incidents' regulatory_exposure: type: string nullable: true enum: - None - 'GDPR (EU)' - 'HIPAA (US)' - 'SOC 2' - 'ISO 27001' - 'EU AI act' - 'CCPA (california)' - Other description: 'Scorecard - applicable regulatory framework' risk_score: type: integer nullable: true description: 'Computed risk score for the vendor' created_at: type: string format: date-time description: 'Creation timestamp (ISO 8601)' updated_at: type: string format: date-time description: 'Last update timestamp (ISO 8601)' required: - vendor_name - vendor_provides - assignee - website - vendor_contact_person VendorWithReviewerName: allOf: - $ref: '#/components/schemas/Vendor' - type: object properties: reviewer_name: type: string description: 'Full name of the reviewer (joined from users table)' example: 'John Smith' VendorInput: type: object required: - vendor_name - vendor_provides - assignee - website - vendor_contact_person properties: vendor_name: type: string description: 'Name of the vendor (required, non-empty)' vendor_provides: type: string description: 'What the vendor provides (required, non-empty)' assignee: type: integer minimum: 1 description: 'User ID of the assigned owner (required, >= 1)' website: type: string description: 'Vendor website URL (required, non-empty)' vendor_contact_person: type: string description: 'Name of the vendor contact (required, non-empty)' review_result: type: string description: 'Free-text review result summary' review_status: type: string enum: - 'Not started' - 'In review' - Reviewed - 'Requires follow-up' description: 'Current review lifecycle status' reviewer: type: integer minimum: 1 description: 'User ID of the reviewer' review_date: type: string format: date-time description: 'Date of the review (ISO 8601)' order_no: type: integer description: 'Display order number' is_demo: type: boolean default: false description: 'Mark as demo vendor' projects: type: array items: type: integer description: 'Array of project IDs to associate' data_sensitivity: type: string enum: - None - 'Internal only' - 'Personally identifiable information (PII)' - 'Financial data' - 'Health data (e.g. HIPAA)' - 'Model weights or AI assets' - 'Other sensitive data' business_criticality: type: string enum: - 'Low (vendor supports non-core functions)' - 'Medium (affects operations but is replaceable)' - 'High (critical to core services or products)' past_issues: type: string enum: - None - 'Minor incident (e.g. small delay, minor bug)' - 'Major incident (e.g. data breach, legal issue)' regulatory_exposure: type: string enum: - None - 'GDPR (EU)' - 'HIPAA (US)' - 'SOC 2' - 'ISO 27001' - 'EU AI act' - 'CCPA (california)' - Other risk_score: type: integer description: 'Computed risk score' VendorUpdate: type: object description: 'All fields are optional. Only provided fields are updated. Review and scorecard fields can be set to null to clear them.' properties: vendor_name: type: string vendor_provides: type: string assignee: type: integer minimum: 1 website: type: string vendor_contact_person: type: string review_result: type: string nullable: true review_status: type: string nullable: true enum: - 'Not started' - 'In review' - Reviewed - 'Requires follow-up' reviewer: type: integer nullable: true review_date: type: string format: date-time nullable: true order_no: type: integer projects: type: array items: type: integer data_sensitivity: type: string nullable: true enum: - None - 'Internal only' - 'Personally identifiable information (PII)' - 'Financial data' - 'Health data (e.g. HIPAA)' - 'Model weights or AI assets' - 'Other sensitive data' business_criticality: type: string nullable: true enum: - 'Low (vendor supports non-core functions)' - 'Medium (affects operations but is replaceable)' - 'High (critical to core services or products)' past_issues: type: string nullable: true enum: - None - 'Minor incident (e.g. small delay, minor bug)' - 'Major incident (e.g. data breach, legal issue)' regulatory_exposure: type: string nullable: true enum: - None - 'GDPR (EU)' - 'HIPAA (US)' - 'SOC 2' - 'ISO 27001' - 'EU AI act' - 'CCPA (california)' - Other risk_score: type: integer nullable: true ModelInventoryStatus: type: string enum: - Approved - Restricted - Pending - Blocked - Rejected - Retired description: 'Current approval/review status of the model' ModelInventoryType: type: string enum: - 'Traditional ML' - GenAI - RAG - 'Agentic AI' nullable: true description: 'Classification of the model AI paradigm (optional)' Filedata: type: object description: 'Metadata for an uploaded security-assessment file' properties: id: type: integer description: 'File record ID' filename: type: string description: 'Original file name' size: type: integer description: 'File size in bytes' mimetype: type: string description: 'MIME type (e.g. application/pdf)' upload_date: type: string format: date-time description: 'ISO 8601 upload timestamp' uploaded_by: type: integer description: 'User ID who uploaded the file' required: - id - filename - size - mimetype - upload_date - uploaded_by ModelInventoryResponse: type: object description: 'Model inventory record as returned by the API' properties: id: type: integer description: 'Auto-generated primary key' example: 42 provider_model: type: string nullable: true description: 'Legacy combined provider+model field (backward compatibility)' example: 'OpenAI / GPT-4' provider: type: string description: 'Model provider name' example: OpenAI model: type: string description: 'Model name' example: GPT-4 version: type: string description: 'Model version identifier' example: turbo-2024-04-09 approver: type: integer nullable: true description: 'User ID of the assigned approver' example: 7 capabilities: type: array items: type: string description: "List of capability strings. Stored as comma-separated text in the DB, returned as an array.\n" example: - 'Text Generation' - 'Code Generation' - Reasoning security_assessment: type: boolean description: 'Whether a security assessment has been completed' example: false status: $ref: '#/components/schemas/ModelInventoryStatus' status_date: type: string format: date-time description: 'ISO 8601 timestamp of the last status change' example: '2026-04-15T10:30:00.000Z' type: $ref: '#/components/schemas/ModelInventoryType' reference_link: type: string nullable: true description: 'URL to external model documentation or model card' example: 'https://platform.openai.com/docs/models/gpt-4' biases: type: string description: 'Known biases of the model' example: 'May reflect biases present in training data' limitations: type: string description: 'Known limitations of the model' example: 'Knowledge cutoff, potential hallucinations' hosting_provider: type: string description: 'Where the model is hosted' example: 'Azure OpenAI' security_assessment_data: type: array items: $ref: '#/components/schemas/Filedata' description: 'Uploaded security assessment file metadata' is_demo: type: boolean description: 'Whether this is a demo/sample record' example: false created_at: type: string format: date-time description: 'ISO 8601 creation timestamp' example: '2026-04-10T08:00:00.000Z' updated_at: type: string format: date-time description: 'ISO 8601 last-updated timestamp' example: '2026-04-15T10:30:00.000Z' projects: type: array items: type: integer description: 'IDs of projects this model is associated with' example: - 1 - 3 frameworks: type: array items: type: integer description: 'IDs of frameworks this model is associated with' example: - 5 ModelInventoryCreateRequest: type: object description: 'Request body for creating a new model inventory record' required: - provider - model - version - capabilities - status - status_date - reference_link - biases - limitations - hosting_provider properties: provider_model: type: string description: 'Legacy combined provider+model field (optional, backward compatibility)' example: 'OpenAI / GPT-4' provider: type: string description: 'Model provider name' example: OpenAI model: type: string description: 'Model name' example: GPT-4 version: type: string description: 'Model version identifier' example: turbo-2024-04-09 approver: type: integer nullable: true description: 'User ID of the assigned approver' example: 7 capabilities: oneOf: - type: string description: 'Comma-separated capabilities' - type: array items: type: string description: 'Array of capability strings' description: "Accepted as either a comma-separated string or an array of strings. Arrays are joined with \", \" before storage.\n" example: - 'Text Generation' - 'Code Generation' security_assessment: type: boolean description: 'Whether a security assessment has been completed' default: false status: $ref: '#/components/schemas/ModelInventoryStatus' status_date: type: string format: date-time description: 'ISO 8601 timestamp for the status' example: '2026-04-15T10:30:00.000Z' type: $ref: '#/components/schemas/ModelInventoryType' reference_link: type: string description: 'URL to external model documentation or model card' example: 'https://platform.openai.com/docs/models/gpt-4' biases: type: string description: 'Known biases of the model' example: 'May reflect biases present in training data' limitations: type: string description: 'Known limitations of the model' example: 'Knowledge cutoff, potential hallucinations' hosting_provider: type: string description: 'Where the model is hosted' example: 'Azure OpenAI' security_assessment_data: type: array items: $ref: '#/components/schemas/Filedata' description: 'Uploaded security assessment file metadata' default: [] is_demo: type: boolean description: 'Whether this is a demo/sample record' default: false projects: type: array items: type: integer description: 'Project IDs to associate with this model' default: [] example: - 1 - 3 frameworks: type: array items: type: integer description: 'Framework IDs to associate with this model' default: [] example: - 5 ModelInventoryUpdateRequest: type: object description: "Request body for updating a model inventory record. All fields are optional; only provided fields are modified.\n" properties: provider_model: type: string description: 'Legacy combined provider+model field' provider: type: string description: 'Model provider name' model: type: string description: 'Model name' version: type: string description: 'Model version identifier' approver: type: integer nullable: true description: 'User ID of the assigned approver' capabilities: oneOf: - type: string - type: array items: type: string description: 'Capabilities (string or array)' security_assessment: type: boolean description: 'Whether a security assessment has been completed' status: $ref: '#/components/schemas/ModelInventoryStatus' status_date: type: string format: date-time description: 'ISO 8601 timestamp for the status' type: $ref: '#/components/schemas/ModelInventoryType' reference_link: type: string description: 'URL to external model documentation' biases: type: string description: 'Known biases of the model' limitations: type: string description: 'Known limitations of the model' hosting_provider: type: string description: 'Where the model is hosted' security_assessment_data: type: array items: $ref: '#/components/schemas/Filedata' description: 'Uploaded security assessment file metadata' is_demo: type: boolean description: 'Whether this is a demo/sample record' projects: type: array items: type: integer description: "Project IDs to associate. When provided (even empty), replaces all existing project associations.\n" frameworks: type: array items: type: integer description: "Framework IDs to associate. When provided (even empty), replaces all existing framework associations.\n" deleteProjects: type: boolean description: "When true, clears all project associations even if projects array is empty. Used to force-delete associations without providing replacements.\n" default: false deleteFrameworks: type: boolean description: "When true, clears all framework associations even if frameworks array is empty. Used to force-delete associations without providing replacements.\n" default: false PolicyWithReviewers: type: object description: 'A policy record with computed assigned reviewer IDs' properties: id: type: integer description: 'Auto-generated primary key' example: 42 organization_id: type: integer description: 'Tenant organization ID' example: 1 title: type: string description: 'Policy title' example: 'AI Ethics Policy' content_html: type: string description: 'Full policy content as HTML' example: '

AI Ethics Policy

...

' status: type: string description: 'Policy lifecycle status' example: draft tags: type: array items: type: string enum: - 'AI ethics' - Fairness - Transparency - Explainability - 'Bias mitigation' - Privacy - 'Data governance' - 'Model risk' - Accountability - Security - LLM - 'Human oversight' - 'EU AI Act' - 'ISO 42001' - 'NIST RMF' - 'Red teaming' - Audit - Monitoring - 'Vendor management' description: 'Categorization tags' next_review_date: type: string format: date-time nullable: true description: 'Scheduled next review date' author_id: type: integer description: 'User ID of the policy creator' example: 1 last_updated_by: type: integer description: 'User ID of the last editor' example: 1 last_updated_at: type: string format: date-time description: 'Timestamp of last update' review_status: type: string nullable: true enum: - pending_review - approved - changes_requested - null description: 'Current review workflow status' review_comment: type: string nullable: true description: 'Most recent review comment' reviewed_by: type: integer nullable: true description: 'User ID of the last reviewer' reviewed_at: type: string format: date-time nullable: true description: 'Timestamp of last review action' is_demo: type: boolean description: 'Whether this is a demo/seed policy' default: false created_at: type: string format: date-time description: 'Row creation timestamp (set by database)' assigned_reviewer_ids: type: array items: type: integer description: 'User IDs of assigned reviewers (aggregated from mapping table)' example: - 2 - 5 PolicyCreateRequest: type: object required: - title - content_html - status properties: title: type: string description: 'Policy title' example: 'Data Governance Policy' content_html: type: string description: 'Full policy content as HTML' example: '

Data Governance

This policy outlines...

' status: type: string description: 'Initial policy status' example: draft tags: type: array items: type: string description: 'Categorization tags (must be from the allowed tag list)' example: - 'Data governance' - Privacy next_review_date: type: string format: date-time nullable: true description: 'Scheduled next review date' example: '2026-07-01T00:00:00.000Z' assigned_reviewer_ids: type: array items: type: integer description: 'User IDs to assign as reviewers' example: - 2 - 5 is_demo: type: boolean description: 'Mark as a demo policy' default: false PolicyUpdateRequest: type: object description: 'All fields are optional. Only provided fields are updated.' properties: title: type: string description: 'Updated policy title' content_html: type: string description: 'Updated policy content as HTML' status: type: string description: 'Updated policy status' tags: type: array items: type: string description: 'Replacement tag list (must be from the allowed tag list)' next_review_date: type: string format: date-time nullable: true description: 'Updated next review date' assigned_reviewer_ids: type: array items: type: integer description: 'Replacement reviewer list (fully replaces existing reviewers)' ProjectRiskInput: type: object required: - risk_name - risk_owner - risk_description properties: risk_name: type: string description: 'Name/title of the risk.' risk_owner: type: integer description: 'User ID of the risk owner (must be >= 1).' ai_lifecycle_phase: type: string enum: - 'Problem definition & planning' - 'Data collection & processing' - 'Model development & training' - 'Model validation & testing' - 'Deployment & integration' - 'Monitoring & maintenance' - 'Decommissioning & retirement' - null nullable: true risk_description: type: string description: 'Detailed description of the risk.' nullable: true risk_category: type: array items: type: string description: 'Array of category labels.' impact: type: string nullable: true assessment_mapping: type: string nullable: true controls_mapping: type: string nullable: true likelihood: type: string enum: - Rare - Unlikely - Possible - Likely - 'Almost Certain' - null nullable: true severity: type: string enum: - Negligible - Minor - Moderate - Major - Catastrophic - null nullable: true risk_level_autocalculated: type: string enum: - 'No risk' - 'Very low risk' - 'Low risk' - 'Medium risk' - 'High risk' - 'Very high risk' - null nullable: true review_notes: type: string nullable: true mitigation_status: type: string enum: - 'Not Started' - 'In Progress' - Completed - 'On Hold' - Deferred - Canceled - 'Requires review' - null nullable: true current_risk_level: type: string enum: - 'No risk' - 'Very low risk' - 'Low risk' - 'Medium risk' - 'High risk' - 'Very high risk' - null nullable: true deadline: type: string format: date-time nullable: true mitigation_plan: type: string nullable: true implementation_strategy: type: string nullable: true mitigation_evidence_document: type: string nullable: true likelihood_mitigation: type: string enum: - Rare - Unlikely - Possible - Likely - 'Almost Certain' - null nullable: true risk_severity: type: string enum: - Negligible - Minor - Moderate - Major - Critical - null nullable: true final_risk_level: type: string nullable: true risk_approval: type: integer description: 'User ID of the approver.' nullable: true approval_status: type: string nullable: true date_of_assessment: type: string format: date-time nullable: true is_demo: type: boolean default: false projects: type: array items: type: integer description: 'Array of project IDs to link this risk to.' frameworks: type: array items: type: integer description: 'Array of framework IDs to link this risk to.' event_frequency_min: type: number nullable: true event_frequency_likely: type: number nullable: true event_frequency_max: type: number nullable: true loss_regulatory_min: type: number nullable: true loss_regulatory_likely: type: number nullable: true loss_regulatory_max: type: number nullable: true loss_operational_min: type: number nullable: true loss_operational_likely: type: number nullable: true loss_operational_max: type: number nullable: true loss_litigation_min: type: number nullable: true loss_litigation_likely: type: number nullable: true loss_litigation_max: type: number nullable: true loss_reputational_min: type: number nullable: true loss_reputational_likely: type: number nullable: true loss_reputational_max: type: number nullable: true control_effectiveness: type: number nullable: true description: 'Percentage 0-100.' mitigation_cost_annual: type: number nullable: true benchmark_id: type: integer nullable: true currency: type: string nullable: true default: USD maxLength: 3 ProjectRiskResponse: allOf: - $ref: '#/components/schemas/ProjectRiskInput' - type: object properties: id: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time total_loss_likely: type: number nullable: true ale_estimate: type: number nullable: true residual_ale: type: number nullable: true roi_percentage: type: number nullable: true projects: type: array items: type: integer frameworks: type: array items: type: integer subClauses: type: array items: type: object annexCategories: type: array items: type: object controls: type: array items: type: object assessments: type: array items: type: object annexControls_27001: type: array items: type: object subClauses_27001: type: array items: type: object organization_id: type: integer nullable: true is_deleted: type: boolean deleted_at: type: string format: date-time nullable: true custom_fields: type: array items: type: object VendorRiskInput: type: object required: - vendor_id - risk_description - impact_description - likelihood - risk_severity - action_plan - action_owner - risk_level properties: vendor_id: type: integer description: 'ID of the vendor this risk belongs to.' order_no: type: integer nullable: true description: 'Optional ordering number.' risk_description: type: string impact_description: type: string likelihood: type: string enum: - Rare - Unlikely - Possible - Likely - 'Almost certain' risk_severity: type: string enum: - Negligible - Minor - Moderate - Major - Catastrophic action_plan: type: string action_owner: type: integer description: 'User ID of the action owner.' risk_level: type: string description: 'Free-text risk level.' is_demo: type: boolean default: false VendorRiskResponse: type: object properties: id: type: integer vendor_id: type: integer order_no: type: integer nullable: true risk_description: type: string impact_description: type: string impact: type: string nullable: true likelihood: type: string enum: - Rare - Unlikely - Possible - Likely - 'Almost certain' risk_severity: type: string enum: - Negligible - Minor - Moderate - Major - Catastrophic action_plan: type: string action_owner: type: integer risk_level: type: string is_demo: type: boolean created_at: type: string format: date-time updated_at: type: string format: date-time VendorRiskAllProjectsResponse: description: 'Extended vendor risk with joined vendor/project info.' type: object properties: risk_id: type: integer vendor_id: type: integer order_no: type: integer nullable: true risk_description: type: string impact_description: type: string likelihood: type: string risk_severity: type: string action_plan: type: string action_owner: type: integer risk_level: type: string is_demo: type: boolean created_at: type: string format: date-time updated_at: type: string format: date-time is_deleted: type: boolean deleted_at: type: string format: date-time nullable: true vendor_name: type: string project_id: type: integer nullable: true project_title: type: string nullable: true ModelRiskInput: type: object required: - risk_name - risk_category - risk_level - owner - target_date properties: risk_name: type: string risk_category: type: string enum: - Performance - 'Bias & Fairness' - Security - 'Data Quality' - Compliance risk_level: type: string enum: - Low - Medium - High - Critical status: type: string enum: - Open - 'In Progress' - Resolved - Accepted default: Open owner: type: string description: 'Name or identifier of the risk owner.' target_date: type: string format: date description: 'Next review / target date.' description: type: string mitigation_plan: type: string impact: type: string likelihood: type: string key_metrics: type: string current_values: type: string threshold: type: string model_id: type: integer nullable: true description: 'ID of the model inventory entry this risk is linked to.' is_demo: type: boolean default: false ModelRiskResponse: type: object properties: id: type: integer risk_name: type: string risk_category: type: string enum: - Performance - 'Bias & Fairness' - Security - 'Data Quality' - Compliance risk_level: type: string enum: - Low - Medium - High - Critical status: type: string enum: - Open - 'In Progress' - Resolved - Accepted owner: type: string target_date: type: string format: date description: type: string mitigation_plan: type: string impact: type: string likelihood: type: string key_metrics: type: string current_values: type: string threshold: type: string model_id: type: integer nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time SuccessResponse: type: object properties: status: type: string example: success data: description: 'Response payload (type varies per endpoint)' ValidationErrorResponse: type: object properties: status: type: string example: error message: type: string example: 'Dataset creation validation failed' errors: type: array items: type: object properties: field: type: string message: type: string code: type: string Evidence: type: object properties: id: type: integer evidence_name: type: string evidence_type: type: string description: type: string nullable: true evidence_files: type: array items: $ref: '#/components/schemas/FileResponse' expiry_date: type: string format: date-time nullable: true mapped_model_ids: type: array items: type: integer nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time FileResponse: type: object properties: id: oneOf: - type: string - type: integer filename: type: string size: oneOf: - type: number - type: string mimetype: type: string uploaded_by: type: integer upload_date: type: string EvidenceCreateRequest: type: object required: - evidence_name - evidence_type properties: evidence_name: type: string maxLength: 255 evidence_type: type: string maxLength: 100 description: type: string nullable: true evidence_files: type: array items: type: object properties: id: oneOf: - {type: string} - {type: integer} description: 'Array of file references (by ID) to link' expiry_date: type: string format: date-time nullable: true mapped_model_ids: type: array items: type: integer description: 'Model inventory IDs to map this evidence to' EvidenceUpdateRequest: type: object properties: evidence_name: type: string maxLength: 255 evidence_type: type: string maxLength: 100 description: type: string nullable: true evidence_files: type: array items: type: object properties: id: oneOf: - {type: string} - {type: integer} description: 'New files to link' deleteFiles: type: array items: oneOf: - type: string - type: integer description: 'File IDs to unlink' expiry_date: type: string format: date-time nullable: true mapped_model_ids: type: array items: type: integer Dataset: type: object properties: id: type: integer name: type: string description: type: string version: type: string owner: type: string type: type: string enum: - training - validation - testing - production - reference - synthetic function: type: string source: type: string license: type: string nullable: true format: type: string nullable: true classification: type: string enum: - public - internal - confidential - restricted contains_pii: type: boolean pii_types: type: string nullable: true status: type: string enum: - draft - active - deprecated - archived status_date: type: string format: date-time known_biases: type: string nullable: true bias_mitigation: type: string nullable: true collection_method: type: string nullable: true preprocessing_steps: type: string nullable: true documentation_data: type: array items: $ref: '#/components/schemas/DocumentationFile' is_demo: type: boolean created_at: type: string format: date-time updated_at: type: string format: date-time models: type: array items: type: integer description: 'Related model inventory IDs' projects: type: array items: type: integer description: 'Related project IDs' DocumentationFile: type: object description: 'File metadata stored in JSONB documentation_data column' properties: id: type: string filename: type: string size: type: number mimetype: type: string DatasetCreateRequest: type: object required: - name - description - version - owner - type - function - source - classification - contains_pii - status properties: name: type: string maxLength: 255 description: type: string version: type: string maxLength: 50 owner: type: string maxLength: 255 type: type: string enum: - training - validation - testing - production - reference - synthetic function: type: string source: type: string maxLength: 255 license: type: string maxLength: 255 format: type: string maxLength: 100 classification: type: string enum: - public - internal - confidential - restricted contains_pii: type: boolean pii_types: type: string status: type: string enum: - draft - active - deprecated - archived status_date: type: string format: date-time description: 'Defaults to current time if omitted' known_biases: type: string bias_mitigation: type: string collection_method: type: string preprocessing_steps: type: string documentation_data: type: array items: $ref: '#/components/schemas/DocumentationFile' is_demo: type: boolean default: false models: type: array items: type: integer description: 'Model inventory IDs to associate' projects: type: array items: type: integer description: 'Project IDs to associate' DatasetUpdateRequest: type: object description: 'All fields optional. Only provided fields are updated.' properties: name: type: string maxLength: 255 description: type: string version: type: string maxLength: 50 owner: type: string maxLength: 255 type: type: string enum: - training - validation - testing - production - reference - synthetic function: type: string source: type: string maxLength: 255 license: type: string maxLength: 255 format: type: string maxLength: 100 classification: type: string enum: - public - internal - confidential - restricted contains_pii: type: boolean pii_types: type: string status: type: string enum: - draft - active - deprecated - archived status_date: type: string format: date-time known_biases: type: string bias_mitigation: type: string collection_method: type: string preprocessing_steps: type: string documentation_data: type: array items: $ref: '#/components/schemas/DocumentationFile' is_demo: type: boolean models: type: array items: type: integer description: 'Replace model associations (provide full list)' projects: type: array items: type: integer description: 'Replace project associations (provide full list)' deleteModels: type: boolean description: 'If true, remove all model associations (even if models array is empty)' deleteProjects: type: boolean description: 'If true, remove all project associations (even if projects array is empty)' DatasetChangeHistoryEntry: type: object properties: id: type: integer dataset_id: type: integer change_type: type: string description: 'e.g. created, deleted, field_change' field_name: type: string nullable: true old_value: type: string nullable: true new_value: type: string nullable: true changed_by: type: integer nullable: true created_at: type: string format: date-time AutomationTrigger: type: object properties: id: type: integer key: type: string description: 'Machine-readable trigger identifier' label: type: string description: 'Human-readable name' event_name: type: string description: type: string nullable: true AutomationAction: type: object properties: id: type: integer key: type: string description: 'Machine-readable action identifier' label: type: string description: 'Human-readable name' description: type: string nullable: true default_params: type: object nullable: true description: 'Default parameters for this action type' Automation: type: object properties: id: type: integer name: type: string trigger_id: type: integer params: type: object description: 'Trigger-specific parameters (JSON)' is_active: type: boolean created_by: type: integer nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time AutomationWithActions: allOf: - $ref: '#/components/schemas/Automation' - type: object properties: actions: type: array items: $ref: '#/components/schemas/TenantAutomationAction' TenantAutomationAction: type: object properties: id: type: integer automation_id: type: integer action_type_id: type: integer params: type: object nullable: true description: 'Action-specific parameters (JSON)' order: type: integer description: 'Execution order (1-based)' AutomationCreateRequest: type: object required: - triggerId - name - actions properties: triggerId: type: integer description: 'ID of the automation trigger' name: type: string description: 'Automation name' params: type: string description: 'JSON-encoded trigger parameters (parsed server-side)' default: '{}' actions: type: array minItems: 1 items: type: object required: - action_type_id properties: action_type_id: type: integer description: 'ID of the action type' params: type: object nullable: true description: 'Action-specific parameters' AutomationUpdateRequest: type: object properties: name: type: string triggerId: type: integer params: type: string description: 'JSON-encoded trigger parameters' default: '{}' is_active: type: boolean actions: type: array items: type: object required: - action_type_id properties: action_type_id: type: integer params: type: object nullable: true description: 'If provided, replaces all existing actions' AutomationHistoryResponse: type: object properties: logs: type: array items: type: object properties: id: type: integer automation_id: type: integer status: type: string triggered_at: type: string format: date-time completed_at: type: string format: date-time nullable: true actions: type: array items: type: object description: 'Per-action execution results' total: type: integer description: 'Total number of log entries' limit: type: integer offset: type: integer AutomationStats: type: object description: 'Aggregated execution statistics for an automation' properties: total_executions: type: integer successful: type: integer failed: type: integer last_executed_at: type: string format: date-time ApiResponse: type: object properties: statusCode: type: integer data: description: 'Response payload (varies by endpoint)' Pagination: type: object properties: total: type: integer page: type: integer limit: type: integer total_pages: type: integer ScanStatus: type: string enum: - pending - cloning - scanning - completed - failed - cancelled ScanMode: type: string enum: - full - incremental FindingStatus: type: string enum: - active - fixed - carried_forward FindingType: type: string enum: - library - dependency - api_call - secret - model_ref - rag_component - agent - prompt_injection - pii_exposure - excessive_agency - jailbreak_risk - training_data_poisoning - model_dos - supply_chain - insecure_plugin - overreliance - model_theft ConfidenceLevel: type: string enum: - high - medium - low RiskLevel: type: string enum: - high - medium - low GovernanceStatus: type: string enum: - reviewed - approved - flagged nullable: true LicenseRiskLevel: type: string enum: - high - medium - low - unknown StartScanRequest: type: object required: - repository_url properties: repository_url: type: string description: 'GitHub repository URL' example: 'https://github.com/owner/repo' scan_mode: $ref: '#/components/schemas/ScanMode' base_commit_sha: type: string pattern: '^[0-9a-fA-F]{7,40}$' description: 'Required for incremental scans' head_commit_sha: type: string pattern: '^[0-9a-fA-F]{7,40}$' description: 'Required for incremental scans' ScanStatusResponse: type: object properties: id: type: integer status: $ref: '#/components/schemas/ScanStatus' progress: type: number format: float current_file: type: string files_scanned: type: integer total_files: type: integer nullable: true findings_count: type: integer error_message: type: string nullable: true TriggeredByUser: type: object properties: id: type: integer name: type: string surname: type: string ScanResponse: type: object properties: scan: type: object properties: id: type: integer repository_url: type: string repository_owner: type: string repository_name: type: string status: $ref: '#/components/schemas/ScanStatus' findings_count: type: integer files_scanned: type: integer started_at: type: string format: date-time nullable: true completed_at: type: string format: date-time nullable: true duration_ms: type: integer nullable: true error_message: type: string nullable: true triggered_by: $ref: '#/components/schemas/TriggeredByUser' risk_score: type: number nullable: true risk_score_grade: type: string nullable: true risk_score_details: type: object nullable: true risk_score_calculated_at: type: string format: date-time nullable: true scan_mode: $ref: '#/components/schemas/ScanMode' base_commit_sha: type: string nullable: true head_commit_sha: type: string nullable: true baseline_scan_id: type: integer nullable: true changed_files_count: type: integer nullable: true created_at: type: string format: date-time summary: $ref: '#/components/schemas/ScanSummary' ScanSummary: type: object properties: total: type: integer by_confidence: type: object properties: high: type: integer medium: type: integer low: type: integer by_provider: type: object additionalProperties: type: integer ScanListItem: type: object properties: id: type: integer repository_url: type: string repository_owner: type: string repository_name: type: string status: $ref: '#/components/schemas/ScanStatus' findings_count: type: integer files_scanned: type: integer started_at: type: string format: date-time nullable: true completed_at: type: string format: date-time nullable: true duration_ms: type: integer nullable: true triggered_by: $ref: '#/components/schemas/TriggeredByUser' risk_score: type: number nullable: true risk_score_grade: type: string nullable: true scan_mode: $ref: '#/components/schemas/ScanMode' baseline_scan_id: type: integer nullable: true changed_files_count: type: integer nullable: true created_at: type: string format: date-time ScansResponse: type: object properties: scans: type: array items: $ref: '#/components/schemas/ScanListItem' pagination: $ref: '#/components/schemas/Pagination' CancelScanResponse: type: object properties: id: type: integer status: type: string enum: - cancelled message: type: string DeleteScanResponse: type: object properties: message: type: string FilePath: type: object properties: path: type: string line_number: type: integer nullable: true matched_text: type: string Finding: type: object properties: id: type: integer finding_type: $ref: '#/components/schemas/FindingType' category: type: string name: type: string provider: type: string confidence: $ref: '#/components/schemas/ConfidenceLevel' risk_level: $ref: '#/components/schemas/RiskLevel' description: type: string nullable: true documentation_url: type: string nullable: true file_count: type: integer file_paths: type: array items: $ref: '#/components/schemas/FilePath' governance_status: $ref: '#/components/schemas/GovernanceStatus' governance_updated_at: type: string format: date-time nullable: true governance_updated_by: type: integer nullable: true license_id: type: string nullable: true license_name: type: string nullable: true license_risk: $ref: '#/components/schemas/LicenseRiskLevel' license_source: type: string enum: - package - huggingface - pypi - npm - manual nullable: true mitigation: type: string nullable: true data_flow_summary: type: string nullable: true vulnerability_details: type: object nullable: true finding_status: $ref: '#/components/schemas/FindingStatus' FindingsResponse: type: object properties: findings: type: array items: $ref: '#/components/schemas/Finding' pagination: $ref: '#/components/schemas/Pagination' UpdateGovernanceStatusRequest: type: object properties: governance_status: type: string enum: - reviewed - approved - flagged nullable: true description: 'Set to null to clear governance status' UpdateGovernanceStatusResponse: type: object properties: id: type: integer governance_status: type: string nullable: true governance_updated_at: type: string format: date-time governance_updated_by: type: integer RiskScoreResponse: type: object properties: score: type: number nullable: true grade: type: string nullable: true details: type: object nullable: true calculated_at: type: string format: date-time nullable: true DimensionWeights: type: object properties: data_sovereignty: type: number minimum: 0 maximum: 1 transparency: type: number minimum: 0 maximum: 1 security: type: number minimum: 0 maximum: 1 autonomy: type: number minimum: 0 maximum: 1 supply_chain: type: number minimum: 0 maximum: 1 description: 'All values must sum to 1.0' VulnerabilityTypesEnabled: type: object properties: prompt_injection: type: boolean pii_exposure: type: boolean excessive_agency: type: boolean jailbreak_risk: type: boolean training_data_poisoning: type: boolean model_dos: type: boolean supply_chain: type: boolean insecure_plugin: type: boolean overreliance: type: boolean model_theft: type: boolean RiskScoringConfig: type: object properties: id: type: integer nullable: true llm_enabled: type: boolean llm_key_id: type: integer nullable: true dimension_weights: $ref: '#/components/schemas/DimensionWeights' vulnerability_scan_enabled: type: boolean vulnerability_types_enabled: $ref: '#/components/schemas/VulnerabilityTypesEnabled' updated_by: type: integer nullable: true updated_at: type: string format: date-time nullable: true UpdateRiskScoringConfigRequest: type: object properties: llm_enabled: type: boolean llm_key_id: type: integer nullable: true dimension_weights: $ref: '#/components/schemas/DimensionWeights' vulnerability_scan_enabled: type: boolean vulnerability_types_enabled: $ref: '#/components/schemas/VulnerabilityTypesEnabled' DependencyGraphResponse: type: object properties: nodes: type: array items: type: object properties: id: type: string label: type: string type: type: string metadata: type: object edges: type: array items: type: object properties: source: type: string target: type: string relationship: type: string metadata: type: object ComplianceMappingResponse: type: object properties: mappings: type: array items: type: object checklist: type: array items: type: object summary: type: object Repository: type: object properties: id: type: integer repository_url: type: string repository_owner: type: string repository_name: type: string display_name: type: string nullable: true default_branch: type: string github_token_id: type: integer nullable: true schedule_enabled: type: boolean schedule_frequency: type: string enum: - daily - weekly - monthly nullable: true schedule_day_of_week: type: integer minimum: 0 maximum: 6 nullable: true schedule_day_of_month: type: integer minimum: 1 maximum: 31 nullable: true schedule_hour: type: integer minimum: 0 maximum: 23 schedule_minute: type: integer minimum: 0 maximum: 59 webhook_secret: type: string nullable: true ci_enabled: type: boolean ci_min_score: type: number ci_max_critical: type: integer ci_post_comments: type: boolean ci_status_checks: type: boolean last_scan_id: type: integer nullable: true last_scan_status: type: string nullable: true last_scan_at: type: string format: date-time nullable: true next_scan_at: type: string format: date-time nullable: true is_enabled: type: boolean created_by: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time CreateRepositoryRequest: type: object required: - repository_url properties: repository_url: type: string description: 'GitHub repository URL' example: 'https://github.com/owner/repo' display_name: type: string nullable: true default_branch: type: string default: main github_token_id: type: integer nullable: true schedule_enabled: type: boolean default: false schedule_frequency: type: string enum: - daily - weekly - monthly description: 'Required when schedule_enabled is true' schedule_day_of_week: type: integer minimum: 0 maximum: 6 description: 'Required for weekly schedule (0=Sunday)' schedule_day_of_month: type: integer minimum: 1 maximum: 31 description: 'Required for monthly schedule' schedule_hour: type: integer minimum: 0 maximum: 23 default: 2 schedule_minute: type: integer minimum: 0 maximum: 59 default: 0 UpdateRepositoryRequest: type: object properties: display_name: type: string nullable: true default_branch: type: string github_token_id: type: integer nullable: true schedule_enabled: type: boolean schedule_frequency: type: string enum: - daily - weekly - monthly schedule_day_of_week: type: integer minimum: 0 maximum: 6 schedule_day_of_month: type: integer minimum: 1 maximum: 31 schedule_hour: type: integer minimum: 0 maximum: 23 schedule_minute: type: integer minimum: 0 maximum: 59 is_enabled: type: boolean ci_enabled: type: boolean ci_min_score: type: number ci_max_critical: type: integer ci_post_comments: type: boolean ci_status_checks: type: boolean RepositoryListResponse: type: object properties: repositories: type: array items: $ref: '#/components/schemas/Repository' pagination: $ref: '#/components/schemas/Pagination' AITrustCentreOverview: type: object description: 'Full overview with all sections' properties: intro: type: object properties: id: type: integer purpose_visible: type: boolean purpose_text: type: string our_statement_visible: type: boolean our_statement_text: type: string our_mission_visible: type: boolean our_mission_text: type: string compliance_badges: type: object properties: id: type: integer soc2_type_i: type: boolean soc2_type_ii: type: boolean iso_27001: type: boolean iso_42001: type: boolean ccpa: type: boolean gdpr: type: boolean hipaa: type: boolean eu_ai_act: type: boolean company_description: type: object properties: id: type: integer background_visible: type: boolean background_text: type: string core_benefits_visible: type: boolean core_benefits_text: type: string compliance_doc_visible: type: boolean compliance_doc_text: type: string terms_and_contact: type: object properties: id: type: integer terms_visible: type: boolean terms_text: type: string privacy_visible: type: boolean privacy_text: type: string email_visible: type: boolean email_text: type: string info: type: object properties: id: type: integer title: type: string header_color: type: string visible: type: boolean intro_visible: type: boolean compliance_badges_visible: type: boolean company_description_visible: type: boolean terms_and_contact_visible: type: boolean resources_visible: type: boolean subprocessor_visible: type: boolean updated_at: type: string format: date-time AITrustCentreResource: type: object properties: id: type: integer organization_id: type: integer name: type: string description: type: string file_id: type: integer visible: type: boolean filename: type: string AITrustCentreSubprocessor: type: object properties: id: type: integer organization_id: type: integer name: type: string purpose: type: string location: type: string url: type: string CreateSubprocessorRequest: type: object required: - name - purpose - location properties: name: type: string purpose: type: string location: type: string url: type: string UpdateSubprocessorRequest: type: object properties: name: type: string purpose: type: string location: type: string url: type: string AITrustCentrePublicPage: type: object description: 'Conditionally includes sections based on visibility settings' properties: info: type: object properties: title: type: string header_color: type: string logo: type: integer nullable: true intro: type: object nullable: true properties: purpose: type: string nullable: true statement: type: string nullable: true mission: type: string nullable: true compliance_badges: type: object nullable: true properties: soc2_type_i: type: boolean soc2_type_ii: type: boolean iso_27001: type: boolean iso_42001: type: boolean ccpa: type: boolean gdpr: type: boolean hipaa: type: boolean eu_ai_act: type: boolean company_description: type: object nullable: true properties: background: type: string nullable: true core_benefits: type: string nullable: true compliance_doc: type: string nullable: true terms_and_contact: type: object nullable: true properties: terms: type: string nullable: true privacy: type: string nullable: true email: type: string nullable: true resources: type: array nullable: true items: type: object properties: id: type: integer name: type: string description: type: string file_id: type: integer visible: type: boolean subprocessors: type: array nullable: true items: type: object properties: id: type: integer name: type: string purpose: type: string location: type: string url: type: string IncidentType: type: string enum: - Malfunction - 'Unexpected behavior' - 'Model drift' - Misuse - 'Data corruption' - 'Security breach' - 'Performance degradation' IncidentSeverity: type: string enum: - Minor - Serious - 'Very serious' IncidentStatus: type: string enum: - Open - Investigating - Mitigated - Closed - Suspended - 'Emergency action' IncidentApprovalStatus: type: string enum: - Approved - Rejected - Pending - 'Not required' Incident: type: object properties: id: type: integer incident_id: type: string nullable: true ai_project: type: string type: $ref: '#/components/schemas/IncidentType' severity: $ref: '#/components/schemas/IncidentSeverity' status: $ref: '#/components/schemas/IncidentStatus' occurred_date: type: string format: date-time date_detected: type: string format: date-time reporter: type: string categories_of_harm: type: array items: type: string affected_persons_groups: type: string nullable: true description: type: string relationship_causality: type: string nullable: true immediate_mitigations: type: string nullable: true planned_corrective_actions: type: string nullable: true model_system_version: type: string nullable: true interim_report: type: boolean archived: type: boolean approval_status: $ref: '#/components/schemas/IncidentApprovalStatus' approved_by: type: string nullable: true approval_date: type: string format: date-time nullable: true approval_notes: type: string nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time CreateIncidentRequest: type: object required: - ai_project - type - severity - status - occurred_date - date_detected - reporter - approval_status - categories_of_harm - description - relationship_causality properties: ai_project: type: string type: $ref: '#/components/schemas/IncidentType' severity: $ref: '#/components/schemas/IncidentSeverity' status: $ref: '#/components/schemas/IncidentStatus' occurred_date: type: string format: date-time date_detected: type: string format: date-time reporter: type: string approval_status: $ref: '#/components/schemas/IncidentApprovalStatus' approved_by: type: string categories_of_harm: oneOf: - type: array items: type: string - type: string description: 'Comma-separated string (will be split)' affected_persons_groups: type: string description: type: string relationship_causality: type: string immediate_mitigations: type: string planned_corrective_actions: type: string model_system_version: type: string interim_report: type: boolean default: false archived: type: boolean default: false approval_date: type: string format: date-time approval_notes: type: string UpdateIncidentRequest: type: object description: 'All fields are optional; only provided fields are updated.' properties: ai_project: type: string type: $ref: '#/components/schemas/IncidentType' severity: $ref: '#/components/schemas/IncidentSeverity' status: $ref: '#/components/schemas/IncidentStatus' occurred_date: type: string format: date-time date_detected: type: string format: date-time reporter: type: string approval_status: $ref: '#/components/schemas/IncidentApprovalStatus' approved_by: type: string categories_of_harm: oneOf: - type: array items: type: string - type: string affected_persons_groups: type: string description: type: string relationship_causality: type: string immediate_mitigations: type: string planned_corrective_actions: type: string model_system_version: type: string interim_report: type: boolean archived: type: boolean approval_date: type: string format: date-time approval_notes: type: string Framework: type: object properties: id: type: integer name: type: string description: type: string organization_id: type: integer ISO27001Clause: type: object properties: id: type: integer arrangement: type: integer title: type: string ISO27001ClauseWithSubClauses: type: object properties: id: type: integer arrangement: type: integer title: type: string subClauses: type: array items: $ref: '#/components/schemas/ISO27001SubClause' ISO27001SubClause: type: object properties: id: type: integer subclause_meta_id: type: integer projects_frameworks_id: type: integer organization_id: type: integer status: type: string enum: - 'Not started' - Draft - 'In review' - Done owner: type: integer nullable: true reviewer: type: integer nullable: true approver: type: integer nullable: true implementation_details: type: string nullable: true evidence_links: type: array items: type: object risks_mitigated: type: array items: type: integer tags: type: array items: type: string ISO27001Annex: type: object properties: id: type: integer arrangement: type: string order_no: type: integer title: type: string ISO27001AnnexWithControls: type: object properties: id: type: integer arrangement: type: string order_no: type: integer title: type: string controls: type: array items: $ref: '#/components/schemas/ISO27001AnnexControl' ISO27001AnnexControl: type: object properties: id: type: integer annexcontrol_meta_id: type: integer projects_frameworks_id: type: integer organization_id: type: integer status: type: string enum: - 'Not started' - Draft - 'In review' - Done owner: type: integer nullable: true reviewer: type: integer nullable: true approver: type: integer nullable: true implementation_details: type: string nullable: true evidence_links: type: array items: type: object risks_mitigated: type: array items: type: integer tags: type: array items: type: string ISO27001SaveClauseRequest: type: object properties: user_id: type: string description: 'User ID for file upload attribution' project_id: type: string description: 'Project ID for file upload association' status: type: string enum: - 'Not started' - Draft - 'In review' - Done owner: type: integer nullable: true reviewer: type: integer nullable: true approver: type: integer nullable: true implementation_details: type: string tags: type: string description: 'JSON-encoded array of tag strings' delete: type: string description: 'JSON-encoded array of file IDs to unlink' risksDelete: type: string description: 'JSON-encoded array of risk IDs to remove' risksMitigated: type: string description: 'JSON-encoded array of risk IDs to add' files: type: array items: type: string format: binary description: 'Evidence files to upload' ISO27001SaveAnnexRequest: type: object properties: user_id: type: string description: 'User ID for file upload attribution' project_id: type: string description: 'Project ID for file upload association' status: type: string enum: - 'Not started' - Draft - 'In review' - Done owner: type: integer nullable: true reviewer: type: integer nullable: true approver: type: integer nullable: true implementation_details: type: string tags: type: string description: 'JSON-encoded array of tag strings' delete: type: string description: 'JSON-encoded array of file IDs to unlink' risksDelete: type: string description: 'JSON-encoded array of risk IDs to remove' risksMitigated: type: string description: 'JSON-encoded array of risk IDs to add' files: type: array items: type: string format: binary description: 'Evidence files to upload' ISO42001Clause: type: object properties: id: type: integer clause_no: type: integer title: type: string ISO42001ClauseWithSubClauses: type: object properties: id: type: integer clause_no: type: integer title: type: string subClauses: type: array items: $ref: '#/components/schemas/ISO42001SubClause' ISO42001SubClause: type: object properties: id: type: integer subclause_meta_id: type: integer projects_frameworks_id: type: integer organization_id: type: integer status: type: string enum: - 'Not started' - Draft - 'In review' - Done owner: type: integer nullable: true reviewer: type: integer nullable: true approver: type: integer nullable: true implementation_details: type: string nullable: true evidence_links: type: array items: type: object risks_mitigated: type: array items: type: integer tags: type: array items: type: string ISO42001Annex: type: object properties: id: type: integer annex_no: type: integer title: type: string ISO42001AnnexWithCategories: type: object properties: id: type: integer annex_no: type: integer title: type: string categories: type: array items: $ref: '#/components/schemas/ISO42001AnnexCategory' ISO42001AnnexCategory: type: object properties: id: type: integer annexcategory_meta_id: type: integer projects_frameworks_id: type: integer organization_id: type: integer status: type: string enum: - 'Not started' - Draft - 'In review' - Done owner: type: integer nullable: true reviewer: type: integer nullable: true approver: type: integer nullable: true implementation_details: type: string nullable: true evidence_links: type: array items: type: object risks_mitigated: type: array items: type: integer tags: type: array items: type: string ISO42001SaveClauseRequest: type: object properties: user_id: type: string project_id: type: string status: type: string enum: - 'Not started' - Draft - 'In review' - Done owner: type: integer nullable: true reviewer: type: integer nullable: true approver: type: integer nullable: true implementation_details: type: string tags: type: string description: 'JSON-encoded array of tag strings' delete: type: string description: 'JSON-encoded array of file IDs to unlink' risksDelete: type: string description: 'JSON-encoded array of risk IDs to remove' risksMitigated: type: string description: 'JSON-encoded array of risk IDs to add' files: type: array items: type: string format: binary ISO42001SaveAnnexRequest: type: object properties: user_id: type: string project_id: type: string status: type: string enum: - 'Not started' - Draft - 'In review' - Done owner: type: integer nullable: true reviewer: type: integer nullable: true approver: type: integer nullable: true implementation_details: type: string tags: type: string description: 'JSON-encoded array of tag strings' delete: type: string description: 'JSON-encoded array of file IDs to unlink' risksDelete: type: string description: 'JSON-encoded array of risk IDs to remove' risksMitigated: type: string description: 'JSON-encoded array of risk IDs to add' files: type: array items: type: string format: binary NISTFunction: type: object properties: id: type: integer title: type: string example: GOVERN description: type: string organization_id: type: integer NISTCategory: type: object properties: id: type: integer title: type: string description: type: string function_id: type: integer organization_id: type: integer NISTSubcategory: type: object properties: id: type: integer subcategory_meta_id: type: integer organization_id: type: integer status: type: string enum: - 'Not started' - Draft - 'In review' - Done owner: type: integer nullable: true reviewer: type: integer nullable: true approver: type: integer nullable: true implementation_details: type: string nullable: true evidence_links: type: array items: type: object risks_mitigated: type: array items: type: integer tags: type: array items: type: string NISTSubcategoryUpdateRequest: type: object properties: user_id: type: string description: 'User ID for file upload attribution' project_id: type: string description: 'Project ID for file upload association' status: type: string enum: - 'Not started' - Draft - 'In review' - Done owner: type: integer nullable: true reviewer: type: integer nullable: true approver: type: integer nullable: true implementation_details: type: string tags: type: string description: 'JSON-encoded array of tag strings' delete: type: string description: 'JSON-encoded array of file IDs to unlink' risksDelete: type: string description: 'JSON-encoded array of risk IDs to remove' risksMitigated: type: string description: 'JSON-encoded array of risk IDs to add' files: type: array items: type: string format: binary description: 'Evidence files to upload' NISTSubcategoryStatusUpdate: type: object required: - status properties: status: type: string enum: - 'Not started' - Draft - 'In review' - Done description: 'New status value' NISTProgress: type: object properties: totalSubcategories: type: integer doneSubcategories: type: integer NISTAssignments: type: object properties: totalSubcategories: type: integer assignedSubcategories: type: integer ComplianceScore: type: object properties: organizationId: type: integer overallScore: type: integer minimum: 0 maximum: 100 calculatedAt: type: string format: date-time modules: type: object properties: riskManagement: $ref: '#/components/schemas/ModuleScore' vendorManagement: $ref: '#/components/schemas/ModuleScore' projectGovernance: $ref: '#/components/schemas/ModuleScore' modelLifecycle: $ref: '#/components/schemas/ModuleScore' policyDocumentation: $ref: '#/components/schemas/ModuleScore' metadata: $ref: '#/components/schemas/ComplianceMetadata' ModuleScore: type: object properties: score: type: number minimum: 0 maximum: 100 weight: type: number description: 'Module weight (sums to 1.0 across all modules)' components: type: array items: $ref: '#/components/schemas/ComponentScore' totalDataPoints: type: integer qualityScore: type: number minimum: 0 maximum: 1 description: 'Data completeness indicator' ComponentScore: type: object properties: name: type: string score: type: number weight: type: number dataPoints: type: integer details: type: object description: 'Module-specific details' ComplianceMetadata: type: object properties: totalProjects: type: integer applicableProjects: type: integer lastUpdated: type: string format: date-time dataFreshness: type: object properties: risks: type: string format: date-time vendors: type: string format: date-time projects: type: string format: date-time models: type: string format: date-time policies: type: string format: date-time calculationMethod: type: string enum: - balanced_weighted_average version: type: string ComplianceDetails: allOf: - $ref: '#/components/schemas/ComplianceScore' - type: object properties: insights: type: object properties: strongestModule: type: object properties: {name: {type: string}, score: {type: number}} weakestModule: type: object properties: {name: {type: string}, score: {type: number}} improvementPriority: type: array items: {type: object, properties: {module: {type: string}, score: {type: number}, weight: {type: number}, impact: {type: number, description: '(100 - score) * weight'}}} overallTrend: type: string enum: [up, down, stable] dataQuality: type: object properties: {riskManagement: {type: number}, vendorManagement: {type: number}, projectGovernance: {type: number}, modelLifecycle: {type: number}, policyDocumentation: {type: number}} AssignmentResponse: type: object properties: total: type: integer assigned: type: integer RisksResponse: type: object properties: message: type: string data: type: array items: $ref: '#/components/schemas/Risk' Risk: type: object properties: id: type: integer title: type: string description: type: string risk_level: type: string status: type: string organization_id: type: integer StatusCodeWrapper: type: object properties: code: type: integer data: description: 'Response payload' ShareLinkSettings: type: object properties: shareAllFields: type: boolean default: false allowDataExport: type: boolean default: true allowViewersToOpenRecords: type: boolean default: false displayToolbar: type: boolean default: true ShareLinkCreateRequest: type: object required: - resource_type - resource_id properties: resource_type: type: string enum: - model - vendor - project - policy - risk resource_id: type: integer minimum: 0 description: 'Use 0 for sharing the entire table/list view' settings: $ref: '#/components/schemas/ShareLinkSettings' expires_at: type: string format: date-time nullable: true ShareLinkUpdateRequest: type: object properties: settings: $ref: '#/components/schemas/ShareLinkSettings' is_enabled: type: boolean expires_at: type: string format: date-time nullable: true ShareLinkResponse: type: object properties: id: type: integer share_token: type: string resource_type: type: string resource_id: type: integer settings: $ref: '#/components/schemas/ShareLinkSettings' is_enabled: type: boolean expires_at: type: string format: date-time nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time shareable_url: type: string format: uri ShareLinkListItem: allOf: - $ref: '#/components/schemas/ShareLinkResponse' - properties: is_valid: type: boolean description: 'Whether the link is currently active and not expired' ShareLinkMetadata: type: object properties: id: type: integer share_token: type: string resource_type: type: string resource_id: type: integer settings: $ref: '#/components/schemas/ShareLinkSettings' is_enabled: type: boolean expires_at: type: string format: date-time nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time is_valid: type: boolean SharedDataResponse: type: object properties: share_link: type: object properties: resource_type: type: string settings: $ref: '#/components/schemas/ShareLinkSettings' data: description: 'Resource data (object for single record, array for table view)' oneOf: - type: object - type: array items: type: object permissions: type: object properties: allowDataExport: type: boolean allowViewersToOpenRecords: type: boolean NoteCreateRequest: type: object required: - content - attached_to - attached_to_id properties: content: type: string maxLength: 5000 attached_to: type: string enum: - project - vendor - model - risk - policy - task - incident attached_to_id: type: string Note: type: object properties: id: type: integer content: type: string author_id: type: integer attached_to: type: string attached_to_id: type: string organization_id: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time SearchResponse: type: object properties: results: type: object description: 'Results grouped by entity type (projects, vendors, models, etc.)' additionalProperties: type: array items: type: object description: 'Entity-specific result object' totalCount: type: integer query: type: string message: type: string description: 'Present when query is too short' ReportGenerateRequest: type: object required: - projectId - frameworkId - projectFrameworkId - reportType properties: projectId: type: integer frameworkId: type: integer projectFrameworkId: type: integer reportType: oneOf: - type: string enum: - projectRisks - vendorRisks - modelRisks - compliance - assessment - clausesAndAnnexes - nistSubcategories - vendors - models - trainingRegistry - policyManager - incidentManagement - all - type: array items: type: string reportName: type: string format: type: string enum: - pdf - docx default: docx aiEnhanced: type: boolean default: false llmKeyId: type: integer description: 'LLM key ID for AI-enhanced reports' GeneratedReport: type: object properties: id: type: integer filename: type: string project_id: type: integer report_type: type: string created_by: type: integer organization_id: type: integer created_at: type: string format: date-time DashboardData: type: object properties: projects: type: integer description: 'Total project count' trainings: type: integer description: 'Total training records' models: type: integer description: 'Total model count' reports: type: integer description: 'Total report count' task_radar: type: object properties: overdue: type: integer due: type: integer upcoming: type: integer projects_list: type: array items: type: object description: 'Project summary objects' ConformityStep: type: object properties: id: type: integer step: type: string description: type: string nullable: true status: type: string enum: - 'Not started' - 'In progress' - Completed - 'Not needed' owner: type: string nullable: true dueDate: type: string format: date nullable: true completedDate: type: string format: date nullable: true CEMarkingResponse: type: object properties: isHighRiskAISystem: type: boolean roleInProduct: type: string enum: - standalone - safety_component - product_itself annexIIICategory: type: string controlsCompleted: type: integer controlsTotal: type: integer assessmentsCompleted: type: integer assessmentsTotal: type: integer conformitySteps: type: array items: $ref: '#/components/schemas/ConformityStep' completedStepsCount: type: integer totalStepsCount: type: integer declarationStatus: type: string enum: - draft - ready - signed signedOn: type: string format: date nullable: true signatory: type: string nullable: true declarationDocument: type: string nullable: true registrationStatus: type: string enum: - not_registered - pending - registered euRegistrationId: type: string nullable: true registrationDate: type: string format: date nullable: true euRecordUrl: type: string format: uri nullable: true policiesLinked: type: integer evidenceLinked: type: integer linkedPolicies: type: array items: type: integer linkedEvidences: type: array items: type: integer totalIncidents: type: integer aiActReportableIncidents: type: integer lastIncident: type: string format: date-time nullable: true linkedIncidents: type: array items: type: integer CEMarkingUpdateRequest: type: object properties: isHighRiskAISystem: type: boolean roleInProduct: type: string annexIIICategory: type: string declarationStatus: type: string signedOn: type: string format: date signatory: type: string declarationDocument: type: string registrationStatus: type: string euRegistrationId: type: string registrationDate: type: string format: date euRecordUrl: type: string linkedPolicies: type: array items: type: integer linkedEvidences: type: array items: type: integer linkedIncidents: type: array items: type: integer conformitySteps: type: array items: type: object properties: id: type: integer description: type: string status: type: string enum: - 'Not started' - 'In progress' - Completed - 'Not needed' owner: type: string dueDate: type: string format: date completedDate: type: string format: date Role: type: object properties: id: type: integer name: type: string enum: - Admin - Reviewer - Editor - Auditor description: type: string SubscriptionCreateRequest: type: object required: - organization_id - tier_id - status - start_date properties: organization_id: type: integer tier_id: type: integer stripe_sub_id: type: string nullable: true status: type: string enum: - active - cancelled - past_due - trialing start_date: type: string format: date-time end_date: type: string format: date-time nullable: true SubscriptionUpdateRequest: type: object properties: tier_id: type: integer stripe_sub_id: type: string status: type: string enum: - active - cancelled - past_due - trialing start_date: type: string format: date-time end_date: type: string format: date-time nullable: true Subscription: type: object properties: id: type: integer organization_id: type: integer tier_id: type: integer stripe_sub_id: type: string nullable: true status: type: string start_date: type: string format: date-time end_date: type: string format: date-time nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time TierFeatures: type: object description: 'Tier details with associated feature flags' properties: id: type: integer name: type: string features: type: array items: type: object properties: id: type: integer name: type: string enabled: type: boolean ApiTokenCreateRequest: type: object required: - name - expires_in_days properties: name: type: string description: 'Descriptive name for the token' expires_in_days: type: integer minimum: 1 description: 'Number of days until token expires' ApiToken: type: object properties: id: type: integer name: type: string expires_at: type: string format: date-time created_by: type: integer organization_id: type: integer created_at: type: string format: date-time ApiTokenCreated: allOf: - $ref: '#/components/schemas/ApiToken' - properties: token: type: string description: 'Full JWT token value (only shown on creation)' LLMKeyCreateRequest: type: object required: - name - key properties: name: type: string enum: - Anthropic - OpenAI - OpenRouter - Custom description: 'LLM provider name' key: type: string description: 'API key value' model: type: string description: 'Default model to use with this key' url: type: string format: uri description: 'Required for Custom provider; auto-populated for others' custom_headers: type: object additionalProperties: type: string nullable: true description: 'Optional custom headers (string key-value pairs)' LLMKeyUpdateRequest: type: object properties: name: type: string enum: - Anthropic - OpenAI - OpenRouter - Custom key: type: string model: type: string url: type: string format: uri custom_headers: type: object additionalProperties: type: string nullable: true LLMKey: type: object properties: id: type: integer name: type: string key: type: string description: 'Masked key value' url: type: string model: type: string nullable: true custom_headers: type: object additionalProperties: type: string nullable: true organization_id: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time LLMKeyStatus: type: object properties: hasKeys: type: boolean keyCount: type: integer providers: type: array items: type: string UserPreferenceCreateRequest: type: object required: - user_id - date_format properties: user_id: type: integer minimum: 1 date_format: type: string description: 'Preferred date format (e.g., YYYY-MM-DD, DD/MM/YYYY)' UserPreferenceUpdateRequest: type: object properties: date_format: type: string parallel_agents: type: boolean UserPreference: type: object properties: id: type: integer user_id: type: integer date_format: type: string example: DD-MM-YYYY language: type: string example: en parallel_agents: type: boolean example: false theme: type: string example: light created_at: type: string format: date-time updated_at: type: string format: date-time FileUploadResponse: type: object properties: id: type: integer filename: type: string size: type: integer mimetype: type: string upload_date: type: string format: date-time uploaded_by: type: integer modelId: type: integer nullable: true review_status: type: string enum: - draft - pending_review approval_workflow_id: type: integer nullable: true approval_request_id: type: integer nullable: true FileListResponse: type: object properties: files: type: array items: $ref: '#/components/schemas/FileListItem' pagination: $ref: '#/components/schemas/Pagination' FileListItem: type: object properties: id: type: integer filename: type: string size: type: integer formattedSize: type: string mimetype: type: string upload_date: type: string format: date-time uploaded_by: type: integer uploader_name: type: string uploader_surname: type: string review_status: type: string approval_workflow_id: type: integer nullable: true FileSearchResponse: type: object properties: files: type: array items: type: object properties: id: type: integer filename: type: string snippet: type: string description: 'Highlighted text snippet matching the query' rank: type: number pagination: $ref: '#/components/schemas/Pagination' FileMetadata: type: object properties: id: type: integer tags: type: array items: type: string review_status: type: string enum: - draft - pending_review - approved - rejected - expired version: type: string expiry_date: type: string format: date-time nullable: true description: type: string nullable: true UpdateFileMetadataRequest: type: object properties: tags: type: array items: type: string maxItems: 50 description: 'Each tag max 100 chars, alphanumeric/spaces/hyphens/underscores only' review_status: type: string enum: - draft - pending_review - approved - rejected - expired version: type: string expiry_date: type: string format: date-time description: type: string HighlightedFiles: type: object properties: due_for_update: type: array items: type: integer pending_approval: type: array items: type: integer recently_modified: type: array items: type: integer VirtualFolder: type: object properties: id: type: integer name: type: string description: type: string nullable: true parent_id: type: integer nullable: true color: type: string nullable: true icon: type: string nullable: true is_system: type: boolean file_count: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time CreateFolderRequest: type: object required: - name properties: name: type: string maxLength: 255 description: type: string parent_id: type: integer nullable: true description: 'Parent folder ID (null for root)' color: type: string description: 'Hex color code' icon: type: string description: 'Icon identifier' UpdateFolderRequest: type: object properties: name: type: string maxLength: 255 description: type: string parent_id: type: integer nullable: true description: 'New parent (null to move to root). Cannot create circular refs.' color: type: string icon: type: string AssignFilesRequest: type: object required: - file_ids properties: file_ids: type: array items: type: integer minItems: 1 ConnectionTestResult: type: object properties: success: type: boolean message: type: string testedAt: type: string format: date-time ShadowAiToolStatus: type: string enum: - detected - under_review - approved - restricted - blocked - dismissed ApiKeyCreateResponse: type: object properties: id: type: integer key: type: string description: 'Full API key (shown only on creation)' key_prefix: type: string label: type: string nullable: true created_at: type: string format: date-time ApiKeyRecord: type: object properties: id: type: integer key_prefix: type: string label: type: string nullable: true is_active: type: boolean created_at: type: string format: date-time revoked_at: type: string format: date-time nullable: true InsightsSummary: type: object properties: total_events: type: integer total_users: type: integer total_tools: type: integer total_departments: type: integer UserDetail: type: object properties: email: type: string department: type: string tools: type: array items: type: object properties: tool_name: type: string event_count: type: integer total_prompts: type: integer ShadowAiToolDetail: type: object properties: id: type: integer name: type: string domain: type: string status: $ref: '#/components/schemas/ShadowAiToolStatus' first_seen: type: string format: date-time last_seen: type: string format: date-time event_count: type: integer user_count: type: integer departments: type: array items: type: object properties: department: type: string user_count: type: integer top_users: type: array items: type: object properties: email: type: string event_count: type: integer StartGovernanceRequest: type: object required: - model_inventory - governance_owner_id properties: model_inventory: type: object required: - provider - model properties: provider: type: string model: type: string version: type: string status: type: string enum: - Approved - Restricted - Pending - Blocked - Retired governance_owner_id: type: integer minimum: 1 start_lifecycle: type: boolean default: false StartGovernanceResponse: type: object properties: model_inventory_id: type: integer tool_id: type: integer lifecycle_initialized: type: boolean ShadowAiRule: type: object properties: id: type: integer name: type: string description: type: string nullable: true is_active: type: boolean trigger_type: type: string trigger_config: type: object actions: type: array items: type: object cooldown_minutes: type: integer nullable: true notification_user_ids: type: array items: type: integer created_at: type: string format: date-time CreateRuleRequest: type: object required: - name - trigger_type - actions properties: name: type: string description: type: string is_active: type: boolean default: true trigger_type: type: string trigger_config: type: object default: {} actions: type: array items: type: object cooldown_minutes: type: integer notification_user_ids: type: array items: type: integer UpdateRuleRequest: type: object properties: name: type: string description: type: string is_active: type: boolean trigger_type: type: string trigger_config: type: object actions: type: array items: type: object cooldown_minutes: type: integer notification_user_ids: type: array items: type: integer SyslogConfig: type: object properties: id: type: integer source_identifier: type: string parser_type: type: string enum: - zscaler - netskope - squid - generic_kv is_active: type: boolean created_at: type: string format: date-time CreateSyslogConfigRequest: type: object required: - source_identifier - parser_type properties: source_identifier: type: string parser_type: type: string enum: - zscaler - netskope - squid - generic_kv is_active: type: boolean default: true UpdateSyslogConfigRequest: type: object properties: source_identifier: type: string parser_type: type: string enum: - zscaler - netskope - squid - generic_kv is_active: type: boolean ShadowAiSettings: type: object properties: rate_limit_max_events_per_hour: type: integer retention_events_days: type: integer retention_daily_rollups_days: type: integer retention_alert_history_days: type: integer UpdateSettingsRequest: type: object properties: rate_limit_max_events_per_hour: type: integer retention_events_days: type: integer retention_daily_rollups_days: type: integer retention_alert_history_days: type: integer PMMConfig: type: object properties: id: type: integer project_id: type: integer frequency: type: string description: 'Monitoring frequency (e.g., "monthly", "quarterly")' stakeholder_id: type: integer nullable: true is_active: type: boolean questions_count: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time PMMConfigCreateRequest: type: object required: - project_id properties: project_id: type: integer frequency: type: string stakeholder_id: type: integer is_active: type: boolean default: true PMMConfigUpdateRequest: type: object properties: frequency: type: string stakeholder_id: type: integer is_active: type: boolean PMMQuestion: type: object properties: id: type: integer config_id: type: integer nullable: true question_text: type: string question_type: type: string enum: - yes_no - multi_select - multi_line_text options: type: array items: type: string nullable: true is_required: type: boolean is_default: type: boolean display_order: type: integer created_at: type: string format: date-time PMMQuestionCreate: type: object required: - question_text - question_type properties: config_id: type: integer nullable: true question_text: type: string question_type: type: string enum: - yes_no - multi_select - multi_line_text options: type: array items: type: string is_required: type: boolean default: false display_order: type: integer PMMQuestionUpdate: type: object properties: question_text: type: string question_type: type: string enum: - yes_no - multi_select - multi_line_text options: type: array items: type: string is_required: type: boolean display_order: type: integer PMMCycle: type: object properties: id: type: integer config_id: type: integer project_id: type: integer project_title: type: string cycle_number: type: integer status: type: string enum: - active - completed assigned_stakeholder_id: type: integer nullable: true due_date: type: string format: date-time nullable: true completed_at: type: string format: date-time nullable: true created_at: type: string format: date-time PMMResponse: type: object properties: id: type: integer cycle_id: type: integer question_id: type: integer response_value: type: string is_flagged: type: boolean created_at: type: string format: date-time PMMSaveResponsesRequest: type: object required: - responses properties: responses: type: array minItems: 1 items: type: object required: - question_id - response_value properties: question_id: type: integer response_value: type: string is_flagged: type: boolean default: false PMMSubmitCycleResponse: type: object properties: message: type: string report_generated: type: boolean report_filename: type: string nullable: true PMMReportsResponse: type: object properties: reports: type: array items: type: object properties: id: type: integer cycle_id: type: integer file_id: type: integer nullable: true completed_by: type: integer created_at: type: string format: date-time total: type: integer page: type: integer limit: type: integer TaskPriority: type: string enum: - Low - Medium - High description: 'Task priority level.' TaskStatus: type: string enum: - Open - 'In Progress' - Completed - Overdue - Deleted description: 'Task lifecycle status. "Deleted" represents a soft-deleted (archived) task.' EntityType: type: string enum: - vendor - model - policy - nist_subcategory - iso42001_subclause - iso42001_annexcategory - iso27001_subclause - iso27001_annexcontrol - eu_control - eu_subcontrol description: 'Type of entity that can be linked to a task.' CreateTaskRequest: type: object required: - title properties: title: type: string example: 'Review vendor risk assessment' description: type: string nullable: true due_date: type: string format: date-time nullable: true example: '2026-05-15T00:00:00.000Z' priority: $ref: '#/components/schemas/TaskPriority' status: $ref: '#/components/schemas/TaskStatus' categories: type: array items: type: string example: - compliance - vendor assignees: type: array items: oneOf: - type: integer - type: object properties: user_id: {type: integer} required: - user_id example: - 1 - 2 - 3 entity_links: type: array items: type: object properties: entity_id: type: integer entity_type: $ref: '#/components/schemas/EntityType' entity_name: type: string UpdateTaskRequest: type: object properties: title: type: string description: type: string nullable: true due_date: type: string format: date-time nullable: true priority: $ref: '#/components/schemas/TaskPriority' status: $ref: '#/components/schemas/TaskStatus' categories: type: array items: type: string assignees: type: array items: type: integer entity_links: type: array items: type: object properties: entity_id: type: integer entity_type: $ref: '#/components/schemas/EntityType' entity_name: type: string AddEntityLinkRequest: type: object required: - entity_id - entity_type properties: entity_id: type: integer example: 42 entity_type: $ref: '#/components/schemas/EntityType' entity_name: type: string example: 'Acme Corp' Task: type: object properties: id: type: integer example: 1 title: type: string example: 'Review vendor risk assessment' description: type: string nullable: true creator_id: type: integer organization_id: type: integer due_date: type: string format: date-time nullable: true priority: $ref: '#/components/schemas/TaskPriority' status: $ref: '#/components/schemas/TaskStatus' categories: type: array items: type: string is_demo: type: boolean created_at: type: string format: date-time updated_at: type: string format: date-time TaskWithAssignees: allOf: - $ref: '#/components/schemas/Task' - type: object properties: assignees: type: array items: type: integer TaskWithRelations: allOf: - $ref: '#/components/schemas/Task' - type: object properties: assignees: type: array items: type: integer entity_links: type: array items: $ref: '#/components/schemas/EntityLinkSummary' TaskDetail: allOf: - $ref: '#/components/schemas/Task' - type: object properties: assignees: type: array items: type: integer creator_name: type: string example: 'Jane Smith' assignee_names: type: array items: type: string example: - 'John Doe' - 'Alice Johnson' entity_links: type: array items: $ref: '#/components/schemas/EntityLinkSummary' EntityLinkSummary: type: object properties: id: type: integer entity_id: type: integer entity_type: $ref: '#/components/schemas/EntityType' entity_name: type: string TaskEntityLink: type: object properties: id: type: integer task_id: type: integer entity_id: type: integer entity_type: $ref: '#/components/schemas/EntityType' entity_name: type: string nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time EnvelopeBase: type: object properties: message: type: string required: - message EnvelopeEmpty: allOf: - $ref: '#/components/schemas/EnvelopeBase' - type: object properties: message: example: 'No Content' data: type: array items: {} example: [] EnvelopeNotFound: allOf: - $ref: '#/components/schemas/EnvelopeBase' - type: object properties: message: example: 'Not Found' data: nullable: true example: null EnvelopeBadRequest: allOf: - $ref: '#/components/schemas/EnvelopeBase' - type: object properties: message: example: 'Bad Request' data: type: string example: 'Invalid training ID' EnvelopeError: type: object properties: message: type: string example: 'Internal Server Error' error: type: string required: - message - error Training: type: object properties: id: type: integer example: 42 training_name: type: string example: 'AI Governance Fundamentals' duration: type: string example: '2 hours' provider: type: string example: Internal department: type: string example: Compliance status: type: string enum: - Planned - 'In Progress' - Completed example: Planned numberOfPeople: type: integer example: 25 description: type: string example: 'Introductory course on EU AI Act compliance' progressPercentage: type: integer enum: - 0 - 50 - 100 example: 0 createdAt: type: string format: date-time updatedAt: type: string format: date-time required: - id - training_name - duration - provider - department - status - numberOfPeople - description - progressPercentage TrainingCreateRequest: type: object required: - training_name - duration - provider - department - status - numberOfPeople properties: training_name: type: string example: 'AI Governance Fundamentals' duration: type: string example: '2 hours' provider: type: string example: Internal department: type: string example: Compliance status: type: string enum: - Planned - 'In Progress' - Completed example: Planned numberOfPeople: type: integer example: 25 description: type: string example: 'Introductory course on EU AI Act compliance' is_demo: type: boolean default: false TrainingUpdateRequest: type: object properties: training_name: type: string example: 'Advanced AI Risk Management' duration: type: string example: '3 days' provider: type: string example: External department: type: string example: Engineering status: type: string enum: - Planned - 'In Progress' - Completed example: 'In Progress' numberOfPeople: type: integer example: 30 description: type: string example: 'Updated scope to cover ISO 42001' TrainingListResponse: allOf: - $ref: '#/components/schemas/EnvelopeBase' - type: object properties: message: example: OK data: type: array items: $ref: '#/components/schemas/Training' TrainingSingleResponse: allOf: - $ref: '#/components/schemas/EnvelopeBase' - type: object properties: message: example: OK data: $ref: '#/components/schemas/Training' ChangeHistoryEntry: type: object properties: id: type: integer example: 101 entity_type: type: string example: training entity_id: type: integer example: 42 field_name: type: string example: status old_value: type: string nullable: true example: Planned new_value: type: string nullable: true example: 'In Progress' change_type: type: string enum: - created - updated - deleted example: updated changed_by: type: integer example: 5 user_name: type: string example: Gorkem user_surname: type: string example: Cetin organization_id: type: integer example: 1 created_at: type: string format: date-time ChangeHistoryData: type: object required: - data - hasMore - total properties: data: type: array items: $ref: '#/components/schemas/ChangeHistoryEntry' hasMore: type: boolean example: false total: type: integer example: 5 ChangeHistoryResponse: allOf: - $ref: '#/components/schemas/EnvelopeBase' - type: object properties: message: example: OK data: $ref: '#/components/schemas/ChangeHistoryData' CreateOrganizationRequest: type: object required: - name - userEmail - userName - userSurname - userPassword properties: name: type: string example: 'Acme Corp' logo: type: string format: uri nullable: true example: 'https://example.com/logo.png' userEmail: type: string format: email example: admin@acme.com userName: type: string example: John userSurname: type: string example: Doe userPassword: type: string format: password example: SecurePassword123! UpdateOrganizationRequest: type: object properties: name: type: string example: 'Acme Corporation' logo: type: string format: uri nullable: true example: 'https://example.com/new-logo.png' Organization: type: object properties: id: type: integer example: 1 name: type: string example: 'Acme Corp' logo: type: string nullable: true example: 'https://example.com/logo.png' created_at: type: string format: date-time updated_at: type: string format: date-time onboarding_status: type: string enum: - pending - completed example: pending tenant_id: type: string nullable: true example: a1b2c3d4e5 risk_assessment_mode: type: string enum: - qualitative - quantitative example: qualitative ageInDays: type: integer example: 45 OrganizationExistsResult: type: object properties: exists: type: boolean example: true CreateOrganizationResponse: type: object properties: user: $ref: '#/components/schemas/SafeUser' organization: type: object properties: id: type: integer example: 1 name: type: string example: 'Acme Corp' token: type: string example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... SafeUser: type: object properties: id: type: integer example: 1 email: type: string format: email example: admin@acme.com name: type: string example: John surname: type: string example: Doe role_id: type: integer example: 1 organization_id: type: integer example: 1 OnboardingStatusResponse: type: object properties: onboarding_status: type: string enum: - completed example: completed NotificationType: type: string enum: - task_assigned - task_updated - task_completed - review_requested - review_approved - review_rejected - approval_requested - approval_approved - approval_rejected - approval_complete - policy_due_soon - policy_overdue - training_assigned - training_completed - vendor_review_due - file_uploaded - comment_added - mention - shadow_ai_alert - ai_gateway_budget_warning - ai_gateway_budget_exhausted - ai_gateway_guardrail_spike - ai_gateway_config_change - ai_gateway_virtual_key_budget_exhausted - system - assignment_owner - assignment_reviewer - assignment_approver - assignment_member - assignment_assignee - assignment_action_owner NotificationEntityType: type: string enum: - project - task - policy - vendor - model - training - file - use_case - risk - assessment - comment - user - shadow_ai_tool - ai_gateway NotificationJSON: type: object required: - id - user_id - type - title - message - is_read - created_at properties: id: type: integer example: 42 user_id: type: integer example: 7 type: $ref: '#/components/schemas/NotificationType' title: type: string example: 'Task assigned to you' message: type: string example: 'You have been assigned to task ''Review vendor contract''.' entity_type: allOf: - $ref: '#/components/schemas/NotificationEntityType' nullable: true entity_id: type: integer nullable: true example: 15 entity_name: type: string nullable: true example: 'Review vendor contract' action_url: type: string nullable: true example: /projects/3/tasks/15 is_read: type: boolean example: false read_at: type: string format: date-time nullable: true created_at: type: string format: date-time example: '2026-04-20T10:00:00.000Z' created_by: type: integer nullable: true example: 3 metadata: type: object nullable: true additionalProperties: true NotificationSummary: type: object required: - unread_count - total_count - recent_notifications properties: unread_count: type: integer example: 3 total_count: type: integer example: 47 recent_notifications: type: array maxItems: 10 items: $ref: '#/components/schemas/NotificationJSON' RealtimeNotification: type: object required: - type - data properties: type: type: string enum: - notification data: $ref: '#/components/schemas/NotificationJSON' ApiEnvelope: type: object properties: status: type: integer example: 200 data: description: 'Response payload (varies per endpoint)' FriaErrorEnvelope: type: object properties: status: type: integer example: 400 data: type: string example: 'Invalid project ID' DeletedResponse: type: object properties: deleted: type: boolean example: true FriaStatus: type: string enum: - draft - submitted - approved - rejected FriaRiskLevel: type: string enum: - Low - Medium - High FriaLikelihood: type: string enum: - Low - Medium - High FriaSeverity: type: string enum: - Low - Medium - High FriaAssessment: type: object properties: id: type: integer organization_id: type: integer project_id: type: integer version: type: integer status: $ref: '#/components/schemas/FriaStatus' assessment_owner: type: string nullable: true assessment_date: type: string nullable: true operational_context: type: string nullable: true is_high_risk: type: string nullable: true high_risk_basis: type: string nullable: true deployer_type: type: string nullable: true annex_iii_category: type: string nullable: true first_use_date: type: string nullable: true review_cycle: type: string nullable: true period_frequency: type: string nullable: true fria_rationale: type: string nullable: true affected_groups: type: string nullable: true vulnerability_context: type: string nullable: true group_flags: type: array items: type: string nullable: true risk_scenarios: type: string nullable: true provider_info_used: type: string nullable: true human_oversight: type: string nullable: true transparency_measures: type: string nullable: true redress_process: type: string nullable: true data_governance: type: string nullable: true legal_review: type: string nullable: true dpo_review: type: string nullable: true owner_approval: type: string nullable: true stakeholders_consulted: type: string nullable: true consultation_notes: type: string nullable: true deployment_decision: type: string nullable: true decision_conditions: type: string nullable: true completion_pct: type: integer risk_score: type: integer risk_level: $ref: '#/components/schemas/FriaRiskLevel' rights_flagged: type: integer created_by: type: integer updated_by: type: integer nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time nullable: true project_title: type: string nullable: true organization_name: type: string nullable: true created_by_name: type: string nullable: true updated_by_name: type: string nullable: true FriaUpdateRequest: type: object properties: status: $ref: '#/components/schemas/FriaStatus' assessment_owner: type: string assessment_date: type: string operational_context: type: string is_high_risk: type: string high_risk_basis: type: string deployer_type: type: string annex_iii_category: type: string first_use_date: type: string review_cycle: type: string period_frequency: type: string fria_rationale: type: string affected_groups: type: string vulnerability_context: type: string group_flags: type: array items: type: string risk_scenarios: type: string provider_info_used: type: string human_oversight: type: string transparency_measures: type: string redress_process: type: string data_governance: type: string legal_review: type: string dpo_review: type: string owner_approval: type: string stakeholders_consulted: type: string consultation_notes: type: string deployment_decision: type: string decision_conditions: type: string FriaFullResponse: type: object properties: assessment: $ref: '#/components/schemas/FriaAssessment' rights: type: array items: $ref: '#/components/schemas/FriaRight' riskItems: type: array items: $ref: '#/components/schemas/FriaRiskItem' modelLinks: type: array items: $ref: '#/components/schemas/FriaModelLink' FriaRight: type: object properties: id: type: integer organization_id: type: integer fria_id: type: integer right_key: type: string right_title: type: string charter_ref: type: string flagged: type: boolean severity: type: integer confidence: type: integer impact_pathway: type: string nullable: true mitigation: type: string nullable: true FriaRightsUpdateRequest: type: object required: - rights properties: rights: type: array items: type: object required: - right_key properties: right_key: type: string flagged: type: boolean severity: type: integer confidence: type: integer impact_pathway: type: string mitigation: type: string FriaRiskItem: type: object properties: id: type: integer organization_id: type: integer fria_id: type: integer risk_description: type: string likelihood: $ref: '#/components/schemas/FriaLikelihood' severity: $ref: '#/components/schemas/FriaSeverity' existing_controls: type: string nullable: true further_action: type: string nullable: true linked_project_risk_id: type: integer nullable: true sort_order: type: integer created_at: type: string format: date-time updated_at: type: string format: date-time nullable: true linked_risk_name: type: string nullable: true linked_risk_description: type: string nullable: true FriaRiskItemCreateRequest: type: object required: - risk_description properties: risk_description: type: string likelihood: $ref: '#/components/schemas/FriaLikelihood' severity: $ref: '#/components/schemas/FriaSeverity' existing_controls: type: string further_action: type: string linked_project_risk_id: type: integer sort_order: type: integer FriaRiskItemUpdateRequest: type: object properties: risk_description: type: string likelihood: $ref: '#/components/schemas/FriaLikelihood' severity: $ref: '#/components/schemas/FriaSeverity' existing_controls: type: string further_action: type: string linked_project_risk_id: type: integer sort_order: type: integer FriaModelLink: type: object properties: id: type: integer organization_id: type: integer fria_id: type: integer model_id: type: integer provider: type: string nullable: true model: type: string nullable: true version: type: string nullable: true model_status: type: string nullable: true FriaEvidenceLinkRequest: type: object required: - file_id - entity_type properties: file_id: type: integer entity_type: type: string FriaSnapshot: type: object properties: id: type: integer organization_id: type: integer fria_id: type: integer version: type: integer snapshot_data: type: object properties: assessment: $ref: '#/components/schemas/FriaAssessment' rights: type: array items: $ref: '#/components/schemas/FriaRight' riskItems: type: array items: $ref: '#/components/schemas/FriaRiskItem' modelLinks: type: array items: $ref: '#/components/schemas/FriaModelLink' snapshot_reason: type: string nullable: true created_by: type: integer created_at: type: string format: date-time created_by_name: type: string nullable: true FriaSubmitRequest: type: object properties: reason: type: string StandardResponse: type: object properties: message: type: string data: description: 'Response payload (present on 1xx-4xx)' error: type: string ErrorResponse400: type: object properties: message: type: string example: 'Bad Request' data: type: string example: 'userId query parameter is required' ErrorResponse401: type: object properties: message: type: string example: Unauthorized data: type: string ErrorResponse403: type: object properties: message: type: string example: Forbidden data: type: string ErrorResponse404: type: object properties: message: type: string example: 'Not Found' data: type: string ErrorResponse500: type: object properties: message: type: string example: 'Internal Server Error' error: type: string SlackNotificationRoutingType: type: string enum: - 'Membership and roles' - 'Projects and organizations' - 'Policy reminders and status' - 'Evidence and task alerts' - 'Control or policy changes' SlackWebhookFull: type: object properties: id: type: integer example: 1 access_token: type: string access_token_iv: type: string scope: type: string example: 'incoming-webhook,chat:write' user_id: type: integer example: 5 team_name: type: string example: 'Acme Corp' team_id: type: string example: T01234ABC channel: type: string example: '#general' channel_id: type: string example: C01234ABC configuration_url: type: string format: uri url: type: string url_iv: type: string is_active: type: boolean example: true routing_type: type: array items: $ref: '#/components/schemas/SlackNotificationRoutingType' nullable: true created_at: type: string format: date-time updated_at: type: string format: date-time SlackWebhookJSON: type: object properties: id: type: integer scope: type: string user_id: type: integer team_name: type: string team_id: type: string channel: type: string channel_id: type: string created_at: type: string format: date-time is_active: type: boolean routing_type: type: array items: $ref: '#/components/schemas/SlackNotificationRoutingType' nullable: true CreateSlackWebhookRequest: type: object required: - code - userId properties: code: type: string example: 1234567890.abcdef userId: type: integer example: 5 UpdateSlackWebhookRequest: type: object properties: is_active: type: boolean example: false routing_type: type: array items: $ref: '#/components/schemas/SlackNotificationRoutingType' SendSlackMessageRequest: type: object required: - title - message properties: title: type: string example: 'New policy update' message: type: string example: 'Policy *Data Retention* has been updated.' SlackMessageSentResult: type: object properties: success: type: boolean example: true messageId: type: string example: '1234567890.123456' channel: type: string example: C01234ABC GitHubTokenStatus: type: object properties: configured: type: boolean example: true token_name: type: string example: 'GitHub Personal Access Token' last_used_at: type: string format: date-time nullable: true created_at: type: string format: date-time SaveGitHubTokenRequest: type: object required: - token properties: token: type: string example: ghp_your_token_here token_name: type: string default: 'GitHub Personal Access Token' example: 'CI/CD Scanner Token' TestGitHubTokenRequest: type: object required: - token properties: token: type: string example: ghp_your_token_here GitHubTokenTestResult: type: object properties: valid: type: boolean example: true scopes: type: array items: type: string example: - repo - 'read:org' rate_limit: type: object properties: limit: type: integer example: 5000 remaining: type: integer example: 4999 reset: type: string format: date-time error: type: string example: 'Invalid or expired token' GitHubWebhookPayload: type: object required: - repository properties: repository: type: object required: - owner - name properties: owner: type: object required: - login properties: login: type: string example: verifywise-ai name: type: string example: verifywise ref: type: string example: refs/heads/main action: type: string example: opened pull_request: type: object GitHubWebhookResult: type: object properties: triggered: type: boolean reason: type: string example: 'Scan triggered for push to main' GitHubWebhookPong: type: object properties: message: type: string example: pong GitHubWebhookSkipped: type: object properties: message: type: string example: 'Repository not registered or CI not enabled' SuccessResponse_SlackWebhookArray: type: object properties: message: type: string example: OK data: type: array items: $ref: '#/components/schemas/SlackWebhookFull' SuccessResponse_SlackWebhookJSON: type: object properties: message: type: string example: OK data: $ref: '#/components/schemas/SlackWebhookJSON' CreatedResponse_SlackWebhookFull: type: object properties: message: type: string example: Created data: $ref: '#/components/schemas/SlackWebhookFull' AcceptedResponse_SlackWebhookFull: type: object properties: message: type: string example: Accepted data: $ref: '#/components/schemas/SlackWebhookFull' SuccessResponse_SlackMessageSent: type: object properties: message: type: string example: OK data: $ref: '#/components/schemas/SlackMessageSentResult' SuccessResponse_GitHubTokenStatus: type: object properties: message: type: string example: OK data: $ref: '#/components/schemas/GitHubTokenStatus' CreatedResponse_GitHubTokenStatus: type: object properties: message: type: string example: Created data: $ref: '#/components/schemas/GitHubTokenStatus' SuccessResponse_GitHubTokenDeleted: type: object properties: message: type: string example: OK data: type: object properties: message: type: string example: 'GitHub token deleted successfully' SuccessResponse_GitHubTokenTest: type: object properties: message: type: string example: OK data: $ref: '#/components/schemas/GitHubTokenTestResult' tags: - name: 'AI Advisor' - name: 'AI Approval Rules' - name: 'AI Approvals' - name: 'AI Apps' - name: 'AI Audit' - name: 'AI Confirmation' - name: 'AI Content' - name: 'AI Detection' - name: 'AI Trust Centre' - name: 'Agent Discovery' - name: 'Ai Trust Index' - name: 'Approval Workflows' - name: Assessments - name: Audit - name: Authentication - name: Automations - name: 'CE Marking' - name: 'Change History' - name: Compliance - name: 'Custom Fields' - name: Dashboard - name: Datasets - name: Deadlines - name: 'Demo Data' - name: 'EU AI Act' - name: 'Entity Graph' - name: 'Eu Ai Act Classification' - name: Evidence - name: 'Evidence AI' - name: Extensions - name: FRIA - name: Files - name: Frameworks - name: 'Governance OS' - name: 'ISO 27001' - name: 'ISO 42001' - name: Incidents - name: 'Intake Forms' - name: Integrations - name: Internal - name: Invitations - name: 'LLM Evals' - name: 'LLM Keys' - name: Mail - name: 'Model Inventory' - name: 'Model Risks' - name: Mrm - name: 'NIST AI RMF' - name: Notes - name: Notifications - name: Observability - name: Organizations - name: Policies - name: 'Post-Market Monitoring' - name: 'Project Risks' - name: Projects - name: 'Quantitative Risks' - name: Readiness - name: Reporting - name: Reporting/Runs - name: 'Reporting/Scheduled Reports' - name: Reporting/Templates - name: 'Risk Benchmarks' - name: 'Risk History' - name: RiskLinks - name: Roles - name: 'SSO Config' - name: Search - name: Settings - name: 'Shadow AI' - name: 'Share Links' - name: Subscriptions - name: 'Super Admin' - name: System - name: Tasks - name: Telemetry - name: Training - name: Users - name: 'Vendor Risks' - name: Vendors - name: Webhooks paths: /webhooks/github: post: tags: - Webhooks summary: 'Github Webhook Controller' operationId: githubWebhookController requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '500': description: 'Internal server error' /users: get: summary: 'List all users in organization' description: "Returns all users belonging to the authenticated user's organization,\nordered by created_at DESC, id ASC. Password hashes are excluded.\n" tags: - Users security: - bearerAuth: [] responses: '200': description: 'Users found' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {$ref: '#/components/schemas/UserSafe'}} '204': description: 'No users found (empty organization)' '500': description: 'Internal server error' operationId: getAllUsers /users/preferences: get: summary: 'Get current user preferences' description: "Returns the authenticated user's persisted preferences (date_format,\nlanguage, parallel_agents) from user_preferences. If no row exists, returns safe\ndefaults including a transient theme default and parallel_agents false.\n" tags: - Users security: - bearerAuth: [] responses: '200': description: 'Preferences found or defaults returned' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/UserPreference'} '401': description: Unauthorized '500': description: 'Internal server error' operationId: getPreferencesForCurrentUser /users/me/preferences: get: summary: 'Get current user preferences' description: "Returns the authenticated user's persisted preferences (date_format,\nlanguage, parallel_agents) from user_preferences. If no row exists, returns safe\ndefaults including a transient theme default and parallel_agents false. Preferred alias of\nGET /users/preferences.\n" tags: - Users security: - bearerAuth: [] responses: '200': description: 'Preferences found or defaults returned' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/UserPreference'} '401': description: Unauthorized '404': description: 'User not found' '500': description: 'Internal server error' operationId: users_getPreferencesForCurrentUser patch: summary: 'Update current user preferences' description: "Upserts the authenticated user's date_format, language, and/or\nparallel_agents. At least one field is required. Unknown format strings,\nlanguages, and non-boolean parallel_agents values are rejected.\nAny user_id in the body is ignored; the JWT user is always the target.\n" tags: - Users security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object properties: date_format: type: string enum: [DD-MM-YYYY, MM-DD-YYYY, DD/MM/YY, MM/DD/YY] example: MM-DD-YYYY language: type: string enum: [en, de, fr, es] example: en parallel_agents: type: boolean example: false responses: '200': description: 'Preferences saved' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/UserPreference'} '400': description: 'Validation error (missing fields or unknown format/language)' '401': description: Unauthorized '404': description: 'User not found' '500': description: 'Internal server error' operationId: patchPreferencesForCurrentUser '/users/{id}': get: summary: 'Get user by ID' description: "Retrieves a single user by their numeric ID. Super-admins can access\nany user; regular users can only access users within their organization\n(or their own record).\n" tags: - Users security: - bearerAuth: [] parameters: - in: path name: id required: true schema: type: integer description: 'User ID' responses: '200': description: 'User found' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/UserSafe'} '403': description: 'Access denied (user belongs to different organization)' '404': description: 'User not found' '500': description: 'Internal server error' operationId: getUserById patch: summary: 'Update user by ID' description: "Updates user fields (name, surname, email, roleId, last_login).\nOnly provided fields are updated. Organization isolation enforced.\nSends Slack notification on role change. Sends email notification\nwhen role changes from Editor (3) to Admin (1).\n" tags: - Users security: - bearerAuth: [] parameters: - in: path name: id required: true schema: type: integer description: 'User ID to update' requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: 'First name' example: Jane surname: type: string description: 'Last name' example: Smith email: type: string format: email example: jane@example.com roleId: type: integer description: 'New role ID (1=Admin, 2=Reviewer, 3=Editor, 4=Auditor). Can be sent as string.' example: 1 last_login: type: string format: date-time description: 'Override last login timestamp' description: 'All fields are optional; only provided fields are updated' responses: '202': description: 'User updated' content: application/json: schema: type: object properties: message: {type: string, example: Accepted} data: {$ref: '#/components/schemas/UserSafe'} '400': description: 'Validation error' '403': description: 'Access denied or business logic error' '404': description: 'User not found' '500': description: 'Internal server error' operationId: updateUserById delete: summary: 'Delete user by ID' description: 'Requires role: Admin or SuperAdmin' tags: - Users security: - bearerAuth: [] parameters: - in: path name: id required: true schema: type: integer description: 'User ID to delete' responses: '202': description: 'User deleted' content: application/json: schema: type: object properties: message: {type: string, example: Accepted} data: {type: boolean, description: 'true if deletion succeeded'} '403': description: 'Forbidden: demo user, super-admin, or wrong organization' content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '404': description: 'User not found' '500': description: 'Internal server error' operationId: deleteUserById /users/register: post: summary: 'Register a new user' description: "Creates a new user account. Requires a valid registration JWT (set by registerJWT middleware).\nValidates email uniqueness, password strength, and required fields.\nThe account takes the invited email, role and organization from the invitation link, which must match the current pending invitation (a resent or re-invited link replaces earlier ones). The invitation is accepted in the same transaction, so a link registers once; a link that was revoked, used or replaced is refused with 403.\n" tags: - Users requestBody: required: true content: application/json: schema: type: object required: - name - surname - email - password - roleId - organizationId properties: name: type: string description: 'User''s first name' example: John surname: type: string description: 'User''s last name' example: Doe email: type: string format: email example: john@example.com password: type: string format: password description: 'Must be 8+ chars with uppercase, lowercase, and digit' example: SecurePassword123! roleId: type: integer description: '1=Admin, 2=Reviewer, 3=Editor, 4=Auditor' example: 3 organizationId: type: integer description: 'Organization to assign the user to' example: 1 responses: '201': description: 'User created successfully' content: application/json: schema: type: object properties: message: {type: string, example: Created} data: {$ref: '#/components/schemas/UserSafe'} '400': description: 'Validation error (missing fields, weak password, invalid email)' content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '403': description: 'Business logic error' '409': description: 'User with this email already exists' content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '500': description: 'Internal server error' operationId: createNewUser /users/login: post: summary: 'Authenticate user' description: "Validates email/password credentials via bcrypt. Returns a JWT access token\nin the response body and sets a refresh token in an HTTP-only cookie.\nRate-limited to 5 requests per minute per IP.\n" tags: - Users requestBody: required: true content: application/json: schema: type: object required: - email - password properties: email: type: string format: email example: user@example.com password: type: string format: password example: SecurePassword123! responses: '202': description: 'Authentication successful' headers: Set-Cookie: schema: type: string description: 'refresh_token=; Path=/api/users; HttpOnly; Secure (prod); SameSite=none (prod) / lax (dev)' content: application/json: schema: type: object properties: message: {type: string, example: Accepted} data: {type: object, properties: {token: {type: string, description: 'JWT access token'}, isSuperAdmin: {type: boolean, description: 'Only present when user is super-admin (role_id=5)'}, onboarding_status: {type: string, description: 'Organization onboarding status (not present for super-admin)', example: completed}, is_org_creator: {type: boolean, description: 'Whether user is the first admin of the org (not present for super-admin)'}}} '401': description: 'Invalid email or password' content: application/json: schema: $ref: '#/components/schemas/ErrorEnvelope' '429': description: 'Too many login attempts' '500': description: 'Internal server error' operationId: loginUser /users/login-microsoft: post: summary: 'Login User With Microsoft' responses: '200': description: Success '500': description: 'Internal server error' tags: - Users operationId: loginUserWithMicrosoft /users/refresh-token: post: summary: 'Refresh access token' description: "Reads the refresh_token from an HTTP-only cookie and issues a new\nJWT access token if the refresh token is still valid.\n" tags: - Users parameters: - in: cookie name: refresh_token required: true schema: type: string description: 'JWT refresh token set during login' responses: '200': description: 'New access token issued' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: object, properties: {token: {type: string, description: 'New JWT access token'}}} '400': description: 'Refresh token missing from cookie' '401': description: 'Invalid refresh token' '406': description: 'Refresh token expired' content: application/json: schema: type: object properties: message: {type: string} data: {type: object, properties: {message: {type: string, example: 'Token expired'}}} '500': description: 'Internal server error' operationId: refreshAccessToken /users/logout: post: summary: 'Log out current session' description: "Revokes the presented refresh token server-side and clears the\nrefresh_token cookie. No bearer token required: only the token presented\nin the cookie is revoked.\n" tags: - Users parameters: - in: cookie name: refresh_token required: false schema: type: string description: 'JWT refresh token set during login' responses: '200': description: 'Logged out; refresh token revoked and cookie cleared' '500': description: 'Internal server error' operationId: logoutUser /users/reset-password: post: summary: 'Reset user password' description: "Resets the password for a user identified by email. Protected by\nresetPasswordMiddleware (validates reset token/permission).\nPassword is hashed via bcrypt before storage.\n" tags: - Users requestBody: required: true content: application/json: schema: type: object required: - email - newPassword properties: email: type: string format: email example: user@example.com newPassword: type: string format: password description: 'Must be 8+ chars with uppercase, lowercase, and digit' example: NewSecure123! responses: '202': description: 'Password reset successfully' content: application/json: schema: type: object properties: message: {type: string, example: Accepted} data: {$ref: '#/components/schemas/UserSafe'} '400': description: 'Validation error (weak password)' '403': description: 'Business logic error' '404': description: 'User not found' '500': description: 'Internal server error' operationId: resetPassword '/users/chng-pass/{id}': patch: summary: 'Change password (authenticated)' description: "Changes the password for the authenticated user. Requires the current\npassword for verification. Protected by selfOnly middleware (users can\nonly change their own password). Rate-limited.\n" tags: - Users security: - bearerAuth: [] parameters: - in: path name: id required: true schema: type: integer description: 'User ID (must match authenticated user via selfOnly middleware)' requestBody: required: true content: application/json: schema: type: object required: - id - currentPassword - newPassword properties: id: type: integer description: 'User ID (must match path parameter)' example: 1 currentPassword: type: string format: password description: 'Current password for verification' example: OldPassword123! newPassword: type: string format: password description: 'Must be 8+ chars with uppercase, lowercase, and digit' example: NewPassword456! responses: '202': description: 'Password changed successfully' content: application/json: schema: type: object properties: message: {type: string, example: 'Password updated successfully'} data: {$ref: '#/components/schemas/UserSafe'} '400': description: 'Validation error (weak password, missing fields)' content: application/json: schema: type: object properties: message: {type: string} '403': description: 'Business logic error (wrong current password)' content: application/json: schema: type: object properties: message: {type: string} '404': description: 'User not found' content: application/json: schema: type: object properties: message: {type: string, example: 'User not found'} '500': description: 'Internal server error' operationId: ChangePassword /users/check/exists: get: summary: 'Check if any user exists' description: "Returns a boolean indicating whether any user record exists in the database.\nUsed during initial setup flow to determine if onboarding is needed.\n" tags: - Users security: - bearerAuth: [] responses: '200': description: 'Check result' content: application/json: schema: type: boolean example: true '500': description: 'Internal server error' content: application/json: schema: type: object properties: message: {type: string, example: 'Internal server error'} operationId: checkUserExists '/users/{id}/calculate-progress': get: summary: 'Calculate user project progress' description: "Computes completion metrics across all projects the user is a member of.\nCalculates subcontrol completion (status=\"Done\") and assessment question\ncompletion (has answer) per project and as aggregated totals.\n" tags: - Users security: - bearerAuth: [] parameters: - in: path name: id required: true schema: type: integer description: 'User ID to calculate progress for' responses: '200': description: 'Progress calculated' content: application/json: schema: $ref: '#/components/schemas/ProgressResponse' '500': description: 'Internal server error' content: application/json: schema: type: object properties: message: {type: string, example: 'Internal server error'} operationId: calculateProgress '/users/{id}/profile-photo': post: summary: 'Upload profile photo' description: "Uploads a profile photo for the specified user. The file is stored in the\ntenant-scoped files table. If the user already has a profile photo, the old\none is deleted and replaced. Uses multer for multipart file handling.\n" tags: - Users security: - bearerAuth: [] parameters: - in: path name: id required: true schema: type: integer description: 'User ID' requestBody: required: true content: multipart/form-data: schema: type: object required: - photo properties: photo: type: string format: binary description: 'Image file (JPEG, PNG, etc.)' responses: '200': description: 'Profile photo uploaded' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: object, properties: {profile_photo_id: {type: integer, description: 'ID of the new file record'}}} '400': description: 'No file provided' '403': description: 'Access denied (wrong organization)' '500': description: 'Internal server error' operationId: uploadUserProfilePhoto get: summary: 'Get profile photo' description: "Returns the profile photo binary content for the specified user.\nThe response includes the raw file content and its MIME type.\n" tags: - Users security: - bearerAuth: [] parameters: - in: path name: id required: true schema: type: integer description: 'User ID' responses: '200': description: 'Profile photo returned' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: object, properties: {content: {type: string, format: byte, description: 'Base64-encoded file content'}, type: {type: string, description: 'MIME type', example: image/png}}} '404': description: 'No profile photo found' '500': description: 'Internal server error' operationId: getUserProfilePhoto delete: summary: 'Delete profile photo' description: "Removes the profile photo from the user record and deletes the associated\nfile from the files table.\n" tags: - Users security: - bearerAuth: [] parameters: - in: path name: id required: true schema: type: integer description: 'User ID' responses: '200': description: 'Profile photo deleted' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: boolean, description: 'true if photo was deleted'} '500': description: 'Internal server error' operationId: deleteUserProfilePhoto '/vendorRisks/by-projid/{id}': get: tags: - 'Vendor Risks' summary: 'Get All Vendor Risks' operationId: getAllVendorRisks security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: string - name: filter in: query required: false schema: type: string enum: - active - deleted - all default: active responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {type: array, items: {$ref: '#/components/schemas/VendorRiskResponse'}} '401': description: Unauthorized '500': description: 'Internal server error' '/vendorRisks/by-vendorid/{id}': get: tags: - 'Vendor Risks' summary: 'Get All Vendor Risks By Vendor Id' operationId: getAllVendorRisksByVendorId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer - name: filter in: query required: false schema: type: string enum: - active - deleted - all default: active responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {type: array, items: {$ref: '#/components/schemas/VendorRiskResponse'}} '401': description: Unauthorized '500': description: 'Internal server error' '/vendorRisks/by-frameworkid/{id}': get: summary: 'Get Vendor Risks By Framework Id' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Vendor Risks' operationId: getVendorRisksByFrameworkId security: - bearerAuth: [] /vendorRisks/all: get: tags: - 'Vendor Risks' summary: 'Get All Vendor Risks All Projects' operationId: getAllVendorRisksAllProjects security: - bearerAuth: [] parameters: - name: filter in: query required: false schema: type: string enum: - active - deleted - all default: active responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {type: array, items: {$ref: '#/components/schemas/VendorRiskAllProjectsResponse'}} '401': description: Unauthorized '500': description: 'Internal server error' '/vendorRisks/{id}': get: tags: - 'Vendor Risks' summary: 'Get Vendor Risk By Id' operationId: getVendorRiskById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/VendorRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - 'Vendor Risks' summary: 'Update Vendor Risk By Id' operationId: updateVendorRiskById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorRiskInput' responses: '202': description: Accepted content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/VendorRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'Vendor Risks' summary: 'Delete Vendor Risk By Id' operationId: deleteVendorRiskById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '202': description: Accepted content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/VendorRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' /vendorRisks: post: tags: - 'Vendor Risks' summary: 'Create Vendor Risk' operationId: createVendorRisk security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorRiskInput' responses: '201': description: 'Created successfully' content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/VendorRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' /vendors: get: tags: - Vendors summary: 'Get all vendors' description: 'Retrieves all vendors for the authenticated user''s organization, ordered by creation date descending. Each vendor includes its associated project IDs and the reviewer''s full name.' security: - bearerAuth: [] responses: '200': description: 'Vendors retrieved successfully' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {$ref: '#/components/schemas/VendorWithReviewerName'}} '204': description: 'No vendors found' content: application/json: schema: type: object properties: message: {type: string, example: 'No Content'} data: {type: 'null'} '401': description: 'Unauthorized - missing or invalid JWT' '500': description: 'Internal server error' content: application/json: schema: type: object properties: message: {type: string, example: 'Internal Server Error'} error: {type: string} operationId: getAllVendors post: tags: - Vendors summary: 'Create a vendor' description: "Creates a new vendor in the authenticated user's organization.\nValidates required fields, checks demo restrictions, associates\nprojects via the vendors_projects join table, records creation\nin change history, fires automation triggers (vendor_added),\nand sends in-app assignment notifications to assignee and reviewer.\n" security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorInput' responses: '201': description: 'Vendor created successfully' content: application/json: schema: type: object properties: message: {type: string, example: Created} data: {$ref: '#/components/schemas/Vendor'} '400': description: 'Validation error (missing or invalid required fields)' content: application/json: schema: type: object properties: message: {type: string, example: 'Bad Request'} data: {type: string, description: 'Validation error message'} '401': description: 'Unauthorized - missing or invalid JWT' '403': description: 'Business logic error (e.g. demo vendor restriction)' content: application/json: schema: type: object properties: message: {type: string, example: Forbidden} data: {type: string} '500': description: 'Internal server error' content: application/json: schema: type: object properties: message: {type: string, example: 'Internal Server Error'} error: {type: string} '503': description: 'Service unavailable - vendor creation returned null' content: application/json: schema: type: object properties: message: {type: string, example: 'Service Unavailable'} error: {type: object} operationId: createVendor '/vendors/project-id/{id}': get: tags: - Vendors summary: 'Get vendors by project ID' description: 'Retrieves all vendors associated with a specific project. Returns 404 if the project does not exist.' security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer description: 'Project ID' responses: '200': description: 'Vendors retrieved successfully' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {$ref: '#/components/schemas/Vendor'}} '401': description: 'Unauthorized - missing or invalid JWT' '404': description: 'Project not found' content: application/json: schema: type: object properties: message: {type: string, example: 'Not Found'} data: {type: array, items: {}} '500': description: 'Internal server error' content: application/json: schema: type: object properties: message: {type: string, example: 'Internal Server Error'} error: {type: string} operationId: getVendorByProjectId '/vendors/{id}': get: tags: - Vendors summary: 'Get vendor by ID' description: 'Retrieves a single vendor by its ID, including associated project IDs.' security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer description: 'Vendor ID' responses: '200': description: 'Vendor retrieved successfully' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/Vendor'} '401': description: 'Unauthorized - missing or invalid JWT' '404': description: 'Vendor not found' content: application/json: schema: type: object properties: message: {type: string, example: 'Not Found'} data: {type: 'null'} '500': description: 'Internal server error' content: application/json: schema: type: object properties: message: {type: string, example: 'Internal Server Error'} error: {type: string} operationId: getVendorById patch: tags: - Vendors summary: 'Update a vendor' description: "Partially updates an existing vendor. Only provided fields are updated.\nReview and scorecard fields can be explicitly set to null to clear them.\nRequired fields (vendor_name, vendor_provides, website, vendor_contact_person)\nare only updated if they have a non-empty value.\nRecords field-level changes in change history, fires automation triggers\n(vendor_updated), and sends in-app notifications when assignee or reviewer changes.\n" security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer description: 'Vendor ID' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VendorUpdate' responses: '202': description: 'Vendor updated successfully' content: application/json: schema: type: object properties: message: {type: string, example: Accepted} data: {$ref: '#/components/schemas/Vendor'} '400': description: 'Validation error' content: application/json: schema: type: object properties: message: {type: string, example: 'Bad Request'} data: {type: string} '401': description: 'Unauthorized - missing or invalid JWT, or missing userId/role' content: application/json: schema: type: object properties: message: {type: string, example: Unauthorized} '403': description: 'Business logic error (e.g. demo vendor restriction)' content: application/json: schema: type: object properties: message: {type: string, example: Forbidden} data: {type: string} '404': description: 'Vendor not found' content: application/json: schema: type: object properties: message: {type: string, example: 'Not Found'} data: {type: object} '500': description: 'Internal server error' content: application/json: schema: type: object properties: message: {type: string, example: 'Internal Server Error'} error: {type: string} operationId: updateVendorById delete: tags: - Vendors summary: 'Delete a vendor' description: "Deletes a vendor and all associated data in a transaction:\n1. Deletes vendor risks (vendor_risks table)\n2. Deletes project associations (vendors_projects table)\n3. Deletes the vendor record itself\nFires automation triggers (vendor_deleted).\n" security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer description: 'Vendor ID' responses: '202': description: 'Vendor deleted successfully' content: application/json: schema: type: object properties: message: {type: string, example: Accepted} data: {type: boolean, example: true} '401': description: 'Unauthorized - missing or invalid JWT' '404': description: 'Vendor not found' content: application/json: schema: type: object properties: message: {type: string, example: 'Not Found'} data: {type: object} '500': description: 'Internal server error' content: application/json: schema: type: object properties: message: {type: string, example: 'Internal Server Error'} error: {type: string} operationId: deleteVendorById '/vendors/{id}/riskSuggestions': get: summary: 'Get Vendor Risk Suggestions' responses: '200': description: Success '500': description: 'Internal server error' tags: - Vendors operationId: getVendorRiskSuggestions security: - bearerAuth: [] '/vendor-change-history/{id}': get: tags: - 'Change History' summary: 'Get Vendor Change History By Id' operationId: getVendorChangeHistoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /projects: get: summary: 'Get all projects' description: "Returns all projects visible to the authenticated user. Admins and SuperAdmins see all projects in the organization; other roles see only projects they own or are members of.\n" operationId: getAllProjects tags: - Projects security: - bearerAuth: [] responses: '200': description: 'List of projects retrieved successfully' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {$ref: '#/components/schemas/ProjectListItem'}} '401': description: 'Unauthorized — missing or invalid JWT' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' post: summary: 'Create a new project (use case)' description: "Creates a new project with associated members and frameworks. If an approval_workflow_id is provided, framework creation is deferred until the approval request is approved.\n" operationId: createProject tags: - Projects security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateProjectRequest' responses: '201': description: 'Project created successfully' content: application/json: schema: type: object properties: message: {type: string, example: Created} data: {type: object, properties: {project: {$ref: '#/components/schemas/Project'}, frameworks: {type: object, additionalProperties: true}}} '400': description: 'Validation error' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: 'Business logic error (e.g. framework not allowed)' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' '503': description: 'Service unavailable — project creation returned null' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '/projects/calculateProjectRisks/{id}': get: summary: 'Calculate project risk distribution' operationId: getProjectRisksCalculations tags: - Projects security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ProjectId' responses: '200': description: 'Risk calculations returned' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {$ref: '#/components/schemas/ProjectRiskCount'}} '204': description: 'No risk data available' content: application/json: schema: type: object properties: message: {type: string, example: 'No Content'} data: {nullable: true} '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' '/projects/calculateVendorRisks/{id}': get: summary: 'Calculate vendor risk distribution' operationId: getVendorRisksCalculations tags: - Projects security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ProjectId' responses: '200': description: 'Vendor risk calculations returned' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {$ref: '#/components/schemas/VendorRiskCount'}} '204': description: 'No vendor risk data available' content: application/json: schema: type: object properties: message: {type: string, example: 'No Content'} data: {nullable: true} '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' '/projects/{id}': get: summary: 'Get a project by ID' description: 'Returns a single project with its frameworks, owner name, members, and approval status.' operationId: getProjectById tags: - Projects security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ProjectId' responses: '200': description: 'Project found' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/ProjectDetail'} '404': description: 'Project not found' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' patch: summary: 'Update a project by ID' description: 'Partially updates a project and its member list. Only provided fields are updated.' operationId: updateProjectById tags: - Projects security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ProjectId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateProjectRequest' responses: '202': description: 'Project updated successfully' content: application/json: schema: type: object properties: message: {type: string, example: Accepted} data: {$ref: '#/components/schemas/ProjectWithMembers'} '400': description: 'Validation error' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: 'Business logic error' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: 'Project not found' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' delete: summary: 'Delete a project by ID' description: 'Deletes a project and all dependent entities (files, risks, members, framework data).' operationId: deleteProjectById tags: - Projects security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ProjectId' responses: '202': description: 'Project deleted successfully' content: application/json: schema: type: object properties: message: {type: string, example: Accepted} data: {type: boolean, example: true} '404': description: 'Project not found' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' '/projects/stats/{id}': get: summary: 'Get project statistics by ID' operationId: getProjectStatsById tags: - Projects security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ProjectId' responses: '202': description: 'Project stats retrieved' content: application/json: schema: type: object properties: message: {type: string, example: Accepted} data: {$ref: '#/components/schemas/ProjectStats'} '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' '/projects/complainces/{projid}': get: summary: 'Get compliance data for a project' operationId: getCompliances tags: - Projects security: - bearerAuth: [] parameters: - name: projid in: path required: true description: 'The project ID' schema: type: integer responses: '200': description: 'Compliance data returned' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {$ref: '#/components/schemas/ControlCategory'}} '404': description: 'Project not found' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' '/projects/compliance/progress/{id}': get: summary: 'Get compliance progress for a single project' operationId: projectComplianceProgress tags: - Projects security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ProjectId' responses: '200': description: 'Compliance progress returned' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/ComplianceProgress'} '404': description: 'Project not found' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' '/projects/assessment/progress/{id}': get: summary: 'Get assessment progress for a single project' operationId: projectAssessmentProgress tags: - Projects security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ProjectId' responses: '200': description: 'Assessment progress returned' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/AssessmentProgress'} '404': description: 'Project not found' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' '/projects/{id}/eu-ai-act-classification': get: summary: 'Get Use Case Classification' responses: '200': description: Success '500': description: 'Internal server error' tags: - Projects operationId: getUseCaseClassification security: - bearerAuth: [] post: summary: 'Classify Use Case' responses: '200': description: Success '500': description: 'Internal server error' tags: - Projects operationId: classifyUseCase security: - bearerAuth: [] /projects/all/compliance/progress: get: summary: 'Get compliance progress across all projects' operationId: allProjectsComplianceProgress tags: - Projects security: - bearerAuth: [] responses: '200': description: 'Aggregated compliance progress returned' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/ComplianceProgress'} '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: 'No projects found' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' /projects/all/assessment/progress: get: summary: 'Get assessment progress across all projects' operationId: allProjectsAssessmentProgress tags: - Projects security: - bearerAuth: [] responses: '200': description: 'Aggregated assessment progress returned' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/AssessmentProgress'} '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: 'No projects found' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' '/projects/{id}/status': patch: summary: 'Update project status' operationId: updateProjectStatus tags: - Projects security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/ProjectId' requestBody: required: true content: application/json: schema: type: object required: - status properties: status: $ref: '#/components/schemas/ProjectStatus' responses: '200': description: 'Project status updated successfully' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/ProjectWithMembers'} '404': description: 'Project not found' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' /eu-ai-act-classification/questionnaire: get: summary: 'Get Questionnaire' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Eu Ai Act Classification' operationId: getQuestionnaire security: - bearerAuth: [] /eu-ai-act-classification/score: post: summary: 'Score Answers' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Eu Ai Act Classification' operationId: scoreAnswers security: - bearerAuth: [] /questions: get: tags: - Assessments summary: 'Get All Questions' operationId: getAllQuestions security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/questions/{id}': get: tags: - Assessments summary: 'Get Question By Id' operationId: getQuestionById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/questions/bysubtopic/{id}': get: tags: - Assessments summary: 'Get Questions By Subtopic Id' operationId: getQuestionsBySubtopicId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/questions/bytopic/{id}': get: tags: - Assessments summary: 'Get Questions By Topic Id' operationId: getQuestionsByTopicId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /autoDrivers: post: tags: - 'Demo Data' summary: 'Post Auto Driver' operationId: postAutoDriver security: - bearerAuth: [] description: 'Requires role: Admin' requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' delete: tags: - 'Demo Data' summary: 'Delete Auto Driver' operationId: deleteAutoDriver security: - bearerAuth: [] description: 'Requires role: Admin' responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /assessments: get: tags: - Assessments summary: 'Get All Assessments' operationId: getAllAssessments security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: summary: 'Create Assessment' responses: '200': description: Success '500': description: 'Internal server error' tags: - Assessments operationId: createAssessment security: - bearerAuth: [] '/assessments/getAnswers/{id}': get: tags: - Assessments summary: 'Get Answers' operationId: getAnswers security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/assessments/{id}': get: tags: - Assessments summary: 'Get Assessment By Id' operationId: getAssessmentById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' put: summary: 'Update Assessment By Id' responses: '200': description: Success '500': description: 'Internal server error' tags: - Assessments operationId: updateAssessmentById security: - bearerAuth: [] delete: summary: 'Delete Assessment By Id' responses: '200': description: Success '500': description: 'Internal server error' tags: - Assessments operationId: deleteAssessmentById security: - bearerAuth: [] '/assessments/project/byid/{id}': get: tags: - Assessments summary: 'Get Assessment By Project Id' operationId: getAssessmentByProjectId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /projectRisks: get: tags: - 'Project Risks' summary: 'Get All Risks' operationId: getAllRisks security: - bearerAuth: [] parameters: - name: filter in: query required: false schema: type: string enum: - active - deleted - all default: active description: 'Filter by soft-delete state.' responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {type: array, items: {$ref: '#/components/schemas/ProjectRiskResponse'}} '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'Project Risks' summary: 'Create Risk' operationId: createRisk security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProjectRiskInput' responses: '201': description: 'Created successfully' content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/ProjectRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' '/projectRisks/by-projid/{id}': get: tags: - 'Project Risks' summary: 'Get Risks By Project' operationId: getRisksByProject security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: string - name: filter in: query required: false schema: type: string enum: - active - deleted - all default: active responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {type: array, items: {$ref: '#/components/schemas/ProjectRiskResponse'}} '401': description: Unauthorized '500': description: 'Internal server error' '/projectRisks/by-frameworkid/{id}': get: tags: - 'Project Risks' summary: 'Get Risks By Framework' operationId: getRisksByFramework security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer - name: filter in: query required: false schema: type: string enum: - active - deleted - all default: active responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {type: array, items: {$ref: '#/components/schemas/ProjectRiskResponse'}} '401': description: Unauthorized '500': description: 'Internal server error' '/projectRisks/{id}': get: tags: - 'Project Risks' summary: 'Get Risk By Id' operationId: getRiskById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/ProjectRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' put: tags: - 'Project Risks' summary: 'Update Risk By Id' operationId: updateRiskById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProjectRiskInput' responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/ProjectRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'Project Risks' summary: 'Delete Risk By Id' operationId: deleteRiskById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/ProjectRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' /projectRisks/bulk: patch: summary: 'Bulk Update Project Risks' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Project Risks' operationId: bulkUpdateProjectRisks security: - bearerAuth: [] description: 'Requires role: Admin or Editor' /projectRisks/suggest-ai: post: summary: 'Suggest Risks With AI' responses: '200': description: 'Suggestions generated' content: application/json: schema: type: object properties: message: {type: string} data: {type: object, properties: {matched: {type: array, items: {type: object, properties: {source: {type: string, enum: [mit, ibm]}, id: {type: integer}, summary: {type: string}, description: {type: string}, risk_category: {type: array, items: {type: string}}, likelihood: {type: string}, severity: {type: string}, reason: {type: string}, ai_lifecycle_phase: {type: string}}}}, suggested: {type: array, items: {type: object, properties: {risk_name: {type: string}, risk_description: {type: string}, risk_category: {type: array, items: {type: string}}, ai_lifecycle_phase: {type: string}, likelihood: {type: integer, minimum: 1, maximum: 5}, severity: {type: integer, minimum: 1, maximum: 5}, impact: {type: string}, mitigation_plan: {type: string}}}}, suppressed_count: {type: integer}}} '400': description: 'Invalid request, or no LLM keys configured for the organization' '401': description: Unauthorized '404': description: 'Project not found' '429': description: 'Rate limit exceeded (10 requests per hour per user)' '500': description: 'Internal server error' '502': description: 'The configured AI provider rejected or failed the request' tags: - 'Project Risks' operationId: suggestRisksWithAI security: - bearerAuth: [] description: 'Read-only: the org-configured LLM returns matching entries from the built-in MIT and IBM risk catalogs plus free-form suggested risks for the use case of the project. Nothing is persisted. Rate limited to 10 requests per hour per user.' requestBody: required: true content: application/json: schema: type: object required: - projectId properties: projectId: type: integer minimum: 1 technologySummary: type: string maxLength: 2000 description: 'Optional technology summary; overrides project fields in the prompt.' llmKeyId: type: integer minimum: 1 description: 'Optional LLM key id; defaults to the most recent key of the organization.' /riskLinks/recompute: post: summary: 'Recompute All Risk Links' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: recomputeAllRiskLinks security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' /riskLinks/suggest-hierarchy: post: summary: 'Suggest Risk Hierarchy' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: suggestRiskHierarchy security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' /riskLinks: post: summary: 'Create Risk Link' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: createRiskLink security: - bearerAuth: [] description: 'Requires role: Admin or Editor' get: summary: 'Get Risk Graph' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: getRiskGraph security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' /riskLinks/dismissals: get: summary: 'Get Dismissal Analytics' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: getDismissalAnalytics security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' /riskLinks/duplicates: get: summary: 'Get Duplicate Candidates' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: getDuplicateCandidates security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' /riskLinks/coverage: get: summary: 'Get Control Coverage' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: getControlCoverage security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' /riskLinks/vendor-exposure: get: summary: 'Get Vendor Exposure' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: getVendorExposure security: - bearerAuth: [] /riskLinks/vendor-duplicates: get: summary: 'Get Vendor Duplicate Candidates' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: getVendorDuplicateCandidates security: - bearerAuth: [] /riskLinks/vendor-coverage: get: summary: 'Get Vendor Framework Coverage' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: getVendorFrameworkCoverage security: - bearerAuth: [] '/riskLinks/vendor-risks/{vendorRiskId}': get: summary: 'Get Vendor Risk Links' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: getVendorRiskLinks security: - bearerAuth: [] '/riskLinks/vendor-risks/{vendorRiskId}/shared-projects': get: summary: 'Get Vendor Risk Shared Projects' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: getVendorRiskSharedProjects security: - bearerAuth: [] /riskLinks/vendor-risks/recompute: post: summary: 'Recompute All Vendor Risk Links' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: recomputeAllVendorRiskLinks security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' '/riskLinks/vendor-risks/{vendorRiskId}/suggest-hierarchy': post: summary: 'Suggest Vendor Risk Hierarchy' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: suggestVendorRiskHierarchy security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' '/riskLinks/{riskId}': get: summary: 'Get Risk Links' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: getRiskLinks security: - bearerAuth: [] '/riskLinks/{riskId}/shared-projects': get: summary: 'Get Shared Projects' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: getSharedProjects security: - bearerAuth: [] '/riskLinks/{id}': patch: summary: 'Update Risk Link Status' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: updateRiskLinkStatus security: - bearerAuth: [] description: 'Requires role: Admin or Editor or Reviewer' '/riskLinks/{id}/acknowledge-parent-change': post: summary: 'Acknowledge Parent Level Change' responses: '200': description: Success '500': description: 'Internal server error' tags: - RiskLinks operationId: acknowledgeParentLevelChange security: - bearerAuth: [] description: 'Requires role: Admin or Editor' /roles: get: tags: - Roles summary: 'Get All Roles' operationId: getAllRoles security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: summary: 'Create Role' responses: '200': description: Success '500': description: 'Internal server error' tags: - Roles operationId: createRole security: - bearerAuth: [] /roles/permissions/catalog: get: summary: 'Get Permission Catalog' responses: '200': description: Success '500': description: 'Internal server error' tags: - Roles operationId: getPermissionCatalog security: - bearerAuth: [] /roles/my-permissions: get: summary: 'Get My Permissions' responses: '200': description: Success '500': description: 'Internal server error' tags: - Roles operationId: getMyPermissions security: - bearerAuth: [] '/roles/{id}': get: tags: - Roles summary: 'Get Role By Id' operationId: getRoleById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' put: summary: 'Update Role By Id' responses: '200': description: Success '500': description: 'Internal server error' tags: - Roles operationId: updateRoleById security: - bearerAuth: [] delete: summary: 'Delete Role By Id' responses: '200': description: Success '500': description: 'Internal server error' tags: - Roles operationId: deleteRoleById security: - bearerAuth: [] '/roles/{id}/permissions': get: summary: 'Get Role Permissions By Id' responses: '200': description: Success '500': description: 'Internal server error' tags: - Roles operationId: getRolePermissionsById security: - bearerAuth: [] put: summary: 'Replace Role Permissions' responses: '200': description: Success '500': description: 'Internal server error' tags: - Roles operationId: replaceRolePermissions security: - bearerAuth: [] /files: get: tags: - Files summary: 'Get User Files Meta Data' operationId: files_getAllFolders security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Files summary: 'Post File Content' operationId: files_createFolder security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/files/by-projid/{id}': get: tags: - Files summary: 'Get File Meta By Project Id' operationId: getFileMetaByProjectId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/files/entity/{framework_type}/{entity_type}/{entity_id}': get: tags: - Files summary: 'Get Entity Files' operationId: getEntityFiles security: - bearerAuth: [] parameters: - name: framework_type in: path required: true schema: type: string - name: entity_type in: path required: true schema: type: string - name: entity_id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /files/attach: post: tags: - Files summary: 'Attach File To Entity' operationId: attachFileToEntity security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /files/attach-bulk: post: tags: - Files summary: 'Attach Files To Entity' operationId: attachFilesToEntity security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /files/detach: delete: tags: - Files summary: 'Detach File From Entity' operationId: detachFileFromEntity security: - bearerAuth: [] responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /files/bulk-tags: patch: summary: 'Bulk Update File Tags' responses: '200': description: Success '500': description: 'Internal server error' tags: - Files operationId: bulkUpdateFileTags security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/files/{id}': get: tags: - Files summary: 'Get File Content By Id' operationId: files_getFolderById security: - bearerAuth: [] description: 'Requires role: Admin' parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' patch: tags: - Files summary: 'Update Folder' operationId: files_updateFolder security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Files summary: 'Delete Folder' operationId: files_deleteFolder security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /mail/invite: post: tags: - Mail summary: 'Invite a user' operationId: anonymous security: - bearerAuth: [] description: 'Requires the invitation.super permission (Admin by default). The invite always goes to the caller''s organization; an organizationId in the body is ignored, and a SuperAdmin without an organization uses /super-admin/organizations/{id}/invite. Only an Admin may grant a built-in role; other inviting roles may grant only the organization''s custom roles with no permission they lack.' requestBody: content: application/json: schema: type: object responses: '200': description: 'Invitation email sent' '206': description: 'Invitation saved but the email failed; the response carries the link' '400': description: 'Unknown or invalid role' '401': description: Unauthorized '403': description: 'Forbidden - missing permission, no organization, or the role grants more access than the caller has' '500': description: 'Internal server error' /mail/reset-password: post: tags: - Mail summary: Email operationId: mail_anonymous requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '500': description: 'Internal server error' /invitations: get: tags: - Invitations summary: 'Get Invitations' operationId: getInvitations security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/invitations/{id}': delete: tags: - Invitations summary: 'Revoke Invitation' operationId: revokeInvitation security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/invitations/{id}/resend': post: tags: - Invitations summary: 'Resend Invitation' operationId: resendInvitation security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /frameworks: get: tags: - Frameworks summary: 'Get All Frameworks' operationId: getAllFrameworks security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/frameworks/{id}': get: tags: - Frameworks summary: 'Get Framework By Id' operationId: getFrameworkById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /frameworks/toProject: post: tags: - Frameworks summary: 'Add Framework To Project' operationId: addFrameworkToProject security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /frameworks/fromProject: delete: tags: - Frameworks summary: 'Delete Framework From Project' operationId: deleteFrameworkFromProject security: - bearerAuth: [] responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/frameworks/{frameworkId}/tree/{projectId}': get: summary: 'Get framework tree' responses: '200': description: 'Framework tree' '400': description: 'Invalid parameters' '404': description: 'Framework not found or not attached to this project' '500': description: 'Internal server error' tags: - Frameworks operationId: getFrameworkTree security: - bearerAuth: [] description: 'Returns the framework metadata (id, key, framework_type, display_name, entity_types, hierarchy_type) and the full structure tree with the project''s implementation rows. Generic endpoint for the bundled frameworks declared in Servers/structures.' parameters: - name: frameworkId in: path required: true description: 'Framework id (the bundled frameworks use ids 5-25)' schema: type: integer - name: projectId in: path required: true description: 'Project (use case) id, or the organizational project id' schema: type: integer '/frameworks/{frameworkId}/dashboard/{projectFrameworkId}': get: summary: 'Get framework dashboard' responses: '200': description: 'Status counts' '400': description: 'Invalid parameters' '404': description: 'Framework not found or not attached to this project' '500': description: 'Internal server error' tags: - Frameworks operationId: getFrameworkDashboard security: - bearerAuth: [] description: 'Returns status counts for the framework''s implementation rows in the given project.' parameters: - name: frameworkId in: path required: true description: 'Framework id (the bundled frameworks use ids 5-25)' schema: type: integer - name: projectFrameworkId in: path required: true description: 'projects_frameworks row id linking the framework to the project' schema: type: integer '/frameworks/{frameworkId}/impl/{level}/{id}': get: summary: 'Get implementation row' responses: '200': description: 'Implementation row' '400': description: 'Invalid parameters' '404': description: 'Framework or record not found' '500': description: 'Internal server error' tags: - Frameworks operationId: getImplById security: - bearerAuth: [] description: 'Returns one implementation row (status, owner, reviewer, approver, due date, notes, evidence).' parameters: - name: frameworkId in: path required: true description: 'Framework id (the bundled frameworks use ids 5-25)' schema: type: integer - name: level in: path required: true description: 'Implementation level: l2 (two-level frameworks) or l3 (leaf level of three-level frameworks)' schema: type: string enum: - l2 - l3 - name: id in: path required: true description: 'Implementation row id' schema: type: integer patch: summary: 'Update implementation row' responses: '200': description: 'Updated implementation row' '400': description: 'Invalid parameters' '404': description: 'Framework or record not found' '500': description: 'Internal server error' tags: - Frameworks operationId: updateImpl security: - bearerAuth: [] description: 'Multipart form. Fields: status, implementation_description, owner, reviewer, approver, due_date, auditor_feedback, risksMitigated (JSON array), risksDelete (JSON array), delete (JSON array of file ids to detach), user_id; attach evidence as file parts.' parameters: - name: frameworkId in: path required: true description: 'Framework id (the bundled frameworks use ids 5-25)' schema: type: integer - name: level in: path required: true description: 'Implementation level: l2 (two-level frameworks) or l3 (leaf level of three-level frameworks)' schema: type: string enum: - l2 - l3 - name: id in: path required: true description: 'Implementation row id' schema: type: integer requestBody: content: multipart/form-data: schema: type: object properties: status: type: string implementation_description: type: string owner: type: string reviewer: type: string approver: type: string due_date: type: string auditor_feedback: type: string risksMitigated: type: string risksDelete: type: string delete: type: string user_id: type: string '/frameworks/{frameworkId}/impl/{level}/{id}/risks': get: summary: 'Get implementation row risks' responses: '200': description: 'Linked risks' '400': description: 'Invalid parameters' '404': description: 'Framework not found' '500': description: 'Internal server error' tags: - Frameworks operationId: getImplRisks security: - bearerAuth: [] description: 'Returns the risks linked to one implementation row.' parameters: - name: frameworkId in: path required: true description: 'Framework id (the bundled frameworks use ids 5-25)' schema: type: integer - name: level in: path required: true description: 'Implementation level: l2 (two-level frameworks) or l3 (leaf level of three-level frameworks)' schema: type: string enum: - l2 - l3 - name: id in: path required: true description: 'Implementation row id' schema: type: integer /eu-ai-act/controlCategories: get: tags: - 'EU AI Act' summary: 'Get All Control Categories' operationId: getAllControlCategories security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/eu-ai-act/controls/byControlCategoryId/{id}': get: tags: - 'EU AI Act' summary: 'Get Controls By Control Category Id' operationId: getControlsByControlCategoryId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /eu-ai-act/topics: get: tags: - 'EU AI Act' summary: 'Get All Topics' operationId: getAllTopics security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/eu-ai-act/assessments/byProjectId/{id}': get: tags: - 'EU AI Act' summary: 'Get Assessments By Project Id' operationId: getAssessmentsByProjectId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'EU AI Act' summary: 'Delete Assessments By Project Id' operationId: deleteAssessmentsByProjectId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/eu-ai-act/compliances/byProjectId/{id}': get: tags: - 'EU AI Act' summary: 'Get Compliances By Project Id' operationId: getCompliancesByProjectId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'EU AI Act' summary: 'Delete Compliances By Project Id' operationId: deleteCompliancesByProjectId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/eu-ai-act/compliances/progress/{id}': get: tags: - 'EU AI Act' summary: 'Get Project Compliance Progress' operationId: getProjectComplianceProgress security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/eu-ai-act/assessments/progress/{id}': get: tags: - 'EU AI Act' summary: 'Get Project Assessment Progress' operationId: getProjectAssessmentProgress security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /eu-ai-act/all/compliances/progress: get: tags: - 'EU AI Act' summary: 'Get All Projects Compliance Progress' operationId: getAllProjectsComplianceProgress security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /eu-ai-act/all/assessments/progress: get: tags: - 'EU AI Act' summary: 'Get All Projects Assessment Progress' operationId: getAllProjectsAssessmentProgress security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /eu-ai-act/topicById: get: tags: - 'EU AI Act' summary: 'Get Topic By Id' operationId: getTopicById security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /eu-ai-act/controlById: get: tags: - 'EU AI Act' summary: 'Get Control By Id' operationId: getControlById security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/eu-ai-act/saveControls/{id}': patch: tags: - 'EU AI Act' summary: 'Save Controls' operationId: saveControls security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/eu-ai-act/saveAnswer/{id}': patch: tags: - 'EU AI Act' summary: 'Update Question By Id' operationId: updateQuestionById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /organizations/exists: get: tags: - Organizations summary: 'Get Organizations Exists' operationId: getOrganizationsExists responses: '200': description: Success '500': description: 'Internal server error' '/organizations/{id}': get: tags: - Organizations summary: 'Get Organization By Id' operationId: getOrganizationById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - Organizations summary: 'Update Organization By Id' operationId: updateOrganizationById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' description: 'Requires role: Admin' /organizations: post: tags: - Organizations summary: 'Create Organization' operationId: createOrganization security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' description: 'Requires role: Super Admin' '/organizations/{id}/onboarding-status': patch: tags: - Organizations summary: 'Update Onboarding Status' operationId: updateOnboardingStatus security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' description: 'Requires role: Admin' /iso-42001/clauses: get: tags: - 'ISO 42001' summary: 'Get All Clauses' operationId: getAllClauses security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/clauses/struct/byProjectId/{id}': get: tags: - 'ISO 42001' summary: 'Get All Clauses Struct For Project' operationId: getAllClausesStructForProject security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /iso-42001/annexes: get: tags: - 'ISO 42001' summary: 'Get All Annexes' operationId: getAllAnnexes security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/annexes/struct/byProjectId/{id}': get: tags: - 'ISO 42001' summary: 'Get All Annexes Struct For Project' operationId: getAllAnnexesStructForProject security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/clauses/byProjectId/{id}': get: tags: - 'ISO 42001' summary: 'Get Clauses By Project Id' operationId: getClausesByProjectId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'ISO 42001' summary: 'Delete Management System Clauses' operationId: deleteManagementSystemClauses security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/annexes/byProjectId/{id}': get: tags: - 'ISO 42001' summary: 'Get Annexes By Project Id' operationId: getAnnexesByProjectId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'ISO 42001' summary: 'Delete Reference Controls' operationId: deleteReferenceControls security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/subClauses/byClauseId/{id}': get: tags: - 'ISO 42001' summary: 'Get Sub Clauses By Clause Id' operationId: getSubClausesByClauseId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/annexCategories/byAnnexId/{id}': get: tags: - 'ISO 42001' summary: 'Get Annex Categories By Annex Id' operationId: getAnnexCategoriesByAnnexId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/subClause/byId/{id}': get: tags: - 'ISO 42001' summary: 'Get Sub Clause By Id' operationId: getSubClauseById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/subclauses/{id}/risks': get: tags: - 'ISO 42001' summary: 'Get Sub Clause Risks' operationId: getSubClauseRisks security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/annexCategories/{id}/risks': get: tags: - 'ISO 42001' summary: 'Get Annex Category Risks' operationId: getAnnexCategoryRisks security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/annexCategory/byId/{id}': get: tags: - 'ISO 42001' summary: 'Get Annex Category By Id' operationId: getAnnexCategoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/clauses/progress/{id}': get: tags: - 'ISO 42001' summary: 'Get Project Clauses Progress' operationId: getProjectClausesProgress security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/annexes/progress/{id}': get: tags: - 'ISO 42001' summary: 'Get Project Annxes Progress' operationId: getProjectAnnxesProgress security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /iso-42001/all/clauses/progress: get: tags: - 'ISO 42001' summary: 'Get All Projects Clauses Progress' operationId: getAllProjectsClausesProgress security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /iso-42001/all/annexes/progress: get: tags: - 'ISO 42001' summary: 'Get All Projects Annxes Progress' operationId: getAllProjectsAnnxesProgress security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/clauses/assignments/{id}': get: tags: - 'ISO 42001' summary: 'Get Project Clauses Assignments' operationId: getProjectClausesAssignments security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/annexes/assignments/{id}': get: tags: - 'ISO 42001' summary: 'Get Project Annexes Assignments' operationId: getProjectAnnexesAssignments security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/saveClauses/{id}': patch: tags: - 'ISO 42001' summary: 'Save Clauses' operationId: saveClauses security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-42001/saveAnnexes/{id}': patch: tags: - 'ISO 42001' summary: 'Save Annexes' operationId: saveAnnexes security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /iso-27001/clauses: get: tags: - 'ISO 27001' summary: 'Get All Clauses' operationId: iso_27001_getAllClauses security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/clauses/struct/byProjectId/{id}': get: tags: - 'ISO 27001' summary: 'Get All Clauses Struct For Project' operationId: iso_27001_getAllClausesStructForProject security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /iso-27001/annexes: get: tags: - 'ISO 27001' summary: 'Get All Annexes' operationId: iso_27001_getAllAnnexes security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/annexes/struct/byProjectId/{id}': get: tags: - 'ISO 27001' summary: 'Get All Annexes Struct For Project' operationId: iso_27001_getAllAnnexesStructForProject security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/clauses/byProjectId/{id}': get: tags: - 'ISO 27001' summary: 'Get Clauses By Project Id' operationId: iso_27001_getClausesByProjectId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'ISO 27001' summary: 'Delete Management System Clauses' operationId: iso_27001_deleteManagementSystemClauses security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/annexes/byProjectId/{id}': get: tags: - 'ISO 27001' summary: 'Get Annexes By Project Id' operationId: iso_27001_getAnnexesByProjectId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'ISO 27001' summary: 'Delete Reference Controls' operationId: iso_27001_deleteReferenceControls security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/subClauses/byClauseId/{id}': get: tags: - 'ISO 27001' summary: 'Get Sub Clauses By Clause Id' operationId: iso_27001_getSubClausesByClauseId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/annexControls/byAnnexId/{id}': get: tags: - 'ISO 27001' summary: 'Get Annex Controls By Annex Id' operationId: getAnnexControlsByAnnexId security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/subClause/byId/{id}': get: tags: - 'ISO 27001' summary: 'Get Sub Clause By Id' operationId: iso_27001_getSubClauseById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/annexControl/byId/{id}': get: tags: - 'ISO 27001' summary: 'Get Annex Control By Id' operationId: getAnnexControlById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/clauses/progress/{id}': get: tags: - 'ISO 27001' summary: 'Get Project Clauses Progress' operationId: iso_27001_getProjectClausesProgress security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/annexes/progress/{id}': get: tags: - 'ISO 27001' summary: 'Get Project Annxes Progress' operationId: iso_27001_getProjectAnnxesProgress security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /iso-27001/all/clauses/progress: get: tags: - 'ISO 27001' summary: 'Get All Projects Clauses Progress' operationId: iso_27001_getAllProjectsClausesProgress security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /iso-27001/all/annexes/progress: get: tags: - 'ISO 27001' summary: 'Get All Projects Annxes Progress' operationId: iso_27001_getAllProjectsAnnxesProgress security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/clauses/assignments/{id}': get: tags: - 'ISO 27001' summary: 'Get Project Clauses Assignments' operationId: iso_27001_getProjectClausesAssignments security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/annexes/assignments/{id}': get: tags: - 'ISO 27001' summary: 'Get Project Annexes Assignments' operationId: iso_27001_getProjectAnnexesAssignments security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/saveClauses/{id}': patch: tags: - 'ISO 27001' summary: 'Save Clauses' operationId: iso_27001_saveClauses security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/iso-27001/saveAnnexes/{id}': patch: tags: - 'ISO 27001' summary: 'Save Annexes' operationId: iso_27001_saveAnnexes security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /training: get: tags: - Training summary: 'Get All Training Registar' operationId: getAllTrainingRegistar security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Training summary: 'Create New Training Registar' operationId: createNewTrainingRegistar security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/training/training-id/{id}': get: tags: - Training summary: 'Get Training Registar By Id' operationId: getTrainingRegistarById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/training/{id}': patch: tags: - Training summary: 'Update Training Registar By Id' operationId: updateTrainingRegistarById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Training summary: 'Delete Training Registar By Id' operationId: deleteTrainingRegistarById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /aiTrustCentre/overview: get: tags: - 'AI Trust Centre' summary: 'Get A I Trust Centre Overview' operationId: getAITrustCentreOverview security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' put: tags: - 'AI Trust Centre' summary: 'Update A I Trust Overview' operationId: updateAITrustOverview security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /aiTrustCentre/resources: get: tags: - 'AI Trust Centre' summary: 'Get A I Trust Centre Resources' operationId: getAITrustCentreResources security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'AI Trust Centre' summary: 'Create A I Trust Resource' operationId: createAITrustResource security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /aiTrustCentre/subprocessors: get: tags: - 'AI Trust Centre' summary: 'Get A I Trust Centre Subprocessors' operationId: getAITrustCentreSubprocessors security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'AI Trust Centre' summary: 'Create A I Trust Subprocessor' operationId: createAITrustSubprocessor security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/aiTrustCentre/{hash}': get: tags: - 'AI Trust Centre' summary: 'Get A I Trust Centre Public Page' operationId: getAITrustCentrePublicPage parameters: - name: hash in: path required: true schema: type: string responses: '200': description: Success '500': description: 'Internal server error' '/aiTrustCentre/{hash}/logo': get: tags: - 'AI Trust Centre' summary: 'Get Company Logo' operationId: getCompanyLogo parameters: - name: hash in: path required: true schema: type: string responses: '200': description: Success '500': description: 'Internal server error' '/aiTrustCentre/{hash}/resources/{id}': get: tags: - 'AI Trust Centre' summary: 'Get A I Trust Centre Public Resource' operationId: getAITrustCentrePublicResource parameters: - name: hash in: path required: true schema: type: string - name: id in: path required: true schema: type: integer responses: '200': description: Success '500': description: 'Internal server error' /aiTrustCentre/logo: post: tags: - 'AI Trust Centre' summary: 'Upload company logo' operationId: uploadCompanyLogo security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'AI Trust Centre' summary: 'Delete Company Logo' operationId: deleteCompanyLogo security: - bearerAuth: [] responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/aiTrustCentre/resources/{id}': put: tags: - 'AI Trust Centre' summary: 'Update A I Trust Resource' operationId: updateAITrustResource security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'AI Trust Centre' summary: 'Delete A I Trust Resource' operationId: deleteAITrustResource security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/aiTrustCentre/subprocessors/{id}': put: tags: - 'AI Trust Centre' summary: 'Update A I Trust Subprocessor' operationId: updateAITrustSubprocessor security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'AI Trust Centre' summary: 'Delete A I Trust Subprocessor' operationId: deleteAITrustSubprocessor security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /logger/events: get: tags: - System summary: 'Get Events' operationId: getEvents security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /logger/logs: get: tags: - System summary: 'Get Logs' operationId: getLogs security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /modelInventory: get: tags: - 'Model Inventory' summary: 'Get all model inventories' description: "Returns every model inventory record belonging to the caller's organization, ordered by created_at DESC, id ASC. Each record includes its associated project and framework IDs.\n" operationId: getAllModelInventories security: - bearerAuth: [] responses: '200': description: 'List of model inventories (may be empty)' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {$ref: '#/components/schemas/ModelInventoryResponse'}} '401': description: 'Missing or invalid JWT' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' post: tags: - 'Model Inventory' summary: 'Create a new model inventory' description: "Creates a model inventory record, links it to the supplied project and framework IDs, records a change-history entry, fires any \"model_added\" automations, and notifies the approver (if set).\n" operationId: createNewModelInventory security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ModelInventoryCreateRequest' responses: '201': description: 'Model inventory created' content: application/json: schema: type: object properties: message: {type: string, example: Created} data: {$ref: '#/components/schemas/ModelInventoryResponse'} '401': description: 'Missing or invalid JWT' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' /modelInventory/evaluations: get: tags: - 'Model Inventory' summary: 'Get All Model Evaluations' operationId: getAllModelEvaluations security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/modelInventory/{id}/evaluations': get: tags: - 'Model Inventory' summary: 'Get Model Evaluations' operationId: getModelEvaluations security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/modelInventory/{id}': get: tags: - 'Model Inventory' summary: 'Get a model inventory by ID' description: "Returns a single model inventory record with its associated project and framework IDs. Returns 204 if the record does not exist.\n" operationId: getModelInventoryById security: - bearerAuth: [] parameters: - name: id in: path required: true description: 'Model inventory ID' schema: type: integer responses: '200': description: 'Model inventory found' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/ModelInventoryResponse'} '204': description: 'No model inventory found for the given ID' content: application/json: schema: type: object properties: message: {type: string, example: 'No Content'} data: {nullable: true} '401': description: 'Missing or invalid JWT' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' patch: tags: - 'Model Inventory' summary: 'Update a model inventory by ID' description: "Partially updates a model inventory record. All body fields are optional; only provided fields are changed. Project and framework associations can be replaced or cleared. Fires \"model_updated\" automations and notifies a new approver if changed.\n" operationId: updateModelInventoryById security: - bearerAuth: [] parameters: - name: id in: path required: true description: 'Model inventory ID' schema: type: integer requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ModelInventoryUpdateRequest' responses: '200': description: 'Model inventory updated' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/ModelInventoryResponse'} '401': description: 'Missing or invalid JWT' '404': description: 'Model inventory not found' content: application/json: schema: type: object properties: message: {type: string, example: 'Not Found'} data: {type: string, example: 'Model inventory not found'} '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' delete: tags: - 'Model Inventory' summary: 'Delete a model inventory by ID' description: "Deletes a model inventory record and its project/framework associations. Optionally deletes linked model risks when deleteRisks=true. Records deletion in change history and fires \"model_deleted\" automations.\n" operationId: deleteModelInventoryById security: - bearerAuth: [] parameters: - name: id in: path required: true description: 'Model inventory ID' schema: type: integer - name: deleteRisks in: query required: false description: "When \"true\", also deletes associated rows from the model_risks table.\n" schema: type: string enum: - 'true' - 'false' default: 'false' responses: '200': description: 'Model inventory deleted' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: string, example: 'Model inventory deleted successfully'} '401': description: 'Missing or invalid JWT' '404': description: 'Model inventory not found' content: application/json: schema: type: object properties: message: {type: string, example: 'Not Found'} data: {type: string, example: 'Model inventory not found'} '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' '/modelInventory/by-projectId/{projectId}': get: tags: - 'Model Inventory' summary: 'Get model inventories by project ID' description: "Returns all model inventories associated with a project (via the model_inventories_projects_frameworks join table where framework_id IS NULL). Non-numeric project IDs return an empty array.\n" operationId: getModelByProjectId security: - bearerAuth: [] parameters: - name: projectId in: path required: true description: 'Project ID (integer). Non-numeric values return an empty array.' schema: type: integer responses: '200': description: 'List of model inventories for the project (may be empty)' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {$ref: '#/components/schemas/ModelInventoryResponse'}} '401': description: 'Missing or invalid JWT' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' '/modelInventory/by-frameworkId/{frameworkId}': get: tags: - 'Model Inventory' summary: 'Get model inventories by framework ID' description: "Returns all model inventories associated with a framework (via the model_inventories_projects_frameworks join table where framework_id matches).\n" operationId: getModelByFrameworkId security: - bearerAuth: [] parameters: - name: frameworkId in: path required: true description: 'Framework ID' schema: type: integer responses: '200': description: 'List of model inventories for the framework (may be empty)' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {$ref: '#/components/schemas/ModelInventoryResponse'}} '401': description: 'Missing or invalid JWT' '500': description: 'Internal server error' content: application/json: schema: $ref: '#/components/schemas/ServerError' /modelInventoryHistory/timeseries: get: tags: - 'Model Inventory' summary: 'Get Timeseries' operationId: getTimeseries security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /modelInventoryHistory/current-counts: get: tags: - 'Model Inventory' summary: 'Get Current Counts' operationId: getCurrentCounts security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /modelInventoryHistory/snapshot: post: tags: - 'Model Inventory' summary: 'Create Snapshot' operationId: createSnapshot security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /extensions: get: summary: 'List extensions' responses: '200': description: 'List of extensions' '401': description: 'Not authenticated' '500': description: 'Internal server error' tags: - Extensions operationId: listExtensions security: - bearerAuth: [] description: 'Lists every built-in extension in the catalog with its config field definitions, whether it is enabled for the caller''s organization, and its configuration with secret fields removed. Available to any authenticated user.' parameters: - name: category in: query required: false description: 'Filter by category: communication, ml_ops, data_management, version_control, monitoring, security or analytics' schema: type: string '/extensions/{key}': get: summary: 'Get extension' responses: '200': description: 'Extension detail' '400': description: 'Invalid extension key format' '401': description: 'Not authenticated' '404': description: 'Extension not found' '500': description: 'Internal server error' tags: - Extensions operationId: getExtension security: - bearerAuth: [] description: 'Returns one extension: catalog metadata, config field definitions, per-organization enabled state and redacted configuration. Available to any authenticated user.' parameters: - name: key in: path required: true description: 'Extension key: slack, mlflow, azure-ai-foundry, model-lifecycle, risk-import, jira-assets or dataset-bulk-upload' schema: type: string '/extensions/{key}/enable': post: summary: 'Enable extension' responses: '200': description: 'Extension enabled' '400': description: 'Invalid key or configuration' '401': description: 'Not authenticated' '403': description: 'Admin role required' '404': description: 'Extension not found' '500': description: 'Internal server error' tags: - Extensions operationId: enableExtension security: - bearerAuth: [] description: 'Enables the extension for the caller''s organization. Optional body { configuration } is validated against the extension''s config fields; secret fields are encrypted at rest. Admin only. Requires role: Admin' parameters: - name: key in: path required: true description: 'Extension key: slack, mlflow, azure-ai-foundry, model-lifecycle, risk-import, jira-assets or dataset-bulk-upload' schema: type: string requestBody: required: false content: application/json: schema: type: object properties: configuration: type: object '/extensions/{key}/disable': post: summary: 'Disable extension' responses: '200': description: 'Extension disabled' '400': description: 'Invalid extension key format' '401': description: 'Not authenticated' '403': description: 'Admin role required' '404': description: 'Extension not found' '500': description: 'Internal server error' tags: - Extensions operationId: disableExtension security: - bearerAuth: [] description: 'Disables the extension for the caller''s organization. Configuration and data are kept, so enabling it again restores the previous setup. Admin only. Requires role: Admin' parameters: - name: key in: path required: true description: 'Extension key: slack, mlflow, azure-ai-foundry, model-lifecycle, risk-import, jira-assets or dataset-bulk-upload' schema: type: string '/extensions/{key}/configuration': patch: summary: 'Update extension configuration' responses: '200': description: 'Configuration updated' '400': description: 'Invalid key or configuration' '401': description: 'Not authenticated' '403': description: 'Admin role required' '404': description: 'Extension not found' '500': description: 'Internal server error' tags: - Extensions operationId: updateExtensionConfiguration security: - bearerAuth: [] description: 'Updates the stored configuration. Body { configuration }. Secret fields left out of the body keep their existing encrypted value. Admin only. Requires role: Admin' parameters: - name: key in: path required: true description: 'Extension key: slack, mlflow, azure-ai-foundry, model-lifecycle, risk-import, jira-assets or dataset-bulk-upload' schema: type: string requestBody: required: true content: application/json: schema: type: object required: - configuration properties: configuration: type: object '/extensions/{key}/test-connection': post: summary: 'Test extension connection' responses: '200': description: 'Connection test result' '400': description: 'Invalid extension key format' '401': description: 'Not authenticated' '403': description: 'Admin role required' '404': description: 'Extension not found' '500': description: 'Internal server error' tags: - Extensions operationId: testExtensionConnection security: - bearerAuth: [] description: 'Checks that the extension can reach its remote service. The submitted { configuration } is overlaid on the stored configuration. Supported for mlflow, azure-ai-foundry and jira-assets; other keys return 200 with success false. Returns { success, message, testedAt }. Admin only. Requires role: Admin' parameters: - name: key in: path required: true description: 'Extension key: slack, mlflow, azure-ai-foundry, model-lifecycle, risk-import, jira-assets or dataset-bulk-upload' schema: type: string requestBody: required: false content: application/json: schema: type: object properties: configuration: type: object /extensions/dataset-bulk-upload/upload: post: summary: 'Upload Dataset File' responses: '200': description: Success '400': description: 'No file or invalid metadata JSON' '403': description: 'Extension not enabled for this organization, or role not allowed' '413': description: 'File too large' '415': description: 'Unsupported file type' '500': description: 'Internal server error' tags: - Extensions operationId: uploadDatasetFile security: - bearerAuth: [] description: 'Uploads one CSV, XLS or XLSX file (multipart field file, max 30 MB) with an optional metadata JSON string and creates a dataset record; the bulk upload screen calls it once per file. Requires the dataset-bulk-upload extension to be enabled for the organization (403 otherwise). Requires role: Admin or Editor' requestBody: required: true content: multipart/form-data: schema: type: object required: - file properties: file: type: string metadata: type: string /extensions/risk-import/template: get: summary: 'Download Excel Template' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: downloadExcelTemplate security: - bearerAuth: [] description: 'Requires the risk-import extension to be enabled for the organization (403 otherwise). Requires role: Admin or Editor' /extensions/risk-import/import: post: summary: 'Bulk Import Risks' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: bulkImportRisks security: - bearerAuth: [] description: 'Requires the risk-import extension to be enabled for the organization (403 otherwise). Requires role: Admin or Editor' /extensions/slack/oauth/workspaces: get: summary: 'Get All Slack Webhooks' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getAllSlackWebhooks security: - bearerAuth: [] description: 'Requires the slack extension to be enabled for the organization (403 otherwise).' post: summary: 'Create New Slack Webhook' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: createNewSlackWebhook security: - bearerAuth: [] description: 'Requires the slack extension to be enabled for the organization (403 otherwise).' '/extensions/slack/oauth/workspaces/{id}': get: summary: 'Get Slack Webhook By Id' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getSlackWebhookById security: - bearerAuth: [] description: 'Requires the slack extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer patch: summary: 'Update Slack Webhook By Id' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: updateSlackWebhookById security: - bearerAuth: [] description: 'Requires the slack extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer delete: summary: 'Delete Slack Webhook By Id' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: deleteSlackWebhookById security: - bearerAuth: [] description: 'Requires the slack extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer '/extensions/slack/oauth/workspaces/{id}/send': post: summary: 'Send Slack Message' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: sendSlackMessage security: - bearerAuth: [] description: 'Requires the slack extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer /extensions/mlflow/models: get: summary: 'List Models' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: listModels security: - bearerAuth: [] description: 'Requires the mlflow extension to be enabled for the organization (403 otherwise).' /extensions/mlflow/sync: post: summary: 'Sync From Mlflow' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: syncFromMlflow security: - bearerAuth: [] description: 'Requires the mlflow extension to be enabled for the organization (403 otherwise).' '/extensions/mlflow/models/{modelId}': get: summary: 'Get Model By Id' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getModelById security: - bearerAuth: [] description: 'Requires the mlflow extension to be enabled for the organization (403 otherwise).' parameters: - name: modelId in: path required: true description: 'The modelId' schema: type: string /extensions/azure-ai-foundry/models: get: summary: 'List Deployments' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: listDeployments security: - bearerAuth: [] description: 'Requires the azure-ai-foundry extension to be enabled for the organization (403 otherwise).' /extensions/azure-ai-foundry/sync: post: summary: 'Sync From Azure' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: syncFromAzure security: - bearerAuth: [] description: 'Requires the azure-ai-foundry extension to be enabled for the organization (403 otherwise).' '/extensions/azure-ai-foundry/models/{deploymentId}': get: summary: 'Get Deployment By Id' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getDeploymentById security: - bearerAuth: [] description: 'Requires the azure-ai-foundry extension to be enabled for the organization (403 otherwise).' parameters: - name: deploymentId in: path required: true description: 'The deploymentId' schema: type: string /extensions/azure-ai-foundry/discover: get: summary: 'Discover Ai Agents' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: discoverAiAgents security: - bearerAuth: [] description: 'Requires the azure-ai-foundry extension to be enabled for the organization (403 otherwise).' /extensions/jira-assets/config: get: summary: 'Get Config' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getConfig security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization (403 otherwise).' post: summary: 'Post Config' responses: '200': description: Success '400': description: 'Validation error (missing connection field, or sync_interval_hours outside 1-168)' '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: postConfig security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization and the extension.admin permission (Admin); 403 otherwise.' /extensions/jira-assets/config/sync: patch: summary: 'Patch Sync Settings' requestBody: required: true content: application/json: schema: type: object properties: sync_enabled: type: boolean sync_interval_hours: type: integer minimum: 1 maximum: 168 responses: '200': description: 'Updated sync settings ({ sync_enabled, sync_interval_hours })' '400': description: 'Validation error (no field given, non-boolean sync_enabled, or sync_interval_hours outside 1-168)' '403': description: 'Extension not enabled for this organization, or role not allowed' '404': description: 'No Jira connection saved yet' '500': description: 'Internal server error' tags: - Extensions operationId: patchSyncSettings security: - bearerAuth: [] description: 'Updates only the automatic-sync settings; connection fields are left untouched. Requires the jira-assets extension to be enabled for the organization and the extension.admin permission (Admin); 403 otherwise.' /extensions/jira-assets/config/selection: patch: summary: 'Patch Selection' requestBody: required: true content: application/json: schema: type: object properties: selected_schema_id: type: string nullable: true selected_object_type_id: type: string nullable: true responses: '200': description: 'Updated selection ({ selected_schema_id, selected_object_type_id })' '400': description: 'Validation error (no field given, or an id that is not a Jira id)' '403': description: 'Extension not enabled for this organization, or role not allowed' '404': description: 'No Jira connection saved yet' '500': description: 'Internal server error' tags: - Extensions operationId: patchSelection security: - bearerAuth: [] description: 'Updates only the selected schema and/or object type; a field left out is kept, null clears it. Requires the jira-assets extension to be enabled for the organization and the extension.admin permission (Admin); 403 otherwise.' /extensions/jira-assets/vw-attributes: get: summary: 'Get Vw Attributes' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getVwAttributes security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization (403 otherwise).' /extensions/jira-assets/schemas: get: summary: 'Get Schemas' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getSchemas security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization (403 otherwise).' '/extensions/jira-assets/schemas/{schemaId}/object-types': get: summary: 'Get Object Types' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getObjectTypes security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization (403 otherwise).' parameters: - name: schemaId in: path required: true description: 'The schemaId' schema: type: string '/extensions/jira-assets/object-types/{objectTypeId}/attributes': get: summary: 'Get Attributes' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getAttributes security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization (403 otherwise).' parameters: - name: objectTypeId in: path required: true description: 'The objectTypeId' schema: type: string '/extensions/jira-assets/object-types/{objectTypeId}/objects': get: summary: 'Get Objects' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '404': description: 'Jira Assets is not configured' '500': description: 'Internal server error' '502': description: 'Jira or network failure (reason in error)' tags: - Extensions operationId: getObjects security: - bearerAuth: [] description: 'One bounded page (up to 1000 objects) for the import picker. Requires the jira-assets extension to be enabled for the organization (403 otherwise).' parameters: - name: objectTypeId in: path required: true description: 'The objectTypeId' schema: type: string /extensions/jira-assets/import: post: summary: 'Post Import' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '404': description: 'Jira Assets is not configured' '409': description: 'A Jira Assets sync or import is already running for this organization' '500': description: 'Internal server error' '502': description: 'Jira or network failure (reason in error)' tags: - Extensions operationId: postImport security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization and the extension.admin permission (Admin); 403 otherwise.' /extensions/jira-assets/sync: post: summary: 'Post Sync' responses: '202': description: 'Sync claimed and queued for the worker ({ historyId }); poll GET /extensions/jira-assets/sync/status for the outcome' '400': description: 'No object type selected' '403': description: 'Extension not enabled for this organization, or role not allowed' '404': description: 'Jira Assets is not configured' '409': description: 'A Jira Assets sync or import is already running for this organization' '500': description: 'Internal server error' tags: - Extensions operationId: postSync security: - bearerAuth: [] description: 'Starts a manual sync in the background. Requires the jira-assets extension to be enabled for the organization and the extension.admin permission (Admin); 403 otherwise.' /extensions/jira-assets/sync/status: get: summary: 'Get Sync Status Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getSyncStatusCtrl security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization (403 otherwise).' /extensions/jira-assets/sync/history: get: summary: 'Get Sync History Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getSyncHistoryCtrl security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization (403 otherwise).' /extensions/jira-assets/use-cases: get: summary: 'List Use Cases Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: listUseCasesCtrl security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization (403 otherwise).' '/extensions/jira-assets/use-cases/{id}': get: summary: 'Get Use Case Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getUseCaseCtrl security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer delete: summary: 'Delete Use Case Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: deleteUseCaseCtrl security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization and the extension.admin permission (Admin); 403 otherwise.' parameters: - name: id in: path required: true description: 'The id' schema: type: integer '/extensions/jira-assets/projects/{projectId}/custom-frameworks-progress': get: summary: 'Get Custom Frameworks Progress Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getCustomFrameworksProgressCtrl security: - bearerAuth: [] description: 'Requires the jira-assets extension to be enabled for the organization (403 otherwise).' parameters: - name: projectId in: path required: true description: 'The projectId' schema: type: integer /extensions/model-lifecycle/config: get: summary: 'List Config' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: listConfig security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' /extensions/model-lifecycle/phases: post: summary: 'Create Phase Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: createPhaseCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' /extensions/model-lifecycle/phases/reorder: put: summary: 'Reorder Phases Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: reorderPhasesCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' '/extensions/model-lifecycle/phases/{id}': put: summary: 'Update Phase Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: updatePhaseCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer delete: summary: 'Delete Phase Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: deletePhaseCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer '/extensions/model-lifecycle/phases/{phaseId}/items': post: summary: 'Create Item Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: createItemCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: phaseId in: path required: true description: 'The phaseId' schema: type: integer '/extensions/model-lifecycle/phases/{phaseId}/items/reorder': put: summary: 'Reorder Items Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: reorderItemsCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: phaseId in: path required: true description: 'The phaseId' schema: type: integer '/extensions/model-lifecycle/items/{id}': put: summary: 'Update Item Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: updateItemCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer delete: summary: 'Delete Item Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: deleteItemCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer '/extensions/model-lifecycle/models/{id}/lifecycle': get: summary: 'Get Lifecycle Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getLifecycleCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer '/extensions/model-lifecycle/models/{id}/lifecycle/progress': get: summary: 'Get Progress Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: getProgressCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer '/extensions/model-lifecycle/models/{id}/lifecycle/items/{itemId}': put: summary: 'Upsert Value Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: upsertValueCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer - name: itemId in: path required: true description: 'The itemId' schema: type: integer '/extensions/model-lifecycle/models/{id}/lifecycle/items/{itemId}/files': post: summary: 'Attach File Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: attachFileCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer - name: itemId in: path required: true description: 'The itemId' schema: type: integer '/extensions/model-lifecycle/models/{id}/lifecycle/items/{itemId}/files/{fileId}': delete: summary: 'Detach File Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: detachFileCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer - name: itemId in: path required: true description: 'The itemId' schema: type: integer - name: fileId in: path required: true description: 'The fileId' schema: type: integer '/extensions/model-lifecycle/models/{id}/lifecycle/items/{itemId}/people': post: summary: 'Add Person Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: addPersonCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer - name: itemId in: path required: true description: 'The itemId' schema: type: integer '/extensions/model-lifecycle/models/{id}/lifecycle/items/{itemId}/people/{userId}': delete: summary: 'Remove Person Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: removePersonCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer - name: itemId in: path required: true description: 'The itemId' schema: type: integer - name: userId in: path required: true description: 'The userId' schema: type: integer '/extensions/model-lifecycle/models/{id}/lifecycle/items/{itemId}/approvals': post: summary: 'Add Approver Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: addApproverCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer - name: itemId in: path required: true description: 'The itemId' schema: type: integer '/extensions/model-lifecycle/models/{id}/lifecycle/items/{itemId}/approvals/{userId}': put: summary: 'Update Approval Status Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: updateApprovalStatusCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer - name: itemId in: path required: true description: 'The itemId' schema: type: integer - name: userId in: path required: true description: 'The userId' schema: type: integer delete: summary: 'Remove Approver Ctrl' responses: '200': description: Success '403': description: 'Extension not enabled for this organization, or role not allowed' '500': description: 'Internal server error' tags: - Extensions operationId: removeApproverCtrl security: - bearerAuth: [] description: 'Requires the model-lifecycle extension to be enabled for the organization (403 otherwise).' parameters: - name: id in: path required: true description: 'The id' schema: type: integer - name: itemId in: path required: true description: 'The itemId' schema: type: integer - name: userId in: path required: true description: 'The userId' schema: type: integer '/model-inventory-change-history/{id}': get: tags: - 'Change History' summary: 'Get Model Inventory Change History By Id' operationId: getModelInventoryChangeHistoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /mrm/tiering: get: summary: 'Get Fleet Tiering' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getFleetTiering security: - bearerAuth: [] '/mrm/models/{modelId}/tier': put: summary: 'Assign Model Tier' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: assignModelTier security: - bearerAuth: [] /mrm/validations: get: summary: 'Get Validations' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getValidations security: - bearerAuth: [] '/mrm/models/{modelId}/validations': post: summary: 'Create Validation' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: createValidation security: - bearerAuth: [] '/mrm/validations/{id}': patch: summary: 'Update Validation' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: updateValidation security: - bearerAuth: [] '/mrm/validations/{id}/signoff': post: summary: 'Signoff Validation' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: signoffValidation security: - bearerAuth: [] /mrm/findings: get: summary: 'Get Findings' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getFindings security: - bearerAuth: [] '/mrm/validations/{validationId}/findings': post: summary: 'Create Finding' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: createFinding security: - bearerAuth: [] '/mrm/findings/{id}': patch: summary: 'Update Finding' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: updateFinding security: - bearerAuth: [] '/mrm/models/{modelId}/roles': get: summary: 'Get Model Roles' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getModelRoles security: - bearerAuth: [] put: summary: 'Set Model Roles' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: setModelRoles security: - bearerAuth: [] /mrm/ingestion-tokens: get: summary: 'Get Ingestion Tokens' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getIngestionTokens security: - bearerAuth: [] post: summary: 'Create Ingestion Token' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: createIngestionToken security: - bearerAuth: [] '/mrm/ingestion-tokens/{id}/rotate': post: summary: 'Rotate Ingestion Token' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: rotateIngestionToken security: - bearerAuth: [] '/mrm/ingestion-tokens/{id}/revoke': post: summary: 'Revoke Ingestion Token' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: revokeIngestionToken security: - bearerAuth: [] /mrm/thresholds: get: summary: 'Get Thresholds' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getThresholds security: - bearerAuth: [] '/mrm/models/{modelId}/thresholds': post: summary: 'Create Threshold' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: createThreshold security: - bearerAuth: [] '/mrm/thresholds/{id}': patch: summary: 'Update Threshold' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: updateThreshold security: - bearerAuth: [] delete: summary: 'Delete Threshold' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: deleteThreshold security: - bearerAuth: [] /mrm/metric-keys: get: summary: 'Get Metric Keys' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getMetricKeys security: - bearerAuth: [] post: summary: 'Create Metric Key' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: createMetricKey security: - bearerAuth: [] '/mrm/models/{modelId}/monitoring': get: summary: 'Get Model Monitoring' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getModelMonitoring security: - bearerAuth: [] '/mrm/models/{modelId}/monitoring/trend': get: summary: 'Get Metric Trend' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getMetricTrend security: - bearerAuth: [] '/mrm/models/{modelId}/monitoring/breaches': get: summary: 'Get Breach History' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getBreachHistory security: - bearerAuth: [] '/mrm/models/{modelId}/request-revalidation': post: summary: 'Request Revalidation' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: requestRevalidation security: - bearerAuth: [] '/mrm/models/{modelId}/revalidation-events': get: summary: 'Get Revalidation Events' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getRevalidationEvents security: - bearerAuth: [] /mrm/revalidation/sweep: post: summary: 'Run Revalidation Sweep For Org' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: runRevalidationSweepForOrg security: - bearerAuth: [] /mrm/attestation/summary: get: summary: 'Get Attestation Summary Handler' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getAttestationSummaryHandler security: - bearerAuth: [] /mrm/attestation/report: get: summary: 'Generate Attestation Report Handler' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: generateAttestationReportHandler security: - bearerAuth: [] /mrm/settings: get: summary: 'Get Mrm Settings Handler' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: getMrmSettingsHandler security: - bearerAuth: [] put: summary: 'Update Mrm Settings Handler' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: updateMrmSettingsHandler security: - bearerAuth: [] '/mrm/models/{externalModelKey}/metrics': post: summary: 'Ingest Metrics' responses: '200': description: Success '500': description: 'Internal server error' tags: - Mrm operationId: ingestMetrics /datasets: get: tags: - Datasets summary: 'Get All Datasets' operationId: getAllDatasets security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Datasets summary: 'Create New Dataset' operationId: createNewDataset security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/datasets/{id}': get: tags: - Datasets summary: 'Get Dataset By Id' operationId: getDatasetById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - Datasets summary: 'Update Dataset By Id' operationId: updateDatasetById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Datasets summary: 'Delete Dataset By Id' operationId: deleteDatasetById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/datasets/by-model/{modelId}': get: tags: - Datasets summary: 'Get Datasets By Model Id' operationId: getDatasetsByModelId security: - bearerAuth: [] parameters: - name: modelId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/datasets/by-project/{projectId}': get: tags: - Datasets summary: 'Get Datasets By Project Id' operationId: getDatasetsByProjectId security: - bearerAuth: [] parameters: - name: projectId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/datasets/{id}/history': get: tags: - Datasets summary: 'Get Dataset History' operationId: getDatasetHistory security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /riskHistory/timeseries: get: tags: - 'Risk History' summary: 'Get Timeseries' operationId: riskHistory_getTimeseries security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /riskHistory/current-counts: get: tags: - 'Risk History' summary: 'Get Current Counts' operationId: riskHistory_getCurrentCounts security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /riskHistory/snapshot: post: tags: - 'Risk History' summary: 'Create Snapshot' operationId: riskHistory_createSnapshot security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /modelRisks: get: tags: - 'Model Risks' summary: 'Get All Model Risks' operationId: getAllModelRisks security: - bearerAuth: [] parameters: - name: filter in: query required: false schema: type: string enum: - active - deleted - all default: active responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {type: array, items: {$ref: '#/components/schemas/ModelRiskResponse'}} '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'Model Risks' summary: 'Create New Model Risk' operationId: createNewModelRisk security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ModelRiskInput' responses: '201': description: 'Created successfully' content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/ModelRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' '/modelRisks/{id}': get: tags: - 'Model Risks' summary: 'Get Model Risk By Id' operationId: getModelRiskById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/ModelRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' put: tags: - 'Model Risks' summary: 'Update Model Risk By Id' operationId: updateModelRiskById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ModelRiskInput' responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/ModelRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - 'Model Risks' summary: 'Update Model Risk By Id' operationId: modelRisks_updateModelRiskById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ModelRiskInput' responses: '200': description: Success content: application/json: schema: type: object properties: message: {type: string} data: {$ref: '#/components/schemas/ModelRiskResponse'} '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'Model Risks' summary: 'Delete Model Risk By Id' operationId: deleteModelRiskById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /reporting/templates: get: summary: 'List Templates' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Templates operationId: listTemplates security: - bearerAuth: [] post: summary: 'Create Template' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Templates operationId: createTemplate security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/reporting/templates/{id}': get: summary: 'Get Template' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Templates operationId: getTemplate security: - bearerAuth: [] patch: summary: 'Update Template' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Templates operationId: updateTemplate security: - bearerAuth: [] description: 'Requires role: Admin or Editor' delete: summary: 'Archive Template' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Templates operationId: archiveTemplate security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/reporting/templates/{id}/run': post: summary: 'Run Template Now' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Templates operationId: runTemplateNow security: - bearerAuth: [] description: 'Requires role: Admin or Editor' /reporting/scheduled-reports: get: summary: 'List Scheduled Reports' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Reporting/Scheduled Reports' operationId: listScheduledReports security: - bearerAuth: [] post: summary: 'Create Scheduled Report' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Reporting/Scheduled Reports' operationId: createScheduledReport security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/reporting/scheduled-reports/{id}': patch: summary: 'Update Scheduled Report' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Reporting/Scheduled Reports' operationId: updateScheduledReport security: - bearerAuth: [] description: 'Requires role: Admin or Editor' delete: summary: 'Delete Scheduled Report' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Reporting/Scheduled Reports' operationId: deleteScheduledReport security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/reporting/scheduled-reports/{id}/pause': post: summary: 'Pause Scheduled Report' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Reporting/Scheduled Reports' operationId: pauseScheduledReport security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/reporting/scheduled-reports/{id}/resume': post: summary: 'Resume Scheduled Report' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Reporting/Scheduled Reports' operationId: resumeScheduledReport security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/reporting/scheduled-reports/{id}/run-now': post: summary: 'Run Scheduled Report Now' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Reporting/Scheduled Reports' operationId: runScheduledReportNow security: - bearerAuth: [] description: 'Requires role: Admin or Editor' /reporting/runs: get: summary: 'List Runs' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Runs operationId: listRuns security: - bearerAuth: [] '/reporting/runs/{id}': get: summary: 'Get Run' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Runs operationId: getRun security: - bearerAuth: [] delete: summary: 'Delete Run' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Runs operationId: deleteRun security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/reporting/runs/{id}/download': get: summary: 'Download Run' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Runs operationId: downloadRun security: - bearerAuth: [] '/reporting/runs/{id}/analyses': get: summary: 'Get Run Analyses' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Runs operationId: getRunAnalyses security: - bearerAuth: [] '/reporting/runs/{id}/archive': patch: summary: 'Archive Run' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Runs operationId: archiveRun security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/reporting/runs/{id}/restore': patch: summary: 'Restore Run' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting/Runs operationId: restoreRun security: - bearerAuth: [] description: 'Requires role: Admin or Editor' /reporting/generate-report: post: tags: - Reporting summary: 'Generate Reports' operationId: generateReports security: - bearerAuth: [] description: 'Requires role: Admin' requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' get: tags: - Reporting summary: 'Get All Generated Reports' operationId: getAllGeneratedReports security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /reporting/v2/generate-report: post: tags: - Reporting summary: 'Generate Reports V2' operationId: generateReportsV2 security: - bearerAuth: [] description: 'Requires role: Admin' requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /reporting/sections: get: summary: 'List Sections' responses: '200': description: Success '500': description: 'Internal server error' tags: - Reporting operationId: listSections security: - bearerAuth: [] '/reporting/{id}': delete: tags: - Reporting summary: 'Delete Generated Report By Id' operationId: deleteGeneratedReportById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /dashboard: get: tags: - Dashboard summary: 'Get Dashboard Data' operationId: getDashboardData security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/tiers/features/{id}': get: tags: - Subscriptions summary: 'Get Tiers Features' operationId: getTiersFeatures security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /subscriptions: get: tags: - Subscriptions summary: 'Get Subscription Controller' operationId: getSubscriptionController security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Subscriptions summary: 'Create Subscription Controller' operationId: createSubscriptionController security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/subscriptions/{id}': put: tags: - Subscriptions summary: 'Update Subscription Controller' operationId: updateSubscriptionController security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /tasks: get: tags: - Tasks summary: 'Get All Tasks' operationId: getAllTasks security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Tasks summary: 'Create Task' operationId: createTask security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/tasks/{id}': get: tags: - Tasks summary: 'Get Task By Id' operationId: getTaskById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' put: tags: - Tasks summary: 'Update Task' operationId: updateTask security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Tasks summary: 'Delete Task' operationId: deleteTask security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/tasks/{id}/entities': get: tags: - Tasks summary: 'Get Task Entity Links' operationId: getTaskEntityLinks security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Tasks summary: 'Add Task Entity Link' operationId: addTaskEntityLink security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /tasks/bulk: patch: summary: 'Bulk Update Tasks' responses: '200': description: Success '500': description: 'Internal server error' tags: - Tasks operationId: bulkUpdateTasks security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/tasks/{id}/restore': put: tags: - Tasks summary: 'Restore Task' operationId: restoreTask security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/tasks/{id}/hard': delete: tags: - Tasks summary: 'Hard Delete Task' operationId: hardDeleteTask security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/tasks/{id}/entities/{linkId}': delete: tags: - Tasks summary: 'Remove Task Entity Link' operationId: removeTaskEntityLink security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer - name: linkId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /deadlines/summary: get: summary: 'Get Deadlines Summary' responses: '200': description: Success '500': description: 'Internal server error' tags: - Deadlines operationId: getDeadlinesSummary security: - bearerAuth: [] /policies/import/docx: post: tags: - Policies summary: 'Import DOCX and convert to HTML' description: "Uploads a .docx file (max 10 MB) and converts it to HTML suitable for the policy content editor. Returns the converted HTML and any conversion warnings.\n" operationId: PolicyController.importDocx security: - bearerAuth: [] requestBody: required: true content: multipart/form-data: schema: type: object required: - file properties: file: type: string format: binary description: 'A .docx file (max 10 MB).' responses: '200': description: 'DOCX converted to HTML successfully' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: object, properties: {html: {type: string, description: 'The converted HTML content'}, warnings: {type: array, items: {type: string}, description: 'Conversion warnings (e.g., unsupported formatting)'}}} '400': description: 'Bad request — no file uploaded or invalid file type' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '500': $ref: '#/components/responses/InternalServerError' /policies/bulk: patch: summary: Unknown responses: '200': description: Success '500': description: 'Internal server error' tags: - Policies operationId: PolicyController.bulkUpdatePolicies security: - bearerAuth: [] description: 'Requires role: Admin or Editor' /policies: get: tags: - Policies summary: 'Get all policies' description: 'Returns all policies for the authenticated user''s organization, including assigned reviewer IDs.' operationId: PolicyController.getAllPolicies security: - bearerAuth: [] responses: '200': description: 'List of policies retrieved successfully' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {$ref: '#/components/schemas/PolicyWithReviewers'}} '500': $ref: '#/components/responses/InternalServerError' post: tags: - Policies summary: 'Create a new policy' description: 'Creates a new policy. The author_id and last_updated_by are set from the JWT token automatically.' operationId: PolicyController.createPolicy security: - bearerAuth: [] requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PolicyCreateRequest' responses: '201': description: 'Policy created successfully' content: application/json: schema: type: object properties: message: {type: string, example: Created} data: {$ref: '#/components/schemas/PolicyWithReviewers'} '500': $ref: '#/components/responses/InternalServerError' '503': description: 'Service unavailable — policy creation failed' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /policies/tags: get: tags: - Policies summary: 'Get available policy tags' description: 'Returns the static list of allowed policy tags.' operationId: PolicyController.getPolicyTags security: - bearerAuth: [] responses: '200': description: 'List of available tags' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {type: array, items: {type: string, enum: ['AI ethics', Fairness, Transparency, Explainability, 'Bias mitigation', Privacy, 'Data governance', 'Model risk', Accountability, Security, LLM, 'Human oversight', 'EU AI Act', 'ISO 42001', 'NIST RMF', 'Red teaming', Audit, Monitoring, 'Vendor management']}} '500': $ref: '#/components/responses/InternalServerError' '/policies/{id}/export/pdf': get: tags: - Policies summary: 'Export policy as PDF' description: 'Generates and downloads the policy as a PDF file.' operationId: PolicyController.exportPolicyPDF security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/PolicyId' responses: '200': description: 'PDF file stream' content: application/pdf: schema: type: string format: binary headers: Content-Disposition: schema: type: string example: 'attachment; filename="AI_Ethics_Policy.pdf"' Content-Length: schema: type: integer '400': description: 'Invalid policy ID' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' '/policies/{id}/export/docx': get: tags: - Policies summary: 'Export policy as DOCX' description: 'Generates and downloads the policy as a DOCX file.' operationId: PolicyController.exportPolicyDOCX security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/PolicyId' responses: '200': description: 'DOCX file stream' content: application/vnd.openxmlformats-officedocument.wordprocessingml.document: schema: type: string format: binary headers: Content-Disposition: schema: type: string example: 'attachment; filename="AI_Ethics_Policy.docx"' Content-Length: schema: type: integer '400': description: 'Invalid policy ID' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' '/policies/{id}': get: tags: - Policies summary: 'Get policy by ID' description: 'Returns a single policy by its ID, including assigned reviewer IDs.' operationId: PolicyController.getPolicyById security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/PolicyId' responses: '200': description: 'Policy retrieved successfully' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/PolicyWithReviewers'} '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' put: tags: - Policies summary: 'Update a policy' description: "Updates an existing policy. Only provided fields are updated. The last_updated_by and last_updated_at are set automatically from the JWT token. If assigned_reviewer_ids is provided, the reviewer list is fully replaced.\n" operationId: PolicyController.updatePolicy security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/PolicyId' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PolicyUpdateRequest' responses: '202': description: 'Policy updated successfully' content: application/json: schema: type: object properties: message: {type: string, example: Accepted} data: {$ref: '#/components/schemas/PolicyWithReviewers'} '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' delete: tags: - Policies summary: 'Delete a policy by ID' description: 'Permanently deletes a policy and its associated reviewer mappings (via CASCADE).' operationId: PolicyController.deletePolicyById security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/PolicyId' responses: '202': description: 'Policy deleted successfully' content: application/json: schema: type: object properties: message: {type: string, example: Accepted} data: {type: boolean, example: true} '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' '/policies/{id}/review/request': post: tags: - Policies summary: 'Request review for a policy' description: "Sets the policy review status to pending_review and sends in-app notifications to each specified reviewer.\n" operationId: PolicyController.requestReview security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/PolicyId' requestBody: required: true content: application/json: schema: type: object required: - reviewer_ids properties: reviewer_ids: type: array items: {type: integer} description: 'List of user IDs to request review from' example: [2, 5, 8] message: type: string description: 'Optional message to include in the review request notification' example: 'Please review the updated data governance section.' responses: '200': description: 'Review requested successfully; returns the updated policy' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/PolicyWithReviewers'} '400': description: 'Invalid policy ID or missing reviewer_ids' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' '/policies/{id}/review/approve': put: tags: - Policies summary: 'Approve a policy review' description: "Sets the policy review status to approved and sends an in-app notification to the policy author.\n" operationId: PolicyController.approveReview security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/PolicyId' requestBody: required: false content: application/json: schema: type: object properties: comment: type: string description: 'Optional approval comment' example: 'Looks good, approved.' responses: '200': description: 'Policy review approved; returns the updated policy' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/PolicyWithReviewers'} '400': description: 'Invalid policy ID' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' '/policies/{id}/review/reject': put: tags: - Policies summary: 'Reject a policy review (request changes)' description: "Sets the policy review status to changes_requested and sends an in-app notification to the policy author. A comment is required.\n" operationId: PolicyController.rejectReview security: - bearerAuth: [] parameters: - $ref: '#/components/parameters/PolicyId' requestBody: required: true content: application/json: schema: type: object required: - comment properties: comment: type: string description: 'Reason for requesting changes (required)' example: 'Section 3 needs more detail on bias mitigation procedures.' responses: '200': description: 'Policy review rejected; returns the updated policy' content: application/json: schema: type: object properties: message: {type: string, example: OK} data: {$ref: '#/components/schemas/PolicyWithReviewers'} '400': description: 'Invalid policy ID or missing comment' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': $ref: '#/components/responses/NotFound' '500': $ref: '#/components/responses/InternalServerError' '/policies/folders/{folderId}/policies': get: tags: - Policies summary: 'Get Policies In Folder' operationId: getPoliciesInFolder security: - bearerAuth: [] parameters: - name: folderId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/policies/{id}/folders': get: tags: - Policies summary: 'Get Policy Folders' operationId: getPolicyFolders security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - Policies summary: 'Update Policy Folders' operationId: updatePolicyFolders security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /slackWebhooks: get: tags: - Integrations summary: 'Get All Slack Webhooks' operationId: slackWebhooks_getAllSlackWebhooks security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Integrations summary: 'Create New Slack Webhook' operationId: slackWebhooks_createNewSlackWebhook security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/slackWebhooks/{id}': get: tags: - Integrations summary: 'Get Slack Webhook By Id' operationId: slackWebhooks_getSlackWebhookById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - Integrations summary: 'Update Slack Webhook By Id' operationId: slackWebhooks_updateSlackWebhookById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Integrations summary: 'Delete Slack Webhook By Id' operationId: slackWebhooks_deleteSlackWebhookById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/slackWebhooks/{id}/send': post: tags: - Integrations summary: 'Send Slack Message' operationId: slackWebhooks_sendSlackMessage security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /tokens: get: tags: - Authentication summary: 'Get Api Tokens' operationId: getApiTokens security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Authentication summary: 'Create Api Token' operationId: createApiToken security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/tokens/{id}/revoke': post: summary: 'Revoke Api Token' responses: '200': description: Success '500': description: 'Internal server error' tags: - Authentication operationId: revokeApiToken security: - bearerAuth: [] '/tokens/{id}': delete: tags: - Authentication summary: 'Delete Api Token' operationId: deleteApiToken security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/shares/token/{token}': get: tags: - 'Share Links' summary: 'Get Share Link By Token' operationId: getShareLinkByToken parameters: - name: token in: path required: true schema: type: string responses: '200': description: Success '500': description: 'Internal server error' '/shares/view/{token}': get: tags: - 'Share Links' summary: 'Get Shared Data By Token' operationId: getSharedDataByToken parameters: - name: token in: path required: true schema: type: string responses: '200': description: Success '500': description: 'Internal server error' /shares: post: tags: - 'Share Links' summary: 'Create Share Link' operationId: createShareLink security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/shares/{resourceType}/{resourceId}': get: tags: - 'Share Links' summary: 'Get Share Links For Resource' operationId: getShareLinksForResource security: - bearerAuth: [] parameters: - name: resourceType in: path required: true schema: type: string - name: resourceId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/shares/{id}': patch: tags: - 'Share Links' summary: 'Update Share Link' operationId: updateShareLink security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'Share Links' summary: 'Delete Share Link' operationId: deleteShareLink security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /file-manager: post: tags: - Files summary: 'Upload File' operationId: uploadFile security: - bearerAuth: [] description: 'Requires role: Admin or Reviewer or Editor' requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' get: tags: - Files summary: 'List Files' operationId: listFiles security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /file-manager/search: get: tags: - Files summary: 'Search Files' operationId: searchFiles security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /file-manager/with-metadata: get: tags: - Files summary: 'List Files With Metadata' operationId: listFilesWithMetadata security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /file-manager/org-settings: get: summary: 'Get File Org Settings Handler' responses: '200': description: Success '500': description: 'Internal server error' tags: - Files operationId: getFileOrgSettingsHandler security: - bearerAuth: [] put: summary: 'Update File Org Settings Handler' responses: '200': description: Success '500': description: 'Internal server error' tags: - Files operationId: updateFileOrgSettingsHandler security: - bearerAuth: [] '/file-manager/{id}': get: tags: - Files summary: 'Download File' operationId: downloadFile security: - bearerAuth: [] description: 'Requires role: Admin' parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' delete: tags: - Files summary: 'Remove File' operationId: removeFile security: - bearerAuth: [] description: 'Requires role: Admin or Reviewer or Editor' parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/file-manager/{id}/metadata': get: tags: - Files summary: 'Get File Metadata' operationId: getFileMetadata security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - Files summary: 'Update Metadata' operationId: updateMetadata security: - bearerAuth: [] description: 'Requires role: Admin or Reviewer or Editor' parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/file-manager/{id}/versions': get: tags: - Files summary: 'Get File Version History' operationId: getFileVersionHistory security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/file-manager/{id}/preview': get: tags: - Files summary: 'Preview File' operationId: previewFile security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /automations: get: tags: - Automations summary: 'Get All Automations' operationId: getAllAutomations security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Automations summary: 'Create Automation' operationId: createAutomation security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /automations/triggers: get: tags: - Automations summary: 'Get All Automation Triggers' operationId: getAllAutomationTriggers security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/automations/actions/by-triggerId/{triggerId}': get: tags: - Automations summary: 'Get All Automation Actions By Trigger Id' operationId: getAllAutomationActionsByTriggerId security: - bearerAuth: [] parameters: - name: triggerId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/automations/{id}/history': get: tags: - Automations summary: 'Get Automation History' operationId: getAutomationHistory security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/automations/{id}/stats': get: tags: - Automations summary: 'Get Automation Stats' operationId: getAutomationStats security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/automations/{id}': get: tags: - Automations summary: 'Get Automation By Id' operationId: getAutomationById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' put: tags: - Automations summary: 'Update Automation' operationId: updateAutomation security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Automations summary: 'Delete Automation By Id' operationId: deleteAutomationById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/user-preferences/{userId}': get: tags: - Users summary: 'Get Preferences By User' operationId: getPreferencesByUser security: - bearerAuth: [] parameters: - name: userId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - Users summary: 'Update User Preferences' operationId: updateUserPreferences security: - bearerAuth: [] parameters: - name: userId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /user-preferences: post: tags: - Users summary: 'Create User Preferences' operationId: createUserPreferences security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /llm-keys: get: tags: - 'LLM Keys' summary: 'Get L L M Keys' description: 'Callers without the llmKeys.admin permission get custom_headers as null and, for Custom providers, only the origin (scheme and host) of the URL. The API key itself is never returned.' operationId: getLLMKeys security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'LLM Keys' summary: 'Create L L M Key' operationId: createLLMKey security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - requires the llmKeys.admin permission (Admin by default)' '500': description: 'Internal server error' /llm-keys/status: get: tags: - 'LLM Keys' summary: 'Get L L M Key Status' operationId: getLLMKeyStatus security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/llm-keys/{name}': get: tags: - 'LLM Keys' summary: 'Get L L M Key' description: 'Callers without the llmKeys.admin permission get custom_headers as null and, for Custom providers, only the origin (scheme and host) of the URL. The API key itself is never returned.' operationId: getLLMKey security: - bearerAuth: [] parameters: - name: name in: path required: true schema: type: string responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/llm-keys/{id}': patch: tags: - 'LLM Keys' summary: 'Update L L M Key' operationId: updateLLMKey security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - requires the llmKeys.admin permission (Admin by default)' '500': description: 'Internal server error' delete: tags: - 'LLM Keys' summary: 'Delete L L M Key' operationId: deleteLLMKey security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '403': description: 'Forbidden - requires the llmKeys.admin permission (Admin by default)' '500': description: 'Internal server error' /nist-ai-rmf/functions: get: tags: - 'NIST AI RMF' summary: 'Get All N I S T A I R M Ffunctions' operationId: getAllNISTAIRMFfunctions security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/nist-ai-rmf/functions/{id}': get: tags: - 'NIST AI RMF' summary: 'Get N I S T A I R M Ffunction By Id' operationId: getNISTAIRMFfunctionById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/nist-ai-rmf/categories/{title}': get: tags: - 'NIST AI RMF' summary: 'Get All N I S T A I R M F Categories Byfunction Id' operationId: getAllNISTAIRMFCategoriesByfunctionId security: - bearerAuth: [] parameters: - name: title in: path required: true schema: type: string responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/nist-ai-rmf/subcategories/byId/{id}': get: tags: - 'NIST AI RMF' summary: 'Get N I S T A I R M F Subcategory By Id' operationId: getNISTAIRMFSubcategoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/nist-ai-rmf/subcategories/{id}/risks': get: tags: - 'NIST AI RMF' summary: 'Get N I S T A I R M F Subcategory Risks' operationId: getNISTAIRMFSubcategoryRisks security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/nist-ai-rmf/subcategories/{categoryId}/{title}': get: tags: - 'NIST AI RMF' summary: 'Get All N I S T A I R M F Subcategories Bycategory Id Andtitle' operationId: getAllNISTAIRMFSubcategoriesBycategoryIdAndtitle security: - bearerAuth: [] parameters: - name: categoryId in: path required: true schema: type: integer - name: title in: path required: true schema: type: string responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/nist-ai-rmf/subcategories/{id}': patch: tags: - 'NIST AI RMF' summary: 'Update N I S T A I R M F Subcategory By Id' operationId: updateNISTAIRMFSubcategoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/nist-ai-rmf/subcategories/{id}/status': patch: tags: - 'NIST AI RMF' summary: 'Update N I S T A I R M F Subcategory Status' operationId: updateNISTAIRMFSubcategoryStatus security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /nist-ai-rmf/progress: get: tags: - 'NIST AI RMF' summary: 'Get N I S T A I R M F Progress' operationId: getNISTAIRMFProgress security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /nist-ai-rmf/progress-by-function: get: tags: - 'NIST AI RMF' summary: 'Get N I S T A I R M F Progress By Function' operationId: getNISTAIRMFProgressByFunction security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /nist-ai-rmf/assignments: get: tags: - 'NIST AI RMF' summary: 'Get N I S T A I R M F Assignments' operationId: getNISTAIRMFAssignments security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /nist-ai-rmf/assignments-by-function: get: tags: - 'NIST AI RMF' summary: 'Get N I S T A I R M F Assignments By Function' operationId: getNISTAIRMFAssignmentsByFunction security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /nist-ai-rmf/status-breakdown: get: tags: - 'NIST AI RMF' summary: 'Get N I S T A I R M F Status Breakdown' operationId: getNISTAIRMFStatusBreakdown security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /nist-ai-rmf/overview: get: tags: - 'NIST AI RMF' summary: 'Get N I S T A I R M F Overview' operationId: getNISTAIRMFOverview security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /evidenceHub/freshness-sweep: post: summary: 'Run Freshness Sweep' responses: '200': description: Success '500': description: 'Internal server error' tags: - Evidence operationId: runFreshnessSweep security: - bearerAuth: [] description: 'Requires role: Admin' /evidenceHub: get: tags: - Evidence summary: 'Get All Evidences' operationId: getAllEvidences security: - bearerAuth: [] parameters: - name: includeArchived in: query required: false description: 'Include archived (soft-archived expired) records. Default false.' schema: type: boolean responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Evidence summary: 'Create New Evidence' operationId: createNewEvidence security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/evidenceHub/{id}': get: tags: - Evidence summary: 'Get Evidence By Id' operationId: getEvidenceById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - Evidence summary: 'Update Evidence By Id' operationId: updateEvidenceById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Evidence summary: 'Delete Evidence By Id' operationId: deleteEvidenceById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/evidence-ai/analyze/{fileId}': post: summary: 'Analyze File' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Evidence AI' operationId: analyzeFile security: - bearerAuth: [] '/evidence-ai/analysis/{fileId}': get: summary: 'Get Analysis' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Evidence AI' operationId: getAnalysis security: - bearerAuth: [] /evidence-ai/quality-scores: get: summary: 'Get Quality Scores' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Evidence AI' operationId: getQualityScores security: - bearerAuth: [] /evidence-ai/gaps: get: summary: 'Get Gaps' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Evidence AI' operationId: getGaps security: - bearerAuth: [] '/evidence-ai/suggestions/{fileId}': get: summary: 'Get Suggestions' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Evidence AI' operationId: getSuggestions security: - bearerAuth: [] '/evidence-ai/suggestions/{fileId}/apply': post: summary: 'Apply Suggestions' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Evidence AI' operationId: applySuggestions security: - bearerAuth: [] /readiness/calculate: post: summary: 'Calculate All' responses: '200': description: Success '500': description: 'Internal server error' tags: - Readiness operationId: calculateAll security: - bearerAuth: [] '/readiness/calculate/{frameworkType}': post: summary: 'Calculate For Framework' responses: '200': description: Success '500': description: 'Internal server error' tags: - Readiness operationId: calculateForFramework security: - bearerAuth: [] /readiness/scores: get: summary: 'Get Scores' responses: '200': description: Success '500': description: 'Internal server error' tags: - Readiness operationId: getScores security: - bearerAuth: [] '/readiness/scores/{frameworkType}': get: summary: 'Get Scores By Framework' responses: '200': description: Success '500': description: 'Internal server error' tags: - Readiness operationId: getScoresByFramework security: - bearerAuth: [] '/readiness/controls/{frameworkType}': get: summary: 'Get Control Scores' responses: '200': description: Success '500': description: 'Internal server error' tags: - Readiness operationId: getControlScores security: - bearerAuth: [] /readiness/weakest: get: summary: 'Get Weakest' responses: '200': description: Success '500': description: 'Internal server error' tags: - Readiness operationId: getWeakest security: - bearerAuth: [] /readiness/recommendations: get: summary: 'Get Recommendations' responses: '200': description: Success '500': description: 'Internal server error' tags: - Readiness operationId: getRecommendations security: - bearerAuth: [] /readiness/history: get: summary: 'Get History' responses: '200': description: Success '500': description: 'Internal server error' tags: - Readiness operationId: getHistory security: - bearerAuth: [] /ai-content/stats: get: summary: 'Get Stats' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Content' operationId: getStats security: - bearerAuth: [] /ai-content/unreviewed: get: summary: 'Get Unreviewed' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Content' operationId: getUnreviewed security: - bearerAuth: [] '/ai-content/{entityType}/{entityId}': get: summary: 'Get Badges' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Content' operationId: getBadges security: - bearerAuth: [] '/ai-content/{id}/review': patch: summary: 'Review Content' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Content' operationId: reviewContent security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/ai-confirmation/approve/{id}': post: summary: 'Approve Confirmation' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Confirmation' operationId: approveConfirmation security: - bearerAuth: [] description: 'Requires role: Admin' '/ai-confirmation/reject/{id}': post: summary: 'Reject Confirmation' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Confirmation' operationId: rejectConfirmation security: - bearerAuth: [] description: 'Requires role: Admin' /ai-confirmation/pending: get: summary: 'Get Pending Confirmations' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Confirmation' operationId: getPendingConfirmations security: - bearerAuth: [] /ai-approvals/stats: get: summary: 'Get Approval Stats Ctrl' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Approvals' operationId: getApprovalStatsCtrl security: - bearerAuth: [] /ai-approvals: get: summary: 'List Approvals Ctrl' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Approvals' operationId: listApprovalsCtrl security: - bearerAuth: [] '/ai-approvals/{id}': get: summary: 'Get Approval Detail Ctrl' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Approvals' operationId: getApprovalDetailCtrl security: - bearerAuth: [] '/ai-approvals/{id}/approve': post: summary: 'Approve Approval Ctrl' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Approvals' operationId: approveApprovalCtrl security: - bearerAuth: [] description: 'Requires role: Admin' '/ai-approvals/{id}/reject': post: summary: 'Reject Approval Ctrl' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Approvals' operationId: rejectApprovalCtrl security: - bearerAuth: [] description: 'Requires role: Admin' /ai-approval-rules/test: post: summary: 'Test Rule Ctrl' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Approval Rules' operationId: testRuleCtrl security: - bearerAuth: [] /ai-approval-rules: get: summary: 'List Rules Ctrl' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Approval Rules' operationId: listRulesCtrl security: - bearerAuth: [] post: summary: 'Create Rule Ctrl' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Approval Rules' operationId: createRuleCtrl security: - bearerAuth: [] '/ai-approval-rules/{id}': put: summary: 'Update Rule Ctrl' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Approval Rules' operationId: updateRuleCtrl security: - bearerAuth: [] delete: summary: 'Delete Rule Ctrl' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Approval Rules' operationId: deleteRuleCtrl security: - bearerAuth: [] /ai-apps: get: summary: 'Get All Ai Apps' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Apps' operationId: getAllAiApps security: - bearerAuth: [] post: summary: 'Create Ai App' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Apps' operationId: createAiApp security: - bearerAuth: [] description: 'Requires role: Admin or Editor' /ai-apps/policy-suggestions: get: summary: 'Get Policy Suggestions' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Apps' operationId: getPolicySuggestions security: - bearerAuth: [] '/ai-apps/{id}': get: summary: 'Get Ai App By Id' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Apps' operationId: getAiAppById security: - bearerAuth: [] patch: summary: 'Update Ai App By Id' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Apps' operationId: updateAiAppById security: - bearerAuth: [] description: 'Requires role: Admin or Editor' delete: summary: 'Delete Ai App By Id' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Apps' operationId: deleteAiAppById security: - bearerAuth: [] description: 'Requires role: Admin' '/ai-apps/{id}/models': post: summary: 'Link Models To Ai App' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Apps' operationId: linkModelsToAiApp security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/ai-apps/{id}/policies': post: summary: 'Set Policies For Ai App' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Apps' operationId: setPoliciesForAiApp security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/ai-apps/{id}/data-exposure': post: summary: 'Set Data Exposure For Ai App' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Apps' operationId: setDataExposureForAiApp security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/ai-apps/from-shadow-ai/{shadowAiToolId}': post: summary: 'Promote From Shadow Ai' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Apps' operationId: promoteFromShadowAi security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/ai-apps/{id}/status': patch: summary: 'Update Ai App Status' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Apps' operationId: updateAiAppStatus security: - bearerAuth: [] description: 'Requires role: Admin or Editor' /ai-audit/analytics: get: summary: 'Get Analytics' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Audit' operationId: getAnalytics security: - bearerAuth: [] /ai-audit/export: get: summary: 'Export Audit Log' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Audit' operationId: exportAuditLog security: - bearerAuth: [] description: 'Requires role: Admin' '/ai-audit/log/{actionId}': get: summary: 'Get Action Audit Trail' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Audit' operationId: getActionAuditTrail security: - bearerAuth: [] /ai-audit/log: get: summary: 'Get Audit Log' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Audit' operationId: getAuditLog security: - bearerAuth: [] /observability/metrics: get: summary: 'Get Metrics' responses: '200': description: Success '500': description: 'Internal server error' tags: - Observability operationId: getMetrics security: - bearerAuth: [] /observability/traces: get: summary: 'Get Traces' responses: '200': description: Success '500': description: 'Internal server error' tags: - Observability operationId: getTraces security: - bearerAuth: [] '/observability/traces/{id}': get: summary: 'Get Trace Detail' responses: '200': description: Success '500': description: 'Internal server error' tags: - Observability operationId: getTraceDetail security: - bearerAuth: [] /observability/costs: get: summary: 'Get Costs' responses: '200': description: Success '500': description: 'Internal server error' tags: - Observability operationId: getCosts security: - bearerAuth: [] /observability/performance: get: summary: 'Get Performance' responses: '200': description: Success '500': description: 'Internal server error' tags: - Observability operationId: getPerformance security: - bearerAuth: [] /advisor: post: tags: - 'AI Advisor' summary: 'Run Advisor' operationId: runAdvisor security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /advisor/stream: post: tags: - 'AI Advisor' summary: 'Stream Advisor' operationId: streamAdvisor security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /advisor/chat: post: tags: - 'AI Advisor' summary: 'Stream Advisor V2' operationId: streamAdvisorV2 security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/advisor/conversations/{domain}': get: tags: - 'AI Advisor' summary: 'List conversations for a domain' description: 'Returns all conversations the current user has in the given advisor domain, most recent first. Lightweight summaries only — no message bodies.' operationId: listConversations security: - bearerAuth: [] parameters: - name: domain in: path required: true schema: type: string responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'AI Advisor' summary: 'Create a new empty conversation' description: 'Creates a fresh empty conversation in the given domain. Title is derived automatically when the first user message is saved.' operationId: createConversation security: - bearerAuth: [] parameters: - name: domain in: path required: true schema: type: string responses: '201': description: 'Conversation created' '401': description: Unauthorized '500': description: 'Internal server error' '/advisor/conversations/{domain}/{id}': get: tags: - 'AI Advisor' summary: 'Get a single conversation' description: 'Returns the full conversation including its messages array.' operationId: getConversationById security: - bearerAuth: [] parameters: - name: domain in: path required: true schema: type: string - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '404': description: 'Conversation not found' '500': description: 'Internal server error' put: tags: - 'AI Advisor' summary: 'Update conversation messages' description: 'Replaces the messages array of an existing conversation. Bumps last_message_at and auto-derives the title on first save.' operationId: updateConversation security: - bearerAuth: [] parameters: - name: domain in: path required: true schema: type: string - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object properties: messages: type: array items: {type: object} responses: '200': description: 'Updated successfully' '401': description: Unauthorized '404': description: 'Conversation not found' '500': description: 'Internal server error' delete: tags: - 'AI Advisor' summary: 'Delete a conversation' operationId: deleteConversation security: - bearerAuth: [] parameters: - name: domain in: path required: true schema: type: string - name: id in: path required: true schema: type: integer responses: '204': description: Deleted '401': description: Unauthorized '404': description: 'Conversation not found' '500': description: 'Internal server error' /advisor/memory: get: summary: 'Get Memory Summary' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Advisor' operationId: getMemorySummary security: - bearerAuth: [] delete: summary: 'Delete My Memory' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Advisor' operationId: deleteMyMemory security: - bearerAuth: [] '/advisor/memory/admin/agent/{agentName}': get: summary: 'Admin List Agent Messages' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Advisor' operationId: adminListAgentMessages security: - bearerAuth: [] delete: summary: 'Admin Clear Agent Memory' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Advisor' operationId: adminClearAgentMemory security: - bearerAuth: [] /policy-linked: get: tags: - Policies summary: 'Get All Linked Objects' operationId: getAllLinkedObjects security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/policy-linked/{policyId}/linked-objects': get: tags: - Policies summary: 'Get Linked Objects For Policy' operationId: getLinkedObjects security: - bearerAuth: [] parameters: - name: policyId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Policies summary: 'Create Linked Object For Policy' operationId: createLinkedObject security: - bearerAuth: [] parameters: - name: policyId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Policies summary: 'Delete Linked Object For Policy' operationId: deleteLinkedObject security: - bearerAuth: [] parameters: - name: policyId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/policy-linked/risk/{riskId}/unlink-all': delete: tags: - Policies summary: 'Unlink Risk From All Policies' operationId: deleteRiskFromAllPolicies security: - bearerAuth: [] parameters: - name: riskId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/policy-linked/evidence/{evidenceId}/unlink-all': delete: tags: - Policies summary: 'Unlink Evidence From All Policies' operationId: deleteEvidenceFromAllPolicies security: - bearerAuth: [] parameters: - name: evidenceId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /ai-incident-managements: get: tags: - Incidents summary: 'Get All Incidents' operationId: getAllIncidents security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Incidents summary: 'Create New Incident' operationId: createNewIncident security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/ai-incident-managements/{id}': get: tags: - Incidents summary: 'Get Incident By Id' operationId: getIncidentById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - Incidents summary: 'Update Incident By Id' operationId: updateIncidentById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Incidents summary: 'Delete Incident By Id' operationId: deleteIncidentById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/ai-incident-managements/{id}/archive': patch: tags: - Incidents summary: 'Archive Incident By Id' operationId: archiveIncidentById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ce-marking/{projectId}': get: tags: - 'CE Marking' summary: 'Get C E Marking' operationId: getCEMarking security: - bearerAuth: [] parameters: - name: projectId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' put: tags: - 'CE Marking' summary: 'Update C E Marking' operationId: updateCEMarking security: - bearerAuth: [] parameters: - name: projectId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /search: get: tags: - Search summary: Search operationId: search security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /deepeval/playground/chat: post: summary: Provider responses: '200': description: Success '500': description: 'Internal server error' tags: - 'LLM Evals' operationId: provider security: - bearerAuth: [] /evaluation-llm-keys: get: tags: - 'LLM Evals' summary: 'Get All Evaluation LLM Keys' operationId: evalKeysRetired security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'LLM Evals' summary: 'Add Evaluation LLM Key' operationId: evaluation_llm_keys_evalKeysRetired security: - bearerAuth: [] description: 'Requires role: Admin' requestBody: required: true content: application/json: schema: type: object required: - provider - apiKey properties: provider: type: string enum: [openai, anthropic, google, xai, mistral, huggingface] apiKey: type: string responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /evaluation-llm-keys/verify: post: tags: - 'LLM Evals' summary: 'Verify Evaluation LLM Key' operationId: evaluation_llm_keys_evalKeysRetired security: - bearerAuth: [] description: 'Requires role: Admin' requestBody: required: true content: application/json: schema: type: object required: - provider - apiKey properties: provider: type: string enum: [openai, anthropic, google, xai, mistral, huggingface, openrouter] apiKey: type: string responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/evaluation-llm-keys/{provider}': delete: tags: - 'LLM Evals' summary: 'Delete Evaluation LLM Key' operationId: evaluation_llm_keys_evalKeysRetired security: - bearerAuth: [] description: 'Requires role: Admin' parameters: - name: provider in: path required: true schema: type: string enum: - openai - anthropic - google - xai - mistral - huggingface responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /evaluation-llm-keys/internal/decrypted: get: summary: 'Eval Keys Retired' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'LLM Evals' operationId: evaluation_llm_keys_evalKeysRetired /notes: post: tags: - Notes summary: 'Create Note' operationId: createNote security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' get: tags: - Notes summary: 'Get Notes' operationId: getNotes security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/notes/{id}': put: tags: - Notes summary: 'Update Note' operationId: updateNote security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Notes summary: 'Delete Note' operationId: deleteNote security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /entity-graph/annotations: post: tags: - 'Entity Graph' summary: 'Save Annotation' operationId: saveAnnotation security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' get: tags: - 'Entity Graph' summary: 'Get Annotations' operationId: getAnnotations security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/entity-graph/annotations/{entityType}/{entityId}': get: tags: - 'Entity Graph' summary: 'Get Annotation By Entity' operationId: getAnnotationByEntity security: - bearerAuth: [] parameters: - name: entityType in: path required: true schema: type: string - name: entityId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/entity-graph/annotations/{id}': delete: tags: - 'Entity Graph' summary: 'Delete Annotation' operationId: deleteAnnotation security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/entity-graph/annotations/entity/{entityType}/{entityId}': delete: tags: - 'Entity Graph' summary: 'Delete Annotation By Entity' operationId: deleteAnnotationByEntity security: - bearerAuth: [] parameters: - name: entityType in: path required: true schema: type: string - name: entityId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /entity-graph/views: post: tags: - 'Entity Graph' summary: 'Create View' operationId: createView security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' get: tags: - 'Entity Graph' summary: 'Get Views' operationId: getViews security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/entity-graph/views/{id}': get: tags: - 'Entity Graph' summary: 'Get View By Id' operationId: getViewById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' put: tags: - 'Entity Graph' summary: 'Update View' operationId: updateView security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'Entity Graph' summary: 'Delete View' operationId: deleteView security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /entity-graph/gap-rules/defaults: get: tags: - 'Entity Graph' summary: 'Get Default Gap Rules' operationId: getDefaultGapRules responses: '200': description: Success '500': description: 'Internal server error' /entity-graph/gap-rules: post: tags: - 'Entity Graph' summary: 'Save Gap Rules' operationId: saveGapRules security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' get: tags: - 'Entity Graph' summary: 'Get Gap Rules' operationId: getGapRules security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'Entity Graph' summary: 'Reset Gap Rules' operationId: resetGapRules security: - bearerAuth: [] responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/vendor-risk-change-history/{id}': get: tags: - 'Change History' summary: 'Get Vendor Risk Change History By Id' operationId: getVendorRiskChangeHistoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/policy-change-history/{id}': get: tags: - 'Change History' summary: 'Get Policy Change History By Id' operationId: getPolicyChangeHistoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/incident-change-history/{incidentId}': get: tags: - 'Change History' summary: 'Get Incident History' operationId: getIncidentHistory security: - bearerAuth: [] parameters: - name: incidentId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/use-case-change-history/{useCaseId}': get: tags: - 'Change History' summary: 'Get Use Case History' operationId: getUseCaseHistory security: - bearerAuth: [] parameters: - name: useCaseId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/risk-change-history/{projectRiskId}': get: tags: - 'Change History' summary: 'Get Project Risk Change History By Risk Id' operationId: getProjectRiskChangeHistoryByRiskId security: - bearerAuth: [] parameters: - name: projectRiskId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/file-change-history/{id}': get: tags: - 'Change History' summary: 'Get File Change History By Id' operationId: getFileChangeHistoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/task-change-history/{id}': get: tags: - 'Change History' summary: 'Get Task Change History By Id' operationId: getTaskChangeHistoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/training-change-history/{id}': get: tags: - 'Change History' summary: 'Get Training Change History By Id' operationId: getTrainingChangeHistoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/model-risk-change-history/{id}': get: tags: - 'Change History' summary: 'Get Model Risk Change History By Id' operationId: getModelRiskChangeHistoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/dataset-change-history/{id}': get: tags: - 'Change History' summary: 'Get Dataset Change History By Id' operationId: getDatasetChangeHistoryById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /approval-workflows: get: tags: - 'Approval Workflows' summary: 'Get All Approval Workflows' operationId: getAllApprovalWorkflows security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'Approval Workflows' summary: 'Create Approval Workflow' operationId: createApprovalWorkflow security: - bearerAuth: [] description: 'Requires role: Admin' requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/approval-workflows/{id}': get: tags: - 'Approval Workflows' summary: 'Get Approval Workflow By Id' operationId: getApprovalWorkflowById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' put: tags: - 'Approval Workflows' summary: 'Update Approval Workflow' operationId: updateApprovalWorkflow security: - bearerAuth: [] description: 'Requires role: Admin' parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' delete: tags: - 'Approval Workflows' summary: 'Delete Approval Workflow' operationId: deleteApprovalWorkflow security: - bearerAuth: [] description: 'Requires role: Admin' parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /approval-requests: post: tags: - 'Approval Workflows' summary: 'Create Approval Request' operationId: createApprovalRequest security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /approval-requests/my-requests: get: tags: - 'Approval Workflows' summary: 'Get My Approval Requests' operationId: getMyApprovalRequests security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /approval-requests/pending-approvals: get: tags: - 'Approval Workflows' summary: 'Get Pending Approvals' operationId: getPendingApprovals security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /approval-requests/all: get: tags: - 'Approval Workflows' summary: 'Get All Approval Requests' operationId: getAllApprovalRequests security: - bearerAuth: [] description: 'Requires role: Admin' responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/approval-requests/{id}': get: tags: - 'Approval Workflows' summary: 'Get Approval Request By Id' operationId: getApprovalRequestById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/approval-requests/{id}/approve': post: tags: - 'Approval Workflows' summary: 'Approve Request' operationId: approveRequest security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/approval-requests/{id}/reject': post: tags: - 'Approval Workflows' summary: 'Reject Request' operationId: rejectRequest security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/approval-requests/{id}/withdraw': post: tags: - 'Approval Workflows' summary: 'Withdraw approval request' operationId: withdrawRequest security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /ai-detection/scans: post: tags: - 'AI Detection' summary: 'Start Scan Controller' operationId: startScanController security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' get: tags: - 'AI Detection' summary: 'Get Scans Controller' operationId: getScansController security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /ai-detection/scans/active: get: tags: - 'AI Detection' summary: 'Get Active Scan Controller' operationId: getActiveScanController security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}': get: tags: - 'AI Detection' summary: 'Get Scan Controller' operationId: getScanController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'AI Detection' summary: 'Delete Scan Controller' operationId: deleteScanController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/status': get: tags: - 'AI Detection' summary: 'Get Scan Status Controller' operationId: getScanStatusController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/findings': get: tags: - 'AI Detection' summary: 'Get Scan Findings Controller' operationId: getScanFindingsController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/security-findings': get: tags: - 'AI Detection' summary: 'Get Security Findings Controller' operationId: getSecurityFindingsController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/security-summary': get: tags: - 'AI Detection' summary: 'Get Security Summary Controller' operationId: getSecuritySummaryController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/cancel': post: tags: - 'AI Detection' summary: 'Cancel Scan Controller' operationId: cancelScanController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/findings/{findingId}/governance': patch: tags: - 'AI Detection' summary: 'Update Governance Status Controller' operationId: updateGovernanceStatusController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer - name: findingId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/governance-summary': get: tags: - 'AI Detection' summary: 'Get Governance Summary Controller' operationId: getGovernanceSummaryController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /ai-detection/stats: get: tags: - 'AI Detection' summary: 'Get A I Detection Stats Controller' operationId: getAIDetectionStatsController security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/export/ai-bom': get: tags: - 'AI Detection' summary: 'Export A I B O M Controller' operationId: exportAIBOMController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/dependency-graph': get: tags: - 'AI Detection' summary: 'Get Dependency Graph Controller' operationId: getDependencyGraphController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/compliance': get: tags: - 'AI Detection' summary: 'Get Compliance Mapping Controller' operationId: getComplianceMappingController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/risk-score': get: tags: - 'AI Detection' summary: 'Get Risk Score Controller' operationId: getRiskScoreController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/scans/{scanId}/risk-score/recalculate': post: tags: - 'AI Detection' summary: 'Recalculate Risk Score Controller' operationId: recalculateRiskScoreController security: - bearerAuth: [] parameters: - name: scanId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /ai-detection/risk-scoring/config: get: tags: - 'AI Detection' summary: 'Get Risk Scoring Config Controller' operationId: getRiskScoringConfigController security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - 'AI Detection' summary: 'Update Risk Scoring Config Controller' operationId: updateRiskScoringConfigController security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /ai-detection/suppressions: post: summary: 'Create Suppression Controller' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Detection' operationId: createSuppressionController security: - bearerAuth: [] get: summary: 'List Suppressions Controller' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Detection' operationId: listSuppressionsController security: - bearerAuth: [] '/ai-detection/suppressions/{id}': delete: summary: 'Delete Suppression Controller' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Detection' operationId: deleteSuppressionController security: - bearerAuth: [] /ai-detection/repositories: get: tags: - 'AI Detection' summary: 'List Repositories' operationId: listRepositories security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'AI Detection' summary: 'Create Repository' operationId: createRepository security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/repositories/{id}': get: tags: - 'AI Detection' summary: 'Get Repository' operationId: getRepository security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - 'AI Detection' summary: 'Update Repository' operationId: updateRepository security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'AI Detection' summary: 'Delete Repository' operationId: deleteRepository security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/repositories/{id}/scan': post: tags: - 'AI Detection' summary: 'Trigger Repository Scan' operationId: triggerRepositoryScan security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/repositories/{id}/webhook-secret': post: tags: - 'AI Detection' summary: 'Generate Webhook Secret Controller' operationId: generateWebhookSecretController security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/ai-detection/repositories/{id}/scans': get: tags: - 'AI Detection' summary: 'Get Repository Scans' operationId: getRepositoryScans security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /integrations/github/token: get: tags: - Integrations summary: 'Get Git Hub Token Status Controller' operationId: getGitHubTokenStatusController security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Integrations summary: 'Save Git Hub Token Controller' operationId: saveGitHubTokenController security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Integrations summary: 'Delete Git Hub Token Controller' operationId: deleteGitHubTokenController security: - bearerAuth: [] responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /integrations/github/token/test: post: tags: - Integrations summary: 'Test Git Hub Token Controller' operationId: testGitHubTokenController security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /notifications/stream: get: tags: - Notifications summary: 'Stream Notifications' operationId: streamNotifications security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /notifications: get: tags: - Notifications summary: 'Get Notifications' operationId: getNotifications security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /notifications/summary: get: tags: - Notifications summary: 'Get Notification Summary' operationId: getNotificationSummary security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /notifications/unread-count: get: tags: - Notifications summary: 'Get Unread Count' operationId: getUnreadCount security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /notifications/read-all: patch: tags: - Notifications summary: 'Mark All As Read' operationId: markAllAsRead security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/notifications/{id}/read': patch: tags: - Notifications summary: 'Mark As Read' operationId: markAsRead security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/notifications/{id}': delete: tags: - Notifications summary: 'Delete Notification' operationId: deleteNotification security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/config/{projectId}': get: tags: - 'Post-Market Monitoring' summary: 'Get Config By Project Id' operationId: getConfigByProjectId security: - bearerAuth: [] parameters: - name: projectId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /pmm/config: post: tags: - 'Post-Market Monitoring' summary: 'Create Config' operationId: createConfig security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/config/{configId}': put: tags: - 'Post-Market Monitoring' summary: 'Update Config' operationId: updateConfig security: - bearerAuth: [] parameters: - name: configId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'Post-Market Monitoring' summary: 'Delete Config' operationId: deleteConfig security: - bearerAuth: [] parameters: - name: configId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/config/{configId}/questions': get: tags: - 'Post-Market Monitoring' summary: 'Get Questions' operationId: getQuestions security: - bearerAuth: [] parameters: - name: configId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'Post-Market Monitoring' summary: 'Add Question' operationId: addQuestion security: - bearerAuth: [] parameters: - name: configId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /pmm/org/questions: get: tags: - 'Post-Market Monitoring' summary: 'Get Questions' operationId: pmm_getQuestions security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/questions/{questionId}': put: tags: - 'Post-Market Monitoring' summary: 'Update Question' operationId: updateQuestion security: - bearerAuth: [] parameters: - name: questionId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'Post-Market Monitoring' summary: 'Delete Question' operationId: deleteQuestion security: - bearerAuth: [] parameters: - name: questionId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /pmm/questions/reorder: post: tags: - 'Post-Market Monitoring' summary: 'Reorder Questions' operationId: reorderQuestions security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/active-cycle/{projectId}': get: tags: - 'Post-Market Monitoring' summary: 'Get Active Cycle' operationId: getActiveCycle security: - bearerAuth: [] parameters: - name: projectId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/cycles/{cycleId}': get: tags: - 'Post-Market Monitoring' summary: 'Get Cycle By Id' operationId: getCycleById security: - bearerAuth: [] parameters: - name: cycleId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/cycles/{cycleId}/responses': get: tags: - 'Post-Market Monitoring' summary: 'Get Responses' operationId: getResponses security: - bearerAuth: [] parameters: - name: cycleId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'Post-Market Monitoring' summary: 'Save Responses' operationId: saveResponses security: - bearerAuth: [] parameters: - name: cycleId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/cycles/{cycleId}/submit': post: tags: - 'Post-Market Monitoring' summary: 'Submit Cycle' operationId: submitCycle security: - bearerAuth: [] parameters: - name: cycleId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/cycles/{cycleId}/flag': post: tags: - 'Post-Market Monitoring' summary: 'Flag Concern' operationId: flagConcern security: - bearerAuth: [] parameters: - name: cycleId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /pmm/reports: get: tags: - 'Post-Market Monitoring' summary: 'Get Reports' operationId: getReports security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/reports/{reportId}/download': get: tags: - 'Post-Market Monitoring' summary: 'Download Report' operationId: downloadReport security: - bearerAuth: [] parameters: - name: reportId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/cycles/{cycleId}/reassign': post: tags: - 'Post-Market Monitoring' summary: 'Reassign Stakeholder' operationId: reassignStakeholder security: - bearerAuth: [] parameters: - name: cycleId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/pmm/projects/{projectId}/start-cycle': post: tags: - 'Post-Market Monitoring' summary: 'Start New Cycle' operationId: startNewCycle security: - bearerAuth: [] parameters: - name: projectId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /compliance/score: get: tags: - Compliance summary: 'Get Compliance Score' operationId: getComplianceScore security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/compliance/score/{organizationId}': get: tags: - Compliance summary: 'Get Compliance Score By Organization' operationId: getComplianceScoreByOrganization security: - bearerAuth: [] parameters: - name: organizationId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/compliance/details/{organizationId}': get: tags: - Compliance summary: 'Get Compliance Details' operationId: getComplianceDetails security: - bearerAuth: [] parameters: - name: organizationId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /virtual-folders: get: tags: - Files summary: 'Get All Folders' operationId: getAllFolders security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Files summary: 'Create Folder' operationId: createFolder security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /virtual-folders/tree: get: tags: - Files summary: 'Get Folder Tree' operationId: getFolderTree security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /virtual-folders/uncategorized: get: tags: - Files summary: 'Get Uncategorized Files' operationId: getUncategorizedFiles security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/virtual-folders/{id}': get: tags: - Files summary: 'Get Folder By Id' operationId: getFolderById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - Files summary: 'Update Folder' operationId: updateFolder security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - Files summary: 'Delete Folder' operationId: deleteFolder security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/virtual-folders/{id}/path': get: tags: - Files summary: 'Get Folder Path' operationId: getFolderPath security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/virtual-folders/{id}/files': get: tags: - Files summary: 'Get Files In Folder' operationId: getFilesInFolder security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Files summary: 'Assign Files To Folder' operationId: assignFilesToFolder security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/virtual-folders/{id}/files/{fileId}': delete: tags: - Files summary: 'Remove File From Folder' operationId: removeFileFromFolder security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer - name: fileId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /files/tree: get: tags: - Files summary: 'Get Folder Tree' operationId: files_getFolderTree security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /files/uncategorized: get: tags: - Files summary: 'Get Uncategorized Files' operationId: files_getUncategorizedFiles security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/files/{id}/path': get: tags: - Files summary: 'Get Folder Path' operationId: files_getFolderPath security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/files/{id}/files': get: tags: - Files summary: 'Get Files In Folder' operationId: files_getFilesInFolder security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Files summary: 'Assign Files To Folder' operationId: files_assignFilesToFolder security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/files/{id}/files/{fileId}': delete: tags: - Files summary: 'Remove File From Folder' operationId: files_removeFileFromFolder security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer - name: fileId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/api-keys: post: tags: - 'Shadow AI' summary: 'Create Api Key' operationId: createApiKey security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' get: tags: - 'Shadow AI' summary: 'List Api Keys' operationId: listApiKeys security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/shadow-ai/api-keys/{id}': delete: tags: - 'Shadow AI' summary: 'Revoke Api Key' operationId: revokeApiKey security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/shadow-ai/api-keys/{id}/permanent': delete: tags: - 'Shadow AI' summary: 'Delete Api Key' operationId: deleteApiKey security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/insights/summary: get: tags: - 'Shadow AI' summary: 'Get Insights Summary' operationId: getInsightsSummary security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/insights/tools-by-events: get: tags: - 'Shadow AI' summary: 'Get Tools By Events' operationId: getToolsByEvents security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/insights/tools-by-users: get: tags: - 'Shadow AI' summary: 'Get Tools By Users' operationId: getToolsByUsers security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/insights/users-by-department: get: tags: - 'Shadow AI' summary: 'Get Users By Department' operationId: getUsersByDepartment security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/insights/trend: get: tags: - 'Shadow AI' summary: 'Get Trend' operationId: getTrend security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/users: get: tags: - 'Shadow AI' summary: 'Get Users' operationId: getUsers security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/shadow-ai/users/{email}/activity': get: tags: - 'Shadow AI' summary: 'Get User Detail' operationId: getUserDetail security: - bearerAuth: [] parameters: - name: email in: path required: true schema: type: string responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/departments: get: tags: - 'Shadow AI' summary: 'Get Department Activity' operationId: getDepartmentActivity security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/tools: get: tags: - 'Shadow AI' summary: 'Get Tools' operationId: getTools security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/shadow-ai/tools/{id}': get: tags: - 'Shadow AI' summary: 'Get Tool By Id' operationId: getToolById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/shadow-ai/tools/{id}/status': patch: tags: - 'Shadow AI' summary: 'Update Tool Status' operationId: updateToolStatus security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/shadow-ai/tools/{id}/start-governance': post: tags: - 'Shadow AI' summary: 'Start Governance' operationId: startGovernance security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/rules: get: tags: - 'Shadow AI' summary: 'Get Rules' operationId: getRules security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'Shadow AI' summary: 'Create Rule' operationId: createRule security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/shadow-ai/rules/{id}': patch: tags: - 'Shadow AI' summary: 'Update Rule' operationId: updateRule security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'Shadow AI' summary: 'Delete Rule' operationId: deleteRule security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/rules/alert-history: get: tags: - 'Shadow AI' summary: 'Get Alert History' operationId: getAlertHistory security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/config/syslog: get: tags: - 'Shadow AI' summary: 'Get Syslog Configs' operationId: getSyslogConfigs security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'Shadow AI' summary: 'Create Syslog Config' operationId: createSyslogConfig security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/shadow-ai/config/syslog/{id}': patch: tags: - 'Shadow AI' summary: 'Update Syslog Config' operationId: updateSyslogConfig security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'Shadow AI' summary: 'Delete Syslog Config' operationId: deleteSyslogConfig security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' /shadow-ai/settings: get: tags: - 'Shadow AI' summary: 'Get Settings' operationId: getSettings security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - 'Shadow AI' summary: 'Update Settings' operationId: updateSettings security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /v1/shadow-ai/events: post: tags: - 'Shadow AI' summary: 'Ingest Events' operationId: ingestEvents requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '500': description: 'Internal server error' /agent-primitives: get: tags: - 'Agent Discovery' summary: 'Get All Agent Primitives' operationId: getAllAgentPrimitives security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'Agent Discovery' summary: 'Create Agent Primitive' operationId: createAgentPrimitive security: - bearerAuth: [] requestBody: required: true content: application/json: schema: type: object required: - display_name - primitive_type properties: display_name: type: string primitive_type: type: string owner_ids: type: array items: {type: integer, minimum: 1} maxItems: 50 description: 'User ids of the owners, all users of your organization, primary first. At most 50.' owner_id: type: string nullable: true description: 'Legacy single owner. See the operation description.' permissions: type: array items: {} permission_categories: type: array items: {type: string} metadata: type: object responses: '201': description: 'Created successfully. The agent includes owner_ids.' '400': description: 'Missing display_name or primitive_type, an invalid owner id, an owner who is not a user of your organization, owner_id that is not a user id when sent with owner_ids, a text owner_id longer than 255 characters, or more than 50 owners' '401': description: Unauthorized '500': description: 'Internal server error' description: 'Adds a manual agent. Owners: send owner_ids, the user ids of the owners, primary first. The legacy owner_id is still accepted. Sent alone, a user id makes that user the only owner, and any other text is stored as is as a free-text owner (owner_ids stays empty). Sent with owner_ids, owner_id must be a user id; it becomes the primary owner and is moved to the front. An agent can have at most 50 owners. Requires role: Admin' /agent-primitives/stats: get: tags: - 'Agent Discovery' summary: 'Get Agent Stats' operationId: getAgentStats security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /agent-primitives/sync/logs: get: tags: - 'Agent Discovery' summary: 'Get Sync Logs' operationId: getSyncLogs security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /agent-primitives/sync/status: get: tags: - 'Agent Discovery' summary: 'Get Sync Status' operationId: getSyncStatus security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/agent-primitives/{id}': get: tags: - 'Agent Discovery' summary: 'Get Agent Primitive By Id' operationId: getAgentPrimitiveById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - 'Agent Discovery' summary: 'Update Agent Primitive' operationId: updateAgentPrimitive security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: type: object properties: display_name: type: string primitive_type: type: string owner_ids: type: array items: {type: integer, minimum: 1} maxItems: 50 description: 'User ids of the owners, all users of your organization, primary first. At most 50.' owner_id: type: string nullable: true description: 'Legacy single owner. See the operation description.' metadata: type: object responses: '200': description: 'Success. The agent includes owner_ids.' '400': description: 'No fields to update, an invalid owner id, a newly added owner who is not a user of your organization, owner_id that is not a user id when sent with owner_ids, a text owner_id longer than 255 characters, or more than 50 owners' '401': description: Unauthorized '403': description: 'Only manually-added agents can be edited' '404': description: 'Agent primitive not found' '500': description: 'Internal server error' description: 'Edits a manual agent. Owners change only when owner_ids or owner_id is sent, so an edit of other fields leaves them as they are. owner_ids replaces the full owner set, primary first. owner_id sent alone (legacy): a user id becomes the primary owner, replacing the previous primary and keeping the other owners; null or an empty string removes only the primary owner, and the next owner becomes primary (or none is left); any other text replaces all owners with that one free-text owner. Sent with owner_ids, owner_id must be a user id; it becomes the primary owner and is moved to the front. An agent can have at most 50 owners. Requires role: Admin' delete: tags: - 'Agent Discovery' summary: 'Delete Agent Primitive By Id' operationId: deleteAgentPrimitiveById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' description: 'Requires role: Admin' /agent-primitives/sync: post: tags: - 'Agent Discovery' summary: 'Trigger Sync' operationId: triggerSync security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' description: 'Requires role: Admin' '/agent-primitives/{id}/review': patch: tags: - 'Agent Discovery' summary: 'Review Agent Primitive' operationId: reviewAgentPrimitive security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' description: 'Requires role: Admin' '/agent-primitives/{id}/link-model': patch: tags: - 'Agent Discovery' summary: 'Link Model To Agent' operationId: linkModelToAgent security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' description: 'Requires role: Admin' '/agent-primitives/{id}/unlink-model': patch: tags: - 'Agent Discovery' summary: 'Unlink Model From Agent' operationId: unlinkModelFromAgent security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' description: 'Requires role: Admin' '/agent-primitives/{id}/audit-logs': get: tags: - 'Agent Discovery' summary: 'Get Agent Audit Logs' operationId: getAgentAuditLogs security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /intake/forms: get: tags: - 'Intake Forms' summary: 'Get All Intake Forms' operationId: getAllIntakeForms security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - 'Intake Forms' summary: 'Create Intake Form' operationId: createIntakeForm security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/intake/forms/{id}': get: tags: - 'Intake Forms' summary: 'Get Intake Form By Id' operationId: getIntakeFormById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - 'Intake Forms' summary: 'Update Intake Form' operationId: updateIntakeForm security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' delete: tags: - 'Intake Forms' summary: 'Delete Intake Form' operationId: deleteIntakeForm security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/intake/forms/{id}/archive': post: tags: - 'Intake Forms' summary: 'Archive Intake Form' operationId: archiveIntakeForm security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/intake/forms/{id}/preview': get: tags: - 'Intake Forms' summary: 'Preview Form' operationId: previewForm security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /intake/forms/suggested-questions: post: tags: - 'Intake Forms' summary: 'Get L L M Suggested Questions' operationId: getLLMSuggestedQuestions security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /intake/forms/field-guidance: post: tags: - 'Intake Forms' summary: 'Get Field Guidance' operationId: getFieldGuidance security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /intake/submissions: get: tags: - 'Intake Forms' summary: 'Get Pending Submissions' operationId: getPendingSubmissions security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /intake/submissions/stats: get: tags: - 'Intake Forms' summary: 'Get Submission Stats' operationId: getSubmissionStats security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/intake/submissions/by-entity/{entityType}/{entityId}': get: tags: - 'Intake Forms' summary: 'Get Submission By Entity' operationId: getSubmissionByEntity security: - bearerAuth: [] parameters: - name: entityType in: path required: true schema: type: string - name: entityId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/intake/submissions/{id}': get: tags: - 'Intake Forms' summary: 'Get Submission By Id' operationId: getSubmissionById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/intake/submissions/{id}/preview': get: tags: - 'Intake Forms' summary: 'Get Submission Preview' operationId: getSubmissionPreview security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/intake/submissions/{id}/risk-override': patch: tags: - 'Intake Forms' summary: 'Override Submission Risk' operationId: overrideSubmissionRisk security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/intake/forms/{id}/submissions': get: tags: - 'Intake Forms' summary: 'Get Form Submissions' operationId: getFormSubmissions security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/intake/submissions/{id}/approve': post: tags: - 'Intake Forms' summary: 'Approve Submission' operationId: approveSubmission security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/intake/submissions/{id}/reject': post: tags: - 'Intake Forms' summary: 'Reject Submission' operationId: rejectSubmission security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /intake/public/captcha: get: tags: - 'Intake Forms' summary: 'Get Captcha' operationId: getCaptcha responses: '200': description: Success '500': description: 'Internal server error' '/intake/public/by-id/{publicId}': get: tags: - 'Intake Forms' summary: 'Get Public Form By Public Id' operationId: getPublicFormByPublicId parameters: - name: publicId in: path required: true schema: type: integer responses: '200': description: Success '500': description: 'Internal server error' post: tags: - 'Intake Forms' summary: 'Submit Public Form By Public Id' operationId: submitPublicFormByPublicId parameters: - name: publicId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '500': description: 'Internal server error' '/intake/public/{tenantSlug}/{formSlug}': get: tags: - 'Intake Forms' summary: 'Get Public Form' operationId: getPublicForm parameters: - name: tenantSlug in: path required: true schema: type: string - name: formSlug in: path required: true schema: type: string responses: '200': description: Success '500': description: 'Internal server error' post: tags: - 'Intake Forms' summary: 'Submit Public Form' operationId: submitPublicForm parameters: - name: tenantSlug in: path required: true schema: type: string - name: formSlug in: path required: true schema: type: string requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '500': description: 'Internal server error' /version: get: tags: - System summary: 'Get application version' operationId: version_anonymous responses: '200': description: Success '500': description: 'Internal server error' /audit-ledger: get: tags: - Audit summary: 'Get Audit Ledger' operationId: getAuditLedger security: - bearerAuth: [] description: 'Requires role: Admin or SuperAdmin' responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /audit-ledger/verify: get: tags: - Audit summary: 'Verify Audit Ledger' operationId: verifyAuditLedger security: - bearerAuth: [] description: 'Requires role: Admin' responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /audit-ledger/export: get: summary: 'Export Audit Ledger as CSV' description: 'Streams the organization audit ledger as a CSV attachment (UTF-8 with BOM, oldest entry first, batches of 1000). Requires role: Admin' parameters: - name: entity_type in: query required: false schema: type: string description: 'Only entries for this entity type' - name: entry_type in: query required: false schema: type: string enum: - event_log - change_history description: 'Only entries of this kind' responses: '200': description: 'CSV file attachment (audit-ledger-YYYY-MM-DD.csv)' content: text/csv: schema: type: string '400': description: 'Invalid entry_type' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' tags: - Audit operationId: exportAuditLedger security: - bearerAuth: [] /feature-settings: get: tags: - Settings summary: 'Get Feature Settings' operationId: getFeatureSettings security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' patch: tags: - Settings summary: 'Update Feature Settings' operationId: updateFeatureSettings security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/fria/{friaId}/rights': put: tags: - FRIA summary: 'Update Fria Rights' operationId: updateFriaRights security: - bearerAuth: [] description: 'Requires role: Admin or Editor' parameters: - name: friaId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/fria/{friaId}/risk-items': get: tags: - FRIA summary: 'Get Risk Items' operationId: getRiskItems security: - bearerAuth: [] parameters: - name: friaId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - FRIA summary: 'Add Risk Item' operationId: addRiskItem security: - bearerAuth: [] description: 'Requires role: Admin or Editor' parameters: - name: friaId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/fria/{friaId}/risk-items/{itemId}': patch: tags: - FRIA summary: 'Update Risk Item' operationId: updateRiskItem security: - bearerAuth: [] description: 'Requires role: Admin or Editor' parameters: - name: friaId in: path required: true schema: type: integer - name: itemId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' delete: tags: - FRIA summary: 'Delete Risk Item' operationId: deleteRiskItem security: - bearerAuth: [] description: 'Requires role: Admin or Editor' parameters: - name: friaId in: path required: true schema: type: integer - name: itemId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/fria/{friaId}/models': get: tags: - FRIA summary: 'Get Model Links' operationId: getModelLinks security: - bearerAuth: [] parameters: - name: friaId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/fria/{friaId}/models/{modelId}': post: tags: - FRIA summary: 'Link Model' operationId: linkModel security: - bearerAuth: [] description: 'Requires role: Admin or Editor' parameters: - name: friaId in: path required: true schema: type: integer - name: modelId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' delete: tags: - FRIA summary: 'Unlink Model' operationId: unlinkModel security: - bearerAuth: [] description: 'Requires role: Admin or Editor' parameters: - name: friaId in: path required: true schema: type: integer - name: modelId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/fria/{friaId}/evidence': get: tags: - FRIA summary: 'Get Fria Evidence' operationId: getFriaEvidence security: - bearerAuth: [] parameters: - name: friaId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - FRIA summary: 'Link Fria Evidence' operationId: linkFriaEvidence security: - bearerAuth: [] description: 'Requires role: Admin or Editor' parameters: - name: friaId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/fria/{friaId}/evidence/{linkId}': delete: tags: - FRIA summary: 'Unlink Fria Evidence' operationId: unlinkFriaEvidence security: - bearerAuth: [] description: 'Requires role: Admin or Editor' parameters: - name: friaId in: path required: true schema: type: integer - name: linkId in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/fria/{friaId}/submit': post: tags: - FRIA summary: 'Submit Fria' operationId: submitFria security: - bearerAuth: [] description: 'Requires role: Admin or Editor' parameters: - name: friaId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/fria/{friaId}/versions': get: tags: - FRIA summary: 'Get Versions' operationId: getVersions security: - bearerAuth: [] parameters: - name: friaId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/fria/{friaId}/versions/{version}': get: tags: - FRIA summary: 'Get Version' operationId: getVersion security: - bearerAuth: [] parameters: - name: friaId in: path required: true schema: type: integer - name: version in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/fria/{projectId}': get: tags: - FRIA summary: 'Get Fria' operationId: getFria security: - bearerAuth: [] parameters: - name: projectId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' put: tags: - FRIA summary: 'Update Fria' operationId: updateFria security: - bearerAuth: [] description: 'Requires role: Admin or Editor' parameters: - name: projectId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /governance-os/mappings: get: summary: 'Get All Mappings' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: getAllMappings security: - bearerAuth: [] post: summary: 'Create Mapping' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: createMapping security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/governance-os/mappings/between/{sourceId}/{targetId}': get: summary: 'Get Mappings Between' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: getMappingsBetween security: - bearerAuth: [] '/governance-os/mappings/control/{controlType}/{controlId}': get: summary: 'Get Mappings For Control' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: getMappingsForControl security: - bearerAuth: [] '/governance-os/mappings/{id}': put: summary: 'Update Mapping' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: updateMapping security: - bearerAuth: [] description: 'Requires role: Admin or Editor' delete: summary: 'Delete Mapping' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: deleteMapping security: - bearerAuth: [] description: 'Requires role: Admin' /governance-os/mappings/bulk: post: summary: 'Create Bulk Mappings' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: createBulkMappings security: - bearerAuth: [] description: 'Requires role: Admin or Editor' /governance-os/scenarios: get: summary: 'Get All Scenarios' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: getAllScenarios security: - bearerAuth: [] post: summary: 'Create Scenario' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: createScenario security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/governance-os/scenarios/{id}': get: summary: 'Get Scenario By Id' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: getScenarioById security: - bearerAuth: [] put: summary: 'Update Scenario' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: updateScenario security: - bearerAuth: [] description: 'Requires role: Admin or Editor' delete: summary: 'Delete Scenario' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: deleteScenario security: - bearerAuth: [] description: 'Requires role: Admin' '/governance-os/scenarios/{id}/activate': post: summary: 'Activate Scenario' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: activateScenario security: - bearerAuth: [] description: 'Requires role: Admin or Editor' /governance-os/scenarios/simulate: post: summary: 'Simulate Scenario' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: simulateScenario security: - bearerAuth: [] /governance-os/activations: get: summary: 'Get Activation History' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: getActivationHistory security: - bearerAuth: [] '/governance-os/activations/{id}/deactivate': post: summary: 'Deactivate Scenario' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: deactivateScenario security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/governance-os/activations/{id}/progress': get: summary: 'Get Scenario Progress' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: getScenarioProgress security: - bearerAuth: [] /governance-os/recommend: post: summary: 'Get Recommendations' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: governance_os_getRecommendations security: - bearerAuth: [] '/governance-os/coverage/{projectId}': get: summary: 'Get Coverage' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: getCoverage security: - bearerAuth: [] '/governance-os/coverage/{projectId}/refresh': post: summary: 'Refresh Coverage' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: refreshCoverage security: - bearerAuth: [] description: 'Requires role: Admin or Editor' '/governance-os/unified-view/{projectId}': get: summary: 'Get Unified View' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: getUnifiedView security: - bearerAuth: [] /governance-os/eligibility: get: summary: 'Get Eligibility' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: getEligibility security: - bearerAuth: [] /governance-os/preferences: get: summary: 'Get Preferences' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: getPreferences security: - bearerAuth: [] put: summary: 'Update Preferences' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Governance OS' operationId: updatePreferences security: - bearerAuth: [] description: 'Requires role: Admin' /risk-benchmarks: get: tags: - 'Risk Benchmarks' summary: 'Get All Benchmarks' operationId: getAllBenchmarks security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /risk-benchmarks/filters: get: tags: - 'Risk Benchmarks' summary: 'Get Benchmark Filters' operationId: getBenchmarkFilters security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/risk-benchmarks/{id}': get: tags: - 'Risk Benchmarks' summary: 'Get Benchmark By Id' operationId: getBenchmarkById security: - bearerAuth: [] parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /quantitative-risks/portfolio/org: get: tags: - 'Quantitative Risks' summary: 'Get Org Portfolio' operationId: getOrgPortfolio security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/quantitative-risks/portfolio/project/{projectId}': get: tags: - 'Quantitative Risks' summary: 'Get Project Portfolio' operationId: getProjectPortfolio security: - bearerAuth: [] parameters: - name: projectId in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /quantitative-risks/portfolio/trend: get: tags: - 'Quantitative Risks' summary: 'Get Portfolio Trend Handler' operationId: getPortfolioTrendHandler security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/quantitative-risks/{riskId}/apply-benchmark/{benchmarkId}': post: tags: - 'Quantitative Risks' summary: 'Apply Benchmark' operationId: applyBenchmark security: - bearerAuth: [] parameters: - name: riskId in: path required: true schema: type: integer - name: benchmarkId in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' /quantitative-risks/assessment-mode: get: tags: - 'Quantitative Risks' summary: 'Get Risk Assessment Mode' operationId: getRiskAssessmentMode security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' put: tags: - 'Quantitative Risks' summary: 'Update Risk Assessment Mode' operationId: updateRiskAssessmentMode security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/custom-fields/definitions/by-id/{id}': get: summary: 'Get Custom Field Definition By Id' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Custom Fields' operationId: getCustomFieldDefinitionById security: - bearerAuth: [] '/custom-fields/definitions/by-id/{id}/usage': get: summary: 'Get Custom Field Usage' responses: '200': description: 'Answer counts. total is the number of saved answers; by_option maps each option to its count: the option id for scored select, the option text for select and multiselect (a multiselect record counts once per option it holds); empty for other types.' content: application/json: schema: type: object properties: total: {type: integer} by_option: {type: object, additionalProperties: {type: integer}} '404': description: 'Definition not found' '500': description: 'Internal server error' tags: - 'Custom Fields' operationId: getCustomFieldUsage security: - bearerAuth: [] description: 'Requires role: Admin' '/custom-fields/definitions/{entityType}': get: summary: 'List Custom Field Definitions' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Custom Fields' operationId: listCustomFieldDefinitions security: - bearerAuth: [] /custom-fields/definitions: post: summary: 'Create Custom Field Definition' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Custom Fields' operationId: createCustomFieldDefinition security: - bearerAuth: [] description: 'Requires role: Admin. field_type is one of text, number, date, boolean, select, multiselect, user, scored_select. For scored_select, options is an array of { id, label, score }; omit id for new options (the server assigns it).' '/custom-fields/definitions/{id}': patch: summary: 'Update Custom Field Definition' requestBody: content: application/json: schema: type: object properties: label: type: string required: type: boolean options: type: array description: 'For scored_select, objects { id, label, score }; id omitted for new options.' items: {} option_moves: type: object description: 'select, multiselect and scored_select. Maps a removed option to the remaining option that should receive its answers: by id for scored_select, by option text for select and multiselect (so a renamed option maps old text to new text).' additionalProperties: {type: string} option_removals: type: array description: 'select, multiselect and scored_select. Removed options whose answers are deleted instead of moved (for multiselect, the option is dropped from each list; a list left empty is deleted). An option cannot be both moved and removed.' items: {type: string} responses: '200': description: Success '409': description: 'Removed options are still in use. data has code options_in_use, in_use [{ id, label, count }] and entity_type; retry with option_moves and/or option_removals.' '500': description: 'Internal server error' tags: - 'Custom Fields' operationId: updateCustomFieldDefinition security: - bearerAuth: [] description: 'Requires role: Admin' delete: summary: 'Delete Custom Field Definition' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Custom Fields' operationId: deleteCustomFieldDefinition security: - bearerAuth: [] description: 'Requires role: Admin' '/custom-fields/values/{entityType}/{entityId}/missing-required': get: summary: 'Get Missing Required Custom Fields' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Custom Fields' operationId: getMissingRequiredCustomFields security: - bearerAuth: [] '/custom-fields/values/{entityType}/{entityId}': get: summary: 'Get Custom Field Values For Entity' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Custom Fields' operationId: getCustomFieldValuesForEntity security: - bearerAuth: [] /custom-fields/values: put: summary: 'Set Custom Field Value' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Custom Fields' operationId: setCustomFieldValue security: - bearerAuth: [] '/custom-fields/values/{definitionId}/{entityId}': delete: summary: 'Delete Custom Field Value' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Custom Fields' operationId: deleteCustomFieldValue security: - bearerAuth: [] /super-admin/organizations: get: tags: - 'Super Admin' summary: 'List Organizations' operationId: listOrganizations security: - bearerAuth: [] description: 'Requires role: Super Admin' responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' post: tags: - 'Super Admin' summary: 'Create Org' operationId: createOrg security: - bearerAuth: [] description: 'Requires role: Super Admin' requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /super-admin/organizations-with-user: post: summary: 'Create Org With User' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: createOrgWithUser security: - bearerAuth: [] description: 'Requires role: Super Admin' '/super-admin/organizations/{id}': delete: tags: - 'Super Admin' summary: 'Delete Org' operationId: deleteOrg security: - bearerAuth: [] description: 'Requires role: Super Admin' parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' patch: tags: - 'Super Admin' summary: 'Update Org' operationId: updateOrg security: - bearerAuth: [] description: 'Requires role: Super Admin' parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /super-admin/users/count: get: tags: - 'Super Admin' summary: 'Get User Count' operationId: getUserCount security: - bearerAuth: [] description: 'Requires role: Super Admin' responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /super-admin/users/exists: get: summary: 'Email Exists' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: emailExists security: - bearerAuth: [] description: 'Requires role: Super Admin' /super-admin/users: get: tags: - 'Super Admin' summary: 'List All Users' operationId: listAllUsers security: - bearerAuth: [] description: 'Requires role: Super Admin' responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/super-admin/organizations/{id}/users': get: tags: - 'Super Admin' summary: 'List Org Users' operationId: listOrgUsers security: - bearerAuth: [] description: 'Requires role: Super Admin' parameters: - name: id in: path required: true schema: type: integer responses: '200': description: Success '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' post: summary: 'Create User In Org' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: createUserInOrg security: - bearerAuth: [] description: 'Requires role: Super Admin' '/super-admin/organizations/{id}/invitations': get: summary: 'List Org Invitations' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: listOrgInvitations security: - bearerAuth: [] description: 'Requires role: Super Admin' '/super-admin/organizations/{id}/invite': post: tags: - 'Super Admin' summary: 'Invite User To Org' operationId: inviteUserToOrg security: - bearerAuth: [] description: 'Requires role: Super Admin' parameters: - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' '/super-admin/users/{id}': patch: summary: 'Update User' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: updateUser security: - bearerAuth: [] description: 'Requires role: Super Admin' delete: tags: - 'Super Admin' summary: 'Remove User' operationId: removeUser security: - bearerAuth: [] description: 'Requires role: Super Admin' parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 'Deleted successfully' '401': description: Unauthorized '403': description: 'Forbidden - insufficient role' '500': description: 'Internal server error' /super-admin/monitoring: get: summary: 'Get Monitoring' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: getMonitoring security: - bearerAuth: [] description: 'Requires role: Super Admin' put: summary: 'Update Monitoring' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: updateMonitoring security: - bearerAuth: [] description: 'Requires role: Super Admin' /super-admin/monitoring/token: post: summary: 'Generate Monitoring Token' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: generateMonitoringToken security: - bearerAuth: [] description: 'Requires role: Super Admin' /super-admin/mcp-server: get: summary: 'Get Mcp Server' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: getMcpServer security: - bearerAuth: [] description: 'Requires role: Super Admin' delete: summary: 'Uninstall Mcp Server Handler' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: uninstallMcpServerHandler security: - bearerAuth: [] description: 'Requires role: Super Admin' /super-admin/mcp-server/install: post: summary: 'Install Mcp Server Handler' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: installMcpServerHandler security: - bearerAuth: [] description: 'Requires role: Super Admin' /super-admin/super-admins: get: summary: 'List Super Admins' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: listSuperAdmins security: - bearerAuth: [] description: 'Requires role: Super Admin' post: summary: 'Grant Super Admin' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: grantSuperAdmin security: - bearerAuth: [] description: 'Requires role: Super Admin' '/super-admin/super-admins/{user_id}': delete: summary: 'Revoke Super Admin' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Super Admin' operationId: revokeSuperAdmin security: - bearerAuth: [] description: 'Requires role: Super Admin' /internal/ai-gateway/notify: post: tags: - Internal summary: 'AI Gateway notification callback' operationId: internal_anonymous requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '500': description: 'Internal server error' /internal/observability-config: get: summary: Anonymous responses: '200': description: Success '500': description: 'Internal server error' tags: - Internal operationId: internal_anonymous /telemetry: post: summary: Type responses: '200': description: Success '500': description: 'Internal server error' tags: - Telemetry operationId: type /ssoConfig/feature: get: summary: 'Get S S O Feature Status' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'SSO Config' operationId: getSSOFeatureStatus /ssoConfig/check-status: get: summary: 'Check S S O Status' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'SSO Config' operationId: checkSSOStatus /ssoConfig/orgs: get: summary: 'List S S O Orgs' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'SSO Config' operationId: listSSOOrgs /ssoConfig: get: summary: 'Get S S O Config' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'SSO Config' operationId: getSSOConfig security: - bearerAuth: [] description: 'Requires role: Admin' put: summary: 'Save S S O Config' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'SSO Config' operationId: saveSSOConfig security: - bearerAuth: [] description: 'Requires role: Admin' /ssoConfig/enable: put: summary: 'Enable S S O' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'SSO Config' operationId: enableSSO security: - bearerAuth: [] description: 'Requires role: Admin' /ssoConfig/disable: put: summary: 'Disable S S O' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'SSO Config' operationId: disableSSO security: - bearerAuth: [] description: 'Requires role: Admin' /ai-trust-index/apps: get: summary: 'Get Apps' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Ai Trust Index' operationId: getApps security: - bearerAuth: [] '/ai-trust-index/apps/{slug}': get: summary: 'Get App' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Ai Trust Index' operationId: getApp security: - bearerAuth: [] /ai-trust-index/tracked: get: summary: 'Get Tracked' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Ai Trust Index' operationId: getTracked security: - bearerAuth: [] post: summary: 'Track App' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Ai Trust Index' operationId: trackApp security: - bearerAuth: [] /ai-trust-index/tracked/bulk: post: summary: 'Track Apps Bulk' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Ai Trust Index' operationId: trackAppsBulk security: - bearerAuth: [] '/ai-trust-index/tracked/{slug}': delete: summary: 'Untrack App' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Ai Trust Index' operationId: untrackApp security: - bearerAuth: [] /ai-trust-index/settings: get: summary: 'Get Settings' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Ai Trust Index' operationId: ai_trust_index_getSettings security: - bearerAuth: [] put: summary: 'Update Settings' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'Ai Trust Index' operationId: ai_trust_index_updateSettings security: - bearerAuth: [] /health/live: get: summary: 'Liveness probe' description: 'Returns 200 while the process is serving HTTP. Checks no dependencies, so an outage elsewhere never fails liveness.' responses: '200': description: Success tags: - System operationId: healthCheck_live /health/ready: get: summary: 'Readiness probe' description: 'Checks PostgreSQL and Redis (2s timeout each). Returns 503 with status "degraded" when either fails.' responses: '200': description: Success '503': description: 'A data store is unavailable' tags: - System operationId: healthCheck_ready /health: get: summary: 'Health Check' responses: '200': description: Success '500': description: 'Internal server error' tags: - System operationId: healthCheck