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' description: 'EU AI Act risk classification level' HighRiskRole: type: string enum: - Deployer - Provider - Distributor - Importer - 'Product manufacturer' - 'Authorized representative' 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 example: UC-7 project_title: type: string example: 'Customer Support Chatbot' owner: type: integer example: 1 start_date: type: string format: date-time geography: type: integer example: 1 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 created_at: type: string format: date-time is_organizational: type: boolean is_demo: type: boolean approval_workflow_id: type: integer nullable: true pending_frameworks: type: string nullable: true enable_ai_data_insertion: type: boolean organization_id: type: integer 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 _source: type: string nullable: true example: jira-assets 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 created_at: type: string format: date-time last_login: type: string format: date-time updated_at: 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 required: - id - name - surname - email - role_id - created_at 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 description: 'Current approval/review status of the model' 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' 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' 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' 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' risk_description: type: string description: 'Detailed description of the risk.' risk_category: type: array items: type: string description: 'Array of category labels.' impact: type: string assessment_mapping: type: string controls_mapping: type: string likelihood: type: string enum: - Rare - Unlikely - Possible - Likely - 'Almost Certain' severity: type: string enum: - Negligible - Minor - Moderate - Major - Catastrophic risk_level_autocalculated: type: string enum: - 'No risk' - 'Very low risk' - 'Low risk' - 'Medium risk' - 'High risk' - 'Very high risk' review_notes: type: string mitigation_status: type: string enum: - 'Not Started' - 'In Progress' - Completed - 'On Hold' - Deferred - Canceled - 'Requires review' current_risk_level: type: string enum: - 'Very Low risk' - 'Low risk' - 'Medium risk' - 'High risk' - 'Very high risk' deadline: type: string format: date-time mitigation_plan: type: string implementation_strategy: type: string mitigation_evidence_document: type: string likelihood_mitigation: type: string enum: - Rare - Unlikely - Possible - Likely - 'Almost Certain' risk_severity: type: string enum: - Negligible - Minor - Moderate - Major - Critical final_risk_level: type: string risk_approval: type: integer description: 'User ID of the approver.' approval_status: type: string date_of_assessment: type: string format: date-time 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 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 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 UserPreference: type: object properties: id: type: integer user_id: type: integer date_format: type: string example: 'DD-MM-YYYY' language: type: string example: 'en' 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 Plugin: type: object properties: key: type: string name: type: string description: type: string category: type: string version: type: string author: type: string icon_url: type: string documentation_url: type: string PluginInstallation: type: object properties: id: type: integer plugin_key: type: string organization_id: type: integer installed_by: type: integer installed_at: type: string format: date-time configuration: type: object additionalProperties: true status: type: string ConnectionTestResult: type: object properties: success: type: boolean message: type: string details: type: object 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 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_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 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_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 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: Evidence - name: 'Evidence AI' - 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: Organizations - name: Plugins - name: Policies - name: 'Post-Market Monitoring' - name: 'Project Risks' - name: Projects - name: 'Quantitative Risks' - name: Readiness - name: Reporting - name: 'Risk Benchmarks' - name: 'Risk History' - 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: Training - name: Users - name: 'Vendor Risks' - name: Vendors - name: Webhooks paths: /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/{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.\nMarks any pending invitation as accepted after successful creation.\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/preferences: get: summary: 'Get current user preferences' description: | Returns the authenticated user's persisted preferences (date_format, language) from user_preferences. If no row exists, returns safe defaults including a transient theme default. 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' /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 '/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/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' /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' /roles: get: tags: - Roles summary: 'Get All Roles' operationId: getAllRoles security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/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' /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 Limiter' operationId: anonymous security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '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' /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 (e.g. plugin-sourced) 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' /dataset-bulk-upload/upload: post: tags: - Datasets summary: 'Handle Multer Error' operationId: uploadDatasetFile security: - bearerAuth: [] description: 'Requires role: Admin 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' '/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/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/{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: getAllSlackWebhooks security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' post: tags: - Integrations summary: 'Create New Slack Webhook' operationId: 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: 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: 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: 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: 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' /plugins/marketplace: get: tags: - Plugins summary: 'Get All Plugins' operationId: getAllPlugins security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/plugins/marketplace/{key}': get: tags: - Plugins summary: 'Get Plugin By Key' operationId: getPluginByKey security: - bearerAuth: [] parameters: - name: key in: path required: true schema: type: string responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /plugins/marketplace/search: get: tags: - Plugins summary: 'Search Plugins' operationId: searchPlugins security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /plugins/categories: get: tags: - Plugins summary: 'Get Categories' operationId: getCategories security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' /plugins/install: post: tags: - Plugins summary: 'Install Plugin' operationId: installPlugin security: - bearerAuth: [] requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/plugins/installations/{id}': delete: tags: - Plugins summary: 'Uninstall Plugin' operationId: uninstallPlugin 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' /plugins/installations: get: tags: - Plugins summary: 'Get Installed Plugins' operationId: getInstalledPlugins security: - bearerAuth: [] responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' '/plugins/installations/{id}/configuration': put: tags: - Plugins summary: 'Update Plugin Configuration' operationId: updatePluginConfiguration 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' '/plugins/{key}/test-connection': post: tags: - Plugins summary: 'Test Plugin Connection' operationId: testPluginConnection security: - bearerAuth: [] parameters: - name: key in: path required: true schema: type: string requestBody: content: application/json: schema: type: object responses: '201': description: 'Created successfully' '401': description: Unauthorized '500': description: 'Internal server error' '/plugins/{key}/ui/dist/{filename}': get: tags: - Plugins summary: 'Serve plugin UI assets' operationId: plugins_anonymous security: - bearerAuth: [] parameters: - name: key in: path required: true schema: type: string - name: filename in: path required: true schema: type: string responses: '200': description: Success '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/{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' 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 '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' 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 '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 '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: get: tags: - Evidence summary: 'Get All Evidences' operationId: getAllEvidences security: - bearerAuth: [] 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: [] '/ai-confirmation/reject/{id}': post: summary: 'Reject Confirmation' responses: '200': description: Success '500': description: 'Internal server error' tags: - 'AI Confirmation' operationId: rejectConfirmation security: - bearerAuth: [] /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: [] /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' /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' /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: 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/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: content: application/json: schema: type: object responses: '200': description: Success '401': description: Unauthorized '500': description: 'Internal server error' description: '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' /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/{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' '/custom-fields/definitions/{id}': patch: summary: 'Update Custom Field Definition' responses: '200': description: Success '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/{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: 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' '/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' /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' /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: get: tags: - System summary: 'Health Check' operationId: healthCheck responses: '200': description: Success '500': description: 'Internal server error'