{"openapi":"3.0.3","info":{"title":"DefectDojo API v2","version":"3.4.301","description":"DefectDojo - Open Source vulnerability Management made easy. Prefetch related parameters/responses not yet in the schema."},"paths":{"/api/v2/agentsec/runtime/check/":{"post":{"operationId":"agentsec_runtime_check_create","description":"Vet a proposed action synchronously and return the verdict.\n\nThe verdict is a best-effort advisory (a deterministic pass plus, when an\nLLM is configured, an AI judge) — it does not sit inline and block the call.","tags":["AI Agent Runtime"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CheckRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CheckRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/agentsec/runtime/event/":{"post":{"operationId":"agentsec_runtime_event_create","description":"Append one event to a run. Non-blocking and append-only.","tags":["AI Agent Runtime"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EventRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EventRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"202":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/agentsec/runtime/register_run/":{"post":{"operationId":"agentsec_runtime_register_run_create","description":"Create a runtime run and return its ``trace_id``.","tags":["AI Agent Runtime"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRunRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegisterRunRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegisterRunRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_governance/policies/":{"get":{"operationId":"ai_governance_policies_list","description":"Policies that decide which AI components are authorized where.\n\nReads: every global policy, plus organization and asset policies the caller can view (an\norganization policy is readable to anyone who can view an asset in that organization).\nWrites: a global policy needs a superuser; an organization or asset policy needs edit\nrights on that organization or asset. Every change re-evaluates the assets it can affect,\nasynchronously, and is recorded in the audit log. ``owner_users`` lists the people the\ncaller may name as a policy's owner.","parameters":[{"in":"query","name":"decision","schema":{"type":"string"}},{"in":"query","name":"decision_not","schema":{"type":"string"}},{"in":"query","name":"enabled","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"match_type","schema":{"type":"string"}},{"in":"query","name":"match_type_not","schema":{"type":"string"}},{"in":"query","name":"match_value_contains","schema":{"type":"string"}},{"in":"query","name":"match_value_ends_with","schema":{"type":"string"}},{"in":"query","name":"match_value_exact","schema":{"type":"string"}},{"in":"query","name":"match_value_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"match_value_not_contains","schema":{"type":"string"}},{"in":"query","name":"match_value_not_exact","schema":{"type":"string"}},{"in":"query","name":"match_value_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"match_value_not_regex","schema":{"type":"string"}},{"in":"query","name":"match_value_regex","schema":{"type":"string"}},{"in":"query","name":"match_value_starts_with","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-decision","-enabled","-id","-match_type","-match_value","-name","-updated_at","decision","enabled","id","match_type","match_value","name","updated_at"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `decision` - Decision\n* `-decision` - Decision (descending)\n* `match_type` - Match type\n* `-match_type` - Match type (descending)\n* `match_value` - Match value\n* `-match_value` - Match value (descending)\n* `enabled` - Enabled\n* `-enabled` - Enabled (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_not","schema":{"type":"string"}},{"in":"query","name":"product_type","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_type_not","schema":{"type":"string"}},{"in":"query","name":"scope","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, match_value, justification"}],"tags":["AI Governance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAIComponentPolicyList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"ai_governance_policies_create","description":"Policies that decide which AI components are authorized where.\n\nReads: every global policy, plus organization and asset policies the caller can view (an\norganization policy is readable to anyone who can view an asset in that organization).\nWrites: a global policy needs a superuser; an organization or asset policy needs edit\nrights on that organization or asset. Every change re-evaluates the assets it can affect,\nasynchronously, and is recorded in the audit log. ``owner_users`` lists the people the\ncaller may name as a policy's owner.","tags":["AI Governance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIComponentPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AIComponentPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AIComponentPolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIComponentPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_governance/policies/{id}/":{"get":{"operationId":"ai_governance_policies_retrieve","description":"Policies that decide which AI components are authorized where.\n\nReads: every global policy, plus organization and asset policies the caller can view (an\norganization policy is readable to anyone who can view an asset in that organization).\nWrites: a global policy needs a superuser; an organization or asset policy needs edit\nrights on that organization or asset. Every change re-evaluates the assets it can affect,\nasynchronously, and is recorded in the audit log. ``owner_users`` lists the people the\ncaller may name as a policy's owner.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Component Policy.","required":true}],"tags":["AI Governance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIComponentPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"ai_governance_policies_update","description":"Policies that decide which AI components are authorized where.\n\nReads: every global policy, plus organization and asset policies the caller can view (an\norganization policy is readable to anyone who can view an asset in that organization).\nWrites: a global policy needs a superuser; an organization or asset policy needs edit\nrights on that organization or asset. Every change re-evaluates the assets it can affect,\nasynchronously, and is recorded in the audit log. ``owner_users`` lists the people the\ncaller may name as a policy's owner.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Component Policy.","required":true}],"tags":["AI Governance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIComponentPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AIComponentPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AIComponentPolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIComponentPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"ai_governance_policies_partial_update","description":"Policies that decide which AI components are authorized where.\n\nReads: every global policy, plus organization and asset policies the caller can view (an\norganization policy is readable to anyone who can view an asset in that organization).\nWrites: a global policy needs a superuser; an organization or asset policy needs edit\nrights on that organization or asset. Every change re-evaluates the assets it can affect,\nasynchronously, and is recorded in the audit log. ``owner_users`` lists the people the\ncaller may name as a policy's owner.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Component Policy.","required":true}],"tags":["AI Governance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedAIComponentPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedAIComponentPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedAIComponentPolicyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIComponentPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"ai_governance_policies_destroy","description":"Policies that decide which AI components are authorized where.\n\nReads: every global policy, plus organization and asset policies the caller can view (an\norganization policy is readable to anyone who can view an asset in that organization).\nWrites: a global policy needs a superuser; an organization or asset policy needs edit\nrights on that organization or asset. Every change re-evaluates the assets it can affect,\nasynchronously, and is recorded in the audit log. ``owner_users`` lists the people the\ncaller may name as a policy's owner.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Component Policy.","required":true}],"tags":["AI Governance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_governance/policies/evaluate/":{"post":{"operationId":"ai_governance_policies_evaluate_create","description":"Re-evaluate one asset, or every asset with an AI inventory (superuser only).","tags":["AI Governance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluateRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EvaluateRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EvaluateRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"202":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_governance/policies/owner_users/":{"get":{"operationId":"ai_governance_policies_owner_users_list","description":"The people the caller may name as a policy owner, for the owner picker.\n\nThe same set ``owner_user`` accepts on a new policy, so the picker offers nobody the save refuses.","parameters":[{"in":"query","name":"limit","schema":{"type":"integer"}},{"in":"query","name":"offset","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Part of a username, first name or last name."}],"tags":["AI Governance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedOwnerUserOptionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_governance/verdicts/":{"get":{"operationId":"ai_governance_verdicts_list","description":"Why each AI component on each asset is authorized, unauthorized, or needs review.","parameters":[{"in":"query","name":"category","schema":{"type":"string"}},{"in":"query","name":"category_not","schema":{"type":"string"}},{"in":"query","name":"decision","schema":{"type":"string"}},{"in":"query","name":"decision_not","schema":{"type":"string"}},{"in":"query","name":"dependency","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"dependency_not","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"location_not","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-decision","-evaluated_at","-id","decision","evaluated_at","id"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `decision` - Decision\n* `-decision` - Decision (descending)\n* `evaluated_at` - Evaluated at\n* `-evaluated_at` - Evaluated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"policy","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"policy_not","schema":{"type":"string"}},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_not","schema":{"type":"string"}}],"tags":["AI Governance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAIAuthorizationVerdictList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_governance/verdicts/{id}/":{"get":{"operationId":"ai_governance_verdicts_retrieve","description":"Why each AI component on each asset is authorized, unauthorized, or needs review.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this ai authorization verdict.","required":true}],"tags":["AI Governance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIAuthorizationVerdict"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/claude_code/hook/":{"post":{"operationId":"ai_guardrails_claude_code_hook_create","description":"Check one UserPromptSubmit, PreToolUse or PostToolUse call against the collector's policy.\n\nWhile AI Inventory and Governance is turned off, every call is let through and nothing is\nrecorded, so switching the feature off never leaves developers blocked by a fail-closed hook.","tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}}},"security":[{"aiGuardrailsCollectorToken":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":"The hook's JSON output, for Claude Code to act on"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/collectors/":{"get":{"operationId":"ai_guardrails_collectors_list","description":"Collectors: the Claude Code hooks and token that connect developer machines to a policy (superuser only).\n\nCreating a collector, or rotating its token, is the only time the token is returned. The\nresponse also carries the managed settings file to deploy, built with that token.","parameters":[{"in":"query","name":"active","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created_at","-id","-last_seen_at","-name","created_at","id","last_seen_at","name"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `last_seen_at` - Last seen at\n* `-last_seen_at` - Last seen at (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"policy","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"policy_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, token_prefix"}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedGuardrailCollectorList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"ai_guardrails_collectors_create","description":"Collectors: the Claude Code hooks and token that connect developer machines to a policy (superuser only).\n\nCreating a collector, or rotating its token, is the only time the token is returned. The\nresponse also carries the managed settings file to deploy, built with that token.","tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailCollectorRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GuardrailCollectorRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GuardrailCollectorRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"description":"The collector, its token and its managed settings"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/collectors/{id}/":{"get":{"operationId":"ai_guardrails_collectors_retrieve","description":"Collectors: the Claude Code hooks and token that connect developer machines to a policy (superuser only).\n\nCreating a collector, or rotating its token, is the only time the token is returned. The\nresponse also carries the managed settings file to deploy, built with that token.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Collector.","required":true}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailCollector"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"ai_guardrails_collectors_update","description":"Collectors: the Claude Code hooks and token that connect developer machines to a policy (superuser only).\n\nCreating a collector, or rotating its token, is the only time the token is returned. The\nresponse also carries the managed settings file to deploy, built with that token.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Collector.","required":true}],"tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailCollectorRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GuardrailCollectorRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GuardrailCollectorRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailCollector"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"ai_guardrails_collectors_partial_update","description":"Collectors: the Claude Code hooks and token that connect developer machines to a policy (superuser only).\n\nCreating a collector, or rotating its token, is the only time the token is returned. The\nresponse also carries the managed settings file to deploy, built with that token.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Collector.","required":true}],"tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedGuardrailCollectorRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedGuardrailCollectorRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedGuardrailCollectorRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailCollector"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"ai_guardrails_collectors_destroy","description":"Collectors: the Claude Code hooks and token that connect developer machines to a policy (superuser only).\n\nCreating a collector, or rotating its token, is the only time the token is returned. The\nresponse also carries the managed settings file to deploy, built with that token.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Collector.","required":true}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/collectors/{id}/managed_settings/":{"post":{"operationId":"ai_guardrails_collectors_managed_settings_create","description":"Build the managed settings file for this collector's token, with the deployment options chosen.\n\nThe token is not stored, so the caller supplies it; it must be this collector's current token.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Collector.","required":true}],"tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManagedSettingsRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ManagedSettingsRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ManagedSettingsRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"The managed settings file for this collector"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/collectors/{id}/revoke/":{"post":{"operationId":"ai_guardrails_collectors_revoke_create","description":"Stop the token working. Hook calls with it are refused from now on.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Collector.","required":true}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailCollector"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/collectors/{id}/rotate/":{"post":{"operationId":"ai_guardrails_collectors_rotate_create","description":"Replace the token. The old one stops working at once, and the collector is active again if it was revoked.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Collector.","required":true}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"The collector, its new token and its managed settings"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/events/":{"get":{"operationId":"ai_guardrails_events_list","description":"Prompt activity: each prompt and tool call a collector checked, newest first (superuser only).","parameters":[{"in":"query","name":"actor_contains","schema":{"type":"string"}},{"in":"query","name":"actor_ends_with","schema":{"type":"string"}},{"in":"query","name":"actor_exact","schema":{"type":"string"}},{"in":"query","name":"actor_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"actor_not_contains","schema":{"type":"string"}},{"in":"query","name":"actor_not_exact","schema":{"type":"string"}},{"in":"query","name":"actor_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"actor_not_regex","schema":{"type":"string"}},{"in":"query","name":"actor_regex","schema":{"type":"string"}},{"in":"query","name":"actor_starts_with","schema":{"type":"string"}},{"in":"query","name":"collector","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"collector_not","schema":{"type":"string"}},{"in":"query","name":"hook_event","schema":{"type":"string"}},{"in":"query","name":"hook_event_not","schema":{"type":"string"}},{"in":"query","name":"hostname_contains","schema":{"type":"string"}},{"in":"query","name":"hostname_ends_with","schema":{"type":"string"}},{"in":"query","name":"hostname_exact","schema":{"type":"string"}},{"in":"query","name":"hostname_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"hostname_not_contains","schema":{"type":"string"}},{"in":"query","name":"hostname_not_exact","schema":{"type":"string"}},{"in":"query","name":"hostname_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"hostname_not_regex","schema":{"type":"string"}},{"in":"query","name":"hostname_regex","schema":{"type":"string"}},{"in":"query","name":"hostname_starts_with","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-actor","-hook_event","-hostname","-id","-occurred_at","-status","-tool_name","actor","hook_event","hostname","id","occurred_at","status","tool_name"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `occurred_at` - Occurred at\n* `-occurred_at` - Occurred at (descending)\n* `actor` - Actor\n* `-actor` - Actor (descending)\n* `hostname` - Hostname\n* `-hostname` - Hostname (descending)\n* `hook_event` - Hook event\n* `-hook_event` - Hook event (descending)\n* `tool_name` - Tool name\n* `-tool_name` - Tool name (descending)\n* `status` - Status\n* `-status` - Status (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"policy","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"policy_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: excerpt, actor, hostname, tool_name, cwd"},{"in":"query","name":"session_id","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"string"}},{"in":"query","name":"status_not","schema":{"type":"string"}},{"in":"query","name":"target","schema":{"type":"string"}},{"in":"query","name":"target_not","schema":{"type":"string"}},{"in":"query","name":"tool_name_contains","schema":{"type":"string"}},{"in":"query","name":"tool_name_ends_with","schema":{"type":"string"}},{"in":"query","name":"tool_name_exact","schema":{"type":"string"}},{"in":"query","name":"tool_name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"tool_name_not_contains","schema":{"type":"string"}},{"in":"query","name":"tool_name_not_exact","schema":{"type":"string"}},{"in":"query","name":"tool_name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"tool_name_not_regex","schema":{"type":"string"}},{"in":"query","name":"tool_name_regex","schema":{"type":"string"}},{"in":"query","name":"tool_name_starts_with","schema":{"type":"string"}}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedGuardrailEventList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/events/{id}/":{"get":{"operationId":"ai_guardrails_events_retrieve","description":"Prompt activity: each prompt and tool call a collector checked, newest first (superuser only).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Event.","required":true}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailEvent"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/policies/":{"get":{"operationId":"ai_guardrails_policies_list","description":"Policies Claude Code prompts and tool calls are checked against (superuser only).","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"mode","schema":{"type":"string"}},{"in":"query","name":"mode_not","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-collector_count","-id","-mode","-name","-rule_count","-updated_at","collector_count","id","mode","name","rule_count","updated_at"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `mode` - Mode\n* `-mode` - Mode (descending)\n* `rule_count` - Rule count\n* `-rule_count` - Rule count (descending)\n* `collector_count` - Collector count\n* `-collector_count` - Collector count (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedGuardrailPolicyList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"ai_guardrails_policies_create","description":"Policies Claude Code prompts and tool calls are checked against (superuser only).","tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GuardrailPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GuardrailPolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/policies/{id}/":{"get":{"operationId":"ai_guardrails_policies_retrieve","description":"Policies Claude Code prompts and tool calls are checked against (superuser only).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Policy.","required":true}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"ai_guardrails_policies_update","description":"Policies Claude Code prompts and tool calls are checked against (superuser only).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Policy.","required":true}],"tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GuardrailPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GuardrailPolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"ai_guardrails_policies_partial_update","description":"Policies Claude Code prompts and tool calls are checked against (superuser only).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Policy.","required":true}],"tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedGuardrailPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedGuardrailPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedGuardrailPolicyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"ai_guardrails_policies_destroy","description":"Policies Claude Code prompts and tool calls are checked against (superuser only).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Policy.","required":true}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/policies/starter/":{"post":{"operationId":"ai_guardrails_policies_starter_create","description":"Create the Claude Code Baseline policy: personal data, secrets and force pushes, in monitor mode.","tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/rules/":{"get":{"operationId":"ai_guardrails_rules_list","description":"The rules of each policy: what to look for, where, and what to do on a match (superuser only).","parameters":[{"in":"query","name":"action","schema":{"type":"string"}},{"in":"query","name":"action_not","schema":{"type":"string"}},{"in":"query","name":"enabled","schema":{"type":"string"}},{"in":"query","name":"kind","schema":{"type":"string"}},{"in":"query","name":"kind_not","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-action","-enabled","-id","-kind","-name","-updated_at","action","enabled","id","kind","name","updated_at"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `action` - Action\n* `-action` - Action (descending)\n* `kind` - Kind\n* `-kind` - Kind (descending)\n* `enabled` - Enabled\n* `-enabled` - Enabled (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"policy","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"policy_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, pattern, message"}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedGuardrailRuleList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"ai_guardrails_rules_create","description":"The rules of each policy: what to look for, where, and what to do on a match (superuser only).","tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailRuleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GuardrailRuleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GuardrailRuleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/rules/{id}/":{"get":{"operationId":"ai_guardrails_rules_retrieve","description":"The rules of each policy: what to look for, where, and what to do on a match (superuser only).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Rule.","required":true}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"ai_guardrails_rules_update","description":"The rules of each policy: what to look for, where, and what to do on a match (superuser only).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Rule.","required":true}],"tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailRuleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GuardrailRuleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GuardrailRuleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"ai_guardrails_rules_partial_update","description":"The rules of each policy: what to look for, where, and what to do on a match (superuser only).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Rule.","required":true}],"tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedGuardrailRuleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedGuardrailRuleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedGuardrailRuleRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuardrailRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"ai_guardrails_rules_destroy","description":"The rules of each policy: what to look for, where, and what to do on a match (superuser only).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this AI Guardrail Rule.","required":true}],"tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/rules/catalogue/":{"get":{"operationId":"ai_guardrails_rules_catalogue_retrieve","description":"The built-in detectors, where a rule can look, and which actions each place allows.","tags":["AI Guardrails"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"Detectors, targets and actions"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_guardrails/rules/test/":{"post":{"operationId":"ai_guardrails_rules_test_create","description":"Run a rule definition over a sample text: what it matched, and the text with matches masked.","tags":["AI Guardrails"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleTestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RuleTestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RuleTestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"What the rule matched"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_inventory/":{"get":{"operationId":"ai_inventory_list","description":"The AI components on the assets the caller can see: one row per component per asset.\n\nRead-only. Rows come from AI inventory imports (``POST /api/v2/sbom-import/`` with the\nscanner's CycloneDX document) and from the AI package catalogue applied to any SBOM import.\nVisibility follows the asset: a row is listed when its asset is viewable.","parameters":[{"in":"query","name":"ai_category","schema":{"type":"string"}},{"in":"query","name":"ai_category_not","schema":{"type":"string"}},{"in":"query","name":"ai_kind","schema":{"type":"string"}},{"in":"query","name":"ai_kind_not","schema":{"type":"string"}},{"in":"query","name":"authorization","schema":{"type":"string"}},{"in":"query","name":"authorization_not","schema":{"type":"string"}},{"in":"query","name":"component_type","schema":{"type":"string"}},{"in":"query","name":"component_type_not","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"location_not","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-authorization","-category","-id","-kind","-last_seen","-name","-product_name","-provider","-purl","authorization","category","id","kind","last_seen","name","product_name","provider","purl"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `purl` - Purl\n* `-purl` - Purl (descending)\n* `kind` - Kind\n* `-kind` - Kind (descending)\n* `category` - Category\n* `-category` - Category (descending)\n* `provider` - Provider\n* `-provider` - Provider (descending)\n* `authorization` - Authorization\n* `-authorization` - Authorization (descending)\n* `product_name` - Product name\n* `-product_name` - Product name (descending)\n* `last_seen` - Last seen\n* `-last_seen` - Last seen (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_name_contains","schema":{"type":"string"}},{"in":"query","name":"product_name_ends_with","schema":{"type":"string"}},{"in":"query","name":"product_name_exact","schema":{"type":"string"}},{"in":"query","name":"product_name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_name_not_contains","schema":{"type":"string"}},{"in":"query","name":"product_name_not_exact","schema":{"type":"string"}},{"in":"query","name":"product_name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_name_not_regex","schema":{"type":"string"}},{"in":"query","name":"product_name_regex","schema":{"type":"string"}},{"in":"query","name":"product_name_starts_with","schema":{"type":"string"}},{"in":"query","name":"product_not","schema":{"type":"string"}},{"in":"query","name":"product_type","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_type_not","schema":{"type":"string"}},{"in":"query","name":"provider_contains","schema":{"type":"string"}},{"in":"query","name":"provider_ends_with","schema":{"type":"string"}},{"in":"query","name":"provider_exact","schema":{"type":"string"}},{"in":"query","name":"provider_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"provider_not_contains","schema":{"type":"string"}},{"in":"query","name":"provider_not_exact","schema":{"type":"string"}},{"in":"query","name":"provider_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"provider_not_regex","schema":{"type":"string"}},{"in":"query","name":"provider_regex","schema":{"type":"string"}},{"in":"query","name":"provider_starts_with","schema":{"type":"string"}},{"in":"query","name":"purl_contains","schema":{"type":"string"}},{"in":"query","name":"purl_ends_with","schema":{"type":"string"}},{"in":"query","name":"purl_exact","schema":{"type":"string"}},{"in":"query","name":"purl_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"purl_not_contains","schema":{"type":"string"}},{"in":"query","name":"purl_not_exact","schema":{"type":"string"}},{"in":"query","name":"purl_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"purl_not_regex","schema":{"type":"string"}},{"in":"query","name":"purl_regex","schema":{"type":"string"}},{"in":"query","name":"purl_starts_with","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: location__dependency__name, location__dependency__namespace, location__location_value, product__name"},{"in":"query","name":"shadow","schema":{"type":"string"}},{"in":"query","name":"source_ref_contains","schema":{"type":"string"}},{"in":"query","name":"source_ref_ends_with","schema":{"type":"string"}},{"in":"query","name":"source_ref_exact","schema":{"type":"string"}},{"in":"query","name":"source_ref_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"source_ref_not_contains","schema":{"type":"string"}},{"in":"query","name":"source_ref_not_exact","schema":{"type":"string"}},{"in":"query","name":"source_ref_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"source_ref_not_regex","schema":{"type":"string"}},{"in":"query","name":"source_ref_regex","schema":{"type":"string"}},{"in":"query","name":"source_ref_starts_with","schema":{"type":"string"}}],"tags":["AI Inventory"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAIInventoryItemList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_inventory/{id}/":{"get":{"operationId":"ai_inventory_retrieve","description":"The AI components on the assets the caller can see: one row per component per asset.\n\nRead-only. Rows come from AI inventory imports (``POST /api/v2/sbom-import/`` with the\nscanner's CycloneDX document) and from the AI package catalogue applied to any SBOM import.\nVisibility follows the asset: a row is listed when its asset is viewable.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - ProductReference.","required":true}],"tags":["AI Inventory"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIInventoryItem"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/ai_inventory/summary/":{"get":{"operationId":"ai_inventory_summary_retrieve","description":"Tile counts for the inventory page, under the same filters as the list.","parameters":[{"in":"query","name":"product","schema":{"type":"integer"},"description":"Limit the counts to these asset ids (comma separated)."}],"tags":["AI Inventory"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIInventorySummary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/announcements/":{"get":{"operationId":"announcements_list","parameters":[{"in":"query","name":"dismissable","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"message","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"style","schema":{"type":"string","x-spec-enum-id":"6f65abe0aab2c78c","enum":["danger","info","success","warning"]},"description":"The style of banner to display. (info, success, warning, danger)\n\n* `info` - Info\n* `success` - Success\n* `warning` - Warning\n* `danger` - Danger"}],"tags":["announcements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAnnouncementList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"announcements_create","tags":["announcements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnouncementRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AnnouncementRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AnnouncementRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Announcement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/announcements/{id}/":{"get":{"operationId":"announcements_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this announcement.","required":true}],"tags":["announcements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Announcement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"announcements_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this announcement.","required":true}],"tags":["announcements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnouncementRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AnnouncementRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AnnouncementRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Announcement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"announcements_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this announcement.","required":true}],"tags":["announcements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedAnnouncementRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedAnnouncementRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedAnnouncementRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Announcement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"announcements_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this announcement.","required":true}],"tags":["announcements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/announcements/{id}/delete_preview/":{"get":{"operationId":"announcements_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this announcement.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["announcements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/answered_surveys/":{"get":{"operationId":"answered_surveys_list","parameters":[{"in":"query","name":"answered_on_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"answered_on_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"answered_on_during","schema":{"type":"string"}},{"in":"query","name":"answered_on_on","schema":{"type":"string"}},{"in":"query","name":"answered_on_past_days","schema":{"type":"number"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-answered_on","-id","-responder","-survey","answered_on","id","responder","survey"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `survey` - Survey\n* `-survey` - Survey (descending)\n* `responder` - Responder\n* `-responder` - Responder (descending)\n* `answered_on` - Answered on\n* `-answered_on` - Answered on (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["assignee","engagement","responder"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"responder","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"responder_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: responder__username, responder__first_name, responder__last_name, answered_on"},{"in":"query","name":"survey","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"survey_not","schema":{"type":"string"}}],"tags":["answered_surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProAnsweredSurveyList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/answered_surveys/{id}/":{"get":{"operationId":"answered_surveys_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Answered Engagement Survey.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["assignee","engagement","responder"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["answered_surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProAnsweredSurvey"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/answered_surveys/{id}/history/":{"get":{"operationId":"answered_surveys_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"answered_on_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"answered_on_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"answered_on_during","schema":{"type":"string"}},{"in":"query","name":"answered_on_on","schema":{"type":"string"}},{"in":"query","name":"answered_on_past_days","schema":{"type":"number"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Answered Engagement Survey.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-answered_on","-id","-responder","-survey","answered_on","id","responder","survey"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `survey` - Survey\n* `-survey` - Survey (descending)\n* `responder` - Responder\n* `-responder` - Responder (descending)\n* `answered_on` - Answered on\n* `-answered_on` - Answered on (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"responder","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"responder_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: responder__username, responder__first_name, responder__last_name, answered_on"},{"in":"query","name":"survey","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"survey_not","schema":{"type":"string"}}],"tags":["answered_surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/answered_surveys/{id}/history/legacy/":{"get":{"operationId":"answered_surveys_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"answered_on_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"answered_on_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"answered_on_during","schema":{"type":"string"}},{"in":"query","name":"answered_on_on","schema":{"type":"string"}},{"in":"query","name":"answered_on_past_days","schema":{"type":"number"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Answered Engagement Survey.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-answered_on","-id","-responder","-survey","answered_on","id","responder","survey"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `survey` - Survey\n* `-survey` - Survey (descending)\n* `responder` - Responder\n* `-responder` - Responder (descending)\n* `answered_on` - Answered on\n* `-answered_on` - Answered on (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"responder","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"responder_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: responder__username, responder__first_name, responder__last_name, answered_on"},{"in":"query","name":"survey","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"survey_not","schema":{"type":"string"}}],"tags":["answered_surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/answered_surveys/{id}/history/legacy/count/":{"get":{"operationId":"answered_surveys_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Answered Engagement Survey.","required":true}],"tags":["answered_surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/api-token-auth/":{"post":{"operationId":"api_token_auth_create","tags":["api-token-auth"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/MFAAuthTokenRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/MFAAuthTokenRequest"}},"application/json":{"schema":{"$ref":"#/components/schemas/MFAAuthTokenRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MFAAuthToken"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/api-tokens/revoke/":{"post":{"operationId":"api_tokens_revoke_create","description":"Revoke an API token by its key value.\n\nAccepts ``{\"key\": \"<token>\"}`` and immediately deletes the matching token. Intended for\nincident response, when a token is found leaked and the owning user is not known.","tags":["api-tokens"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeApiTokenRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RevokeApiTokenRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RevokeApiTokenRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_aliases/":{"get":{"operationId":"asset_aliases_list","description":"The identifiers other systems use for an asset.\n\nReads are open to anyone who can already see the asset and cover every origin, so a UI\ncan show what a connector asserted next to what a person did. Writes mint USER aliases\nonly: connector-issued rows are reconciled by connector sync and are refused here (see\nthe serializer's namespace check).\n\nNo update action, for the same reason the Phase 3 viewsets have none: editing an\nidentifier in place silently re-points identity with no trace of what it used to mean.\nAn identifier is asserted or withdrawn. Moving one deliberately -- a merge -- is its own\noperation, and does not yet exist.","parameters":[{"in":"query","name":"alias_type","schema":{"type":"string"}},{"in":"query","name":"connector_config","schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"namespace","schema":{"type":"string"}},{"in":"query","name":"namespace_startswith","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"origin","schema":{"type":"string","x-spec-enum-id":"ff51c090249de86c","enum":["connector","import","rule","user"]},"description":"Who asserted this identifier. User-asserted aliases are never reconciled away.\n\n* `user` - User\n* `connector` - Connector\n* `rule` - Rule\n* `import` - Import"},{"in":"query","name":"product","schema":{"type":"number"}},{"in":"query","name":"value","schema":{"type":"string"}},{"in":"query","name":"value_contains","schema":{"type":"string"}}],"tags":["asset_aliases"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAssetAliasList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"asset_aliases_create","description":"The identifiers other systems use for an asset.\n\nReads are open to anyone who can already see the asset and cover every origin, so a UI\ncan show what a connector asserted next to what a person did. Writes mint USER aliases\nonly: connector-issued rows are reconciled by connector sync and are refused here (see\nthe serializer's namespace check).\n\nNo update action, for the same reason the Phase 3 viewsets have none: editing an\nidentifier in place silently re-points identity with no trace of what it used to mean.\nAn identifier is asserted or withdrawn. Moving one deliberately -- a merge -- is its own\noperation, and does not yet exist.","tags":["asset_aliases"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAliasRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssetAliasRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssetAliasRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAlias"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_aliases/{id}/":{"get":{"operationId":"asset_aliases_retrieve","description":"The identifiers other systems use for an asset.\n\nReads are open to anyone who can already see the asset and cover every origin, so a UI\ncan show what a connector asserted next to what a person did. Writes mint USER aliases\nonly: connector-issued rows are reconciled by connector sync and are refused here (see\nthe serializer's namespace check).\n\nNo update action, for the same reason the Phase 3 viewsets have none: editing an\nidentifier in place silently re-points identity with no trace of what it used to mean.\nAn identifier is asserted or withdrawn. Moving one deliberately -- a merge -- is its own\noperation, and does not yet exist.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this asset alias.","required":true}],"tags":["asset_aliases"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAlias"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"asset_aliases_destroy","description":"The identifiers other systems use for an asset.\n\nReads are open to anyone who can already see the asset and cover every origin, so a UI\ncan show what a connector asserted next to what a person did. Writes mint USER aliases\nonly: connector-issued rows are reconciled by connector sync and are refused here (see\nthe serializer's namespace check).\n\nNo update action, for the same reason the Phase 3 viewsets have none: editing an\nidentifier in place silently re-points identity with no trace of what it used to mean.\nAn identifier is asserted or withdrawn. Moving one deliberately -- a merge -- is its own\noperation, and does not yet exist.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this asset alias.","required":true}],"tags":["asset_aliases"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_api_scan_configurations/":{"get":{"operationId":"asset_api_scan_configurations_list","parameters":[{"in":"query","name":"asset","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","tool_configuration"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"service_key_1","schema":{"type":"string"}},{"in":"query","name":"service_key_2","schema":{"type":"string"}},{"in":"query","name":"service_key_3","schema":{"type":"string"}},{"in":"query","name":"tool_configuration","schema":{"type":"integer"}}],"tags":["asset_api_scan_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAssetAPIScanConfigurationList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"asset_api_scan_configurations_create","tags":["asset_api_scan_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAPIScanConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssetAPIScanConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssetAPIScanConfigurationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAPIScanConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_api_scan_configurations/{id}/":{"get":{"operationId":"asset_api_scan_configurations_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ap i_ scan_ configuration.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","tool_configuration"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["asset_api_scan_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAPIScanConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"asset_api_scan_configurations_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ap i_ scan_ configuration.","required":true}],"tags":["asset_api_scan_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAPIScanConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssetAPIScanConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssetAPIScanConfigurationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAPIScanConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"asset_api_scan_configurations_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ap i_ scan_ configuration.","required":true}],"tags":["asset_api_scan_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedAssetAPIScanConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedAssetAPIScanConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedAssetAPIScanConfigurationRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetAPIScanConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"asset_api_scan_configurations_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ap i_ scan_ configuration.","required":true}],"tags":["asset_api_scan_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_api_scan_configurations/{id}/delete_preview/":{"get":{"operationId":"asset_api_scan_configurations_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ap i_ scan_ configuration.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["asset_api_scan_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_groups/":{"get":{"operationId":"asset_groups_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"query","name":"asset_id","schema":{"type":"integer"}},{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product_id","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["asset_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedProductGroupList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"asset_groups_create","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","tags":["asset_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_groups/{id}/":{"get":{"operationId":"asset_groups_retrieve","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["asset_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"asset_groups_update","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true}],"tags":["asset_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"asset_groups_destroy","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true}],"tags":["asset_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_groups/{id}/delete_preview/":{"get":{"operationId":"asset_groups_delete_preview_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["asset_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_groups/{id}/history/":{"get":{"operationId":"asset_groups_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"asset_id","schema":{"type":"integer"}},{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product_id","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["asset_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_groups/{id}/history/legacy/":{"get":{"operationId":"asset_groups_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"asset_id","schema":{"type":"integer"}},{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product_id","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["asset_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_groups/{id}/history/legacy/count/":{"get":{"operationId":"asset_groups_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true}],"tags":["asset_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_hierarchy/expand_tree_down/":{"post":{"operationId":"asset_hierarchy_expand_tree_down_create","description":"Expand a node in the hierarchy to load more children","tags":["Asset Hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpandNodeRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ExpandNodeRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ExpandNodeRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpandNodeResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_hierarchy/expand_tree_up/":{"post":{"operationId":"asset_hierarchy_expand_tree_up_create","description":"Load tree centered around a specific node, gathering both ancestors and children","tags":["Asset Hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadTreeFromNodeRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LoadTreeFromNodeRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LoadTreeFromNodeRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadTreeFromNodeResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_hierarchy/load_forest/":{"post":{"operationId":"asset_hierarchy_load_forest_create","description":"Map-first landing: every parent hierarchy the caller can see, in one response.\n\nRoots are authorized assets heading a parent tree (children but no parent),\nordered organization-name then name so same-org trees sit adjacent on the\ncanvas. Traversal defaults to the parent relationship only — unlike\nload_tree, which follows every edge type when no filter is given. An empty\ngraph is a 200 with empty trees, not an error.","tags":["Asset Hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadForestRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LoadForestRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LoadForestRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadForestResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_hierarchy/load_tree/":{"post":{"operationId":"asset_hierarchy_load_tree_create","description":"Load initial hierarchy data for one or more root nodes","tags":["Asset Hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadTreeRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LoadTreeRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LoadTreeRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoadTreeResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_hierarchy/node_stats/":{"post":{"operationId":"asset_hierarchy_node_stats_create","description":"Lazy per-click rollup for one node: active finding counts directly on the\nasset (direct) and across its viewable descendant subtree (indirect), plus\nthat descendant count. Parent relationship only.","tags":["Asset Hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeStatsRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NodeStatsRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NodeStatsRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NodeStatsResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_hierarchy/structure_summary/":{"post":{"operationId":"asset_hierarchy_structure_summary_create","description":"Cleanup review of the caller's authorized hierarchy in one call: totals (organizations, assets, hierarchy roots, deepest tree), assets outside any parent hierarchy, asset names that collide case-insensitively (asset names are unique, so 'Payments-API' vs 'payments-api' is the duplicate this surfaces), and organizations with no assets. Example lists are capped by ``limit`` (default 25, max 100); the counts are always complete. Only assets and organizations the caller can view are counted. A POST that reads: it writes nothing.","tags":["Asset Hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StructureSummaryRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/StructureSummaryRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/StructureSummaryRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StructureSummaryResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_members/":{"get":{"operationId":"asset_members_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"query","name":"asset_id","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product_id","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}},{"in":"query","name":"user","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"user_id","schema":{"type":"integer"}}],"tags":["asset_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedProductMemberList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"asset_members_create","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","tags":["asset_members"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_members/{id}/":{"get":{"operationId":"asset_members_retrieve","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ member.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["asset_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"asset_members_update","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ member.","required":true}],"tags":["asset_members"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"asset_members_destroy","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ member.","required":true}],"tags":["asset_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_members/{id}/delete_preview/":{"get":{"operationId":"asset_members_delete_preview_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ member.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["asset_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_types/":{"get":{"operationId":"asset_types_list","description":"The asset-type vocabulary: repository, service, host, ...\n\nRead-only and unfiltered by authorization -- a type is a label, not data about anyone's\nassets, and every picker in the product needs it.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["asset_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAssetTypeList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_types/{code}/":{"get":{"operationId":"asset_types_retrieve","description":"The asset-type vocabulary: repository, service, host, ...\n\nRead-only and unfiltered by authorization -- a type is a label, not data about anyone's\nassets, and every picker in the product needs it.","parameters":[{"in":"path","name":"code","schema":{"type":"string","description":"Stable lookup key, e.g. 'repository'. Referenced by connectors and imports."},"required":true}],"tags":["asset_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_versions/":{"get":{"operationId":"asset_versions_list","description":"An asset's versions: read them, declare one, remove one.\n\nNo update action: a version is a name that other rows point at (BOM snapshots,\nfound_in/fixed_in claims), so renaming one would silently rewrite the meaning of\nevery document already exported under it. Delete and re-declare instead -- and note\nthat deleting a version cascades its snapshots and claims, which is why it takes edit\npermission on the asset.\n\nAn asset with no versions is the normal, unversioned state: nothing here is required\nfor an asset to behave exactly as it always has.","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}}],"tags":["asset_versions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAssetVersionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"asset_versions_create","description":"An asset's versions: read them, declare one, remove one.\n\nNo update action: a version is a name that other rows point at (BOM snapshots,\nfound_in/fixed_in claims), so renaming one would silently rewrite the meaning of\nevery document already exported under it. Delete and re-declare instead -- and note\nthat deleting a version cascades its snapshots and claims, which is why it takes edit\npermission on the asset.\n\nAn asset with no versions is the normal, unversioned state: nothing here is required\nfor an asset to behave exactly as it always has.","tags":["asset_versions"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetVersionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssetVersionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssetVersionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetVersion"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_versions/{id}/":{"get":{"operationId":"asset_versions_retrieve","description":"An asset's versions: read them, declare one, remove one.\n\nNo update action: a version is a name that other rows point at (BOM snapshots,\nfound_in/fixed_in claims), so renaming one would silently rewrite the meaning of\nevery document already exported under it. Delete and re-declare instead -- and note\nthat deleting a version cascades its snapshots and claims, which is why it takes edit\npermission on the asset.\n\nAn asset with no versions is the normal, unversioned state: nothing here is required\nfor an asset to behave exactly as it always has.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this asset version.","required":true}],"tags":["asset_versions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetVersion"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"asset_versions_destroy","description":"An asset's versions: read them, declare one, remove one.\n\nNo update action: a version is a name that other rows point at (BOM snapshots,\nfound_in/fixed_in claims), so renaming one would silently rewrite the meaning of\nevery document already exported under it. Delete and re-declare instead -- and note\nthat deleting a version cascades its snapshots and claims, which is why it takes edit\npermission on the asset.\n\nAn asset with no versions is the normal, unversioned state: nothing here is required\nfor an asset to behave exactly as it always has.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this asset version.","required":true}],"tags":["asset_versions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/asset_versions/{id}/field_completion/":{"post":{"operationId":"asset_versions_field_completion_create","description":"Record when this version finished reaching the field, and how much of the fleet runs it.\n\nA narrow action rather than a general update, for the reason in the class docstring: a\nversion's name is what other rows point at, so the viewset must not offer a write that\ncan touch it. Section 524B's third metric measures from a fix being available to it\nbeing installed, and DefectDojo does not observe deployments -- so without this the\nmetric computes correctly over an input nothing can supply.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this asset version.","required":true}],"tags":["asset_versions"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetVersionFieldCompletionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssetVersionFieldCompletionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssetVersionFieldCompletionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetVersion"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/":{"get":{"operationId":"assets_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"asset_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"asset_numeric_grade","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"business_criticality","schema":{"type":"array","items":{"type":"string","x-spec-enum-id":"ef412461eb271471","nullable":true,"enum":["high","low","medium","none","very high","very low"]}},"description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","explode":true,"style":"form"},{"in":"query","name":"created","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was initially created, and saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"external_audience","schema":{"type":"boolean"}},{"in":"query","name":"has_children","schema":{"type":"boolean"}},{"in":"query","name":"has_parent","schema":{"type":"boolean"}},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"internet_accessible","schema":{"type":"boolean"}},{"in":"query","name":"lifecycle","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-asset_manager","-asset_manager__first_name","-asset_manager__last_name","-asset_numeric_grade","-business_criticality","-created","-external_audience","-id","-internet_accessible","-lifecycle","-name","-organization","-organization__name","-origin","-platform","-revenue","-team_manager","-team_manager__first_name","-team_manager__last_name","-technical_contact","-technical_contact__first_name","-technical_contact__last_name","-tid","-updated","-user_records","asset_manager","asset_manager__first_name","asset_manager__last_name","asset_numeric_grade","business_criticality","created","external_audience","id","internet_accessible","lifecycle","name","organization","organization__name","origin","platform","revenue","team_manager","team_manager__first_name","team_manager__last_name","technical_contact","technical_contact__first_name","technical_contact__last_name","tid","updated","user_records"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `tid` - Tid\n* `-tid` - Tid (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `asset_numeric_grade` - Asset numeric grade\n* `-asset_numeric_grade` - Asset numeric grade (descending)\n* `business_criticality` - Business criticality\n* `-business_criticality` - Business criticality (descending)\n* `platform` - Platform\n* `-platform` - Platform (descending)\n* `lifecycle` - Lifecycle\n* `-lifecycle` - Lifecycle (descending)\n* `origin` - Origin\n* `-origin` - Origin (descending)\n* `revenue` - Revenue\n* `-revenue` - Revenue (descending)\n* `external_audience` - External audience\n* `-external_audience` - External audience (descending)\n* `internet_accessible` - Internet accessible\n* `-internet_accessible` - Internet accessible (descending)\n* `asset_manager` - Asset manager\n* `-asset_manager` - Asset manager (descending)\n* `asset_manager__first_name` - Asset manager  first name\n* `-asset_manager__first_name` - Asset manager  first name (descending)\n* `asset_manager__last_name` - Asset manager  last name\n* `-asset_manager__last_name` - Asset manager  last name (descending)\n* `technical_contact` - Technical contact\n* `-technical_contact` - Technical contact (descending)\n* `technical_contact__first_name` - Technical contact  first name\n* `-technical_contact__first_name` - Technical contact  first name (descending)\n* `technical_contact__last_name` - Technical contact  last name\n* `-technical_contact__last_name` - Technical contact  last name (descending)\n* `team_manager` - Team manager\n* `-team_manager` - Team manager (descending)\n* `team_manager__first_name` - Team manager  first name\n* `-team_manager__first_name` - Team manager  first name (descending)\n* `team_manager__last_name` - Team manager  last name\n* `-team_manager__last_name` - Team manager  last name (descending)\n* `organization` - Organization\n* `-organization` - Organization (descending)\n* `organization__name` - Organization  name\n* `-organization__name` - Organization  name (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `user_records` - User records\n* `-user_records` - User records (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"origin","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"outside_of_sla","schema":{"type":"number"}},{"in":"query","name":"pci_component_kind","schema":{"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","enum":["bespoke_or_custom_software","payment_page","system_component","third_party_software","unspecified"]},"description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},{"in":"query","name":"pci_scope","schema":{"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","enum":["cde","connected_or_security_impacting","not_assessed","out_of_scope"]},"description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},{"in":"query","name":"platform","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["authorized_users","prod_type","product_manager","regulations","sla_configuration","team_manager","technical_contact","locations"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"regulations","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"revenue","schema":{"type":"number"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"team_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"technical_contact","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"tid","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was most recently saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"user_records","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"}],"tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAssetsList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"assets_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["assets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssetsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssetsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assets"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/{id}/":{"get":{"operationId":"assets_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["authorized_users","prod_type","product_manager","regulations","sla_configuration","team_manager","technical_contact","locations"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assets"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"assets_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["assets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssetsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssetsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assets"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"assets_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["assets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedAssetsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedAssetsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedAssetsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Assets"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"assets_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/{id}/delete_preview/":{"get":{"operationId":"assets_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/{id}/finding_diff/{other_id}/":{"get":{"operationId":"assets_finding_diff_retrieve","description":"Compares the findings associated with the two objects and returns\nadded, removed, equality, and improvement information.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"in":"path","name":"other_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true}],"tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingDiff"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/{id}/generate_report/":{"post":{"operationId":"assets_generate_report_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["assets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/{id}/history/":{"get":{"operationId":"assets_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"asset_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"asset_numeric_grade","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"business_criticality","schema":{"type":"array","items":{"type":"string","x-spec-enum-id":"ef412461eb271471","nullable":true,"enum":["high","low","medium","none","very high","very low"]}},"description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","explode":true,"style":"form"},{"in":"query","name":"created","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was initially created, and saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"external_audience","schema":{"type":"boolean"}},{"in":"query","name":"has_children","schema":{"type":"boolean"}},{"in":"query","name":"has_parent","schema":{"type":"boolean"}},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"internet_accessible","schema":{"type":"boolean"}},{"in":"query","name":"lifecycle","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-asset_manager","-asset_manager__first_name","-asset_manager__last_name","-asset_numeric_grade","-business_criticality","-created","-external_audience","-id","-internet_accessible","-lifecycle","-name","-organization","-organization__name","-origin","-platform","-revenue","-team_manager","-team_manager__first_name","-team_manager__last_name","-technical_contact","-technical_contact__first_name","-technical_contact__last_name","-tid","-updated","-user_records","asset_manager","asset_manager__first_name","asset_manager__last_name","asset_numeric_grade","business_criticality","created","external_audience","id","internet_accessible","lifecycle","name","organization","organization__name","origin","platform","revenue","team_manager","team_manager__first_name","team_manager__last_name","technical_contact","technical_contact__first_name","technical_contact__last_name","tid","updated","user_records"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `tid` - Tid\n* `-tid` - Tid (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `asset_numeric_grade` - Asset numeric grade\n* `-asset_numeric_grade` - Asset numeric grade (descending)\n* `business_criticality` - Business criticality\n* `-business_criticality` - Business criticality (descending)\n* `platform` - Platform\n* `-platform` - Platform (descending)\n* `lifecycle` - Lifecycle\n* `-lifecycle` - Lifecycle (descending)\n* `origin` - Origin\n* `-origin` - Origin (descending)\n* `revenue` - Revenue\n* `-revenue` - Revenue (descending)\n* `external_audience` - External audience\n* `-external_audience` - External audience (descending)\n* `internet_accessible` - Internet accessible\n* `-internet_accessible` - Internet accessible (descending)\n* `asset_manager` - Asset manager\n* `-asset_manager` - Asset manager (descending)\n* `asset_manager__first_name` - Asset manager  first name\n* `-asset_manager__first_name` - Asset manager  first name (descending)\n* `asset_manager__last_name` - Asset manager  last name\n* `-asset_manager__last_name` - Asset manager  last name (descending)\n* `technical_contact` - Technical contact\n* `-technical_contact` - Technical contact (descending)\n* `technical_contact__first_name` - Technical contact  first name\n* `-technical_contact__first_name` - Technical contact  first name (descending)\n* `technical_contact__last_name` - Technical contact  last name\n* `-technical_contact__last_name` - Technical contact  last name (descending)\n* `team_manager` - Team manager\n* `-team_manager` - Team manager (descending)\n* `team_manager__first_name` - Team manager  first name\n* `-team_manager__first_name` - Team manager  first name (descending)\n* `team_manager__last_name` - Team manager  last name\n* `-team_manager__last_name` - Team manager  last name (descending)\n* `organization` - Organization\n* `-organization` - Organization (descending)\n* `organization__name` - Organization  name\n* `-organization__name` - Organization  name (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `user_records` - User records\n* `-user_records` - User records (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"origin","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"outside_of_sla","schema":{"type":"number"}},{"in":"query","name":"pci_component_kind","schema":{"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","enum":["bespoke_or_custom_software","payment_page","system_component","third_party_software","unspecified"]},"description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},{"in":"query","name":"pci_scope","schema":{"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","enum":["cde","connected_or_security_impacting","not_assessed","out_of_scope"]},"description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},{"in":"query","name":"platform","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"regulations","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"revenue","schema":{"type":"number"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"team_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"technical_contact","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"tid","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was most recently saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"user_records","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"}],"tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/{id}/history/legacy/":{"get":{"operationId":"assets_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"asset_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"asset_numeric_grade","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"business_criticality","schema":{"type":"array","items":{"type":"string","x-spec-enum-id":"ef412461eb271471","nullable":true,"enum":["high","low","medium","none","very high","very low"]}},"description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","explode":true,"style":"form"},{"in":"query","name":"created","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was initially created, and saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"external_audience","schema":{"type":"boolean"}},{"in":"query","name":"has_children","schema":{"type":"boolean"}},{"in":"query","name":"has_parent","schema":{"type":"boolean"}},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"internet_accessible","schema":{"type":"boolean"}},{"in":"query","name":"lifecycle","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-asset_manager","-asset_manager__first_name","-asset_manager__last_name","-asset_numeric_grade","-business_criticality","-created","-external_audience","-id","-internet_accessible","-lifecycle","-name","-organization","-organization__name","-origin","-platform","-revenue","-team_manager","-team_manager__first_name","-team_manager__last_name","-technical_contact","-technical_contact__first_name","-technical_contact__last_name","-tid","-updated","-user_records","asset_manager","asset_manager__first_name","asset_manager__last_name","asset_numeric_grade","business_criticality","created","external_audience","id","internet_accessible","lifecycle","name","organization","organization__name","origin","platform","revenue","team_manager","team_manager__first_name","team_manager__last_name","technical_contact","technical_contact__first_name","technical_contact__last_name","tid","updated","user_records"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `tid` - Tid\n* `-tid` - Tid (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `asset_numeric_grade` - Asset numeric grade\n* `-asset_numeric_grade` - Asset numeric grade (descending)\n* `business_criticality` - Business criticality\n* `-business_criticality` - Business criticality (descending)\n* `platform` - Platform\n* `-platform` - Platform (descending)\n* `lifecycle` - Lifecycle\n* `-lifecycle` - Lifecycle (descending)\n* `origin` - Origin\n* `-origin` - Origin (descending)\n* `revenue` - Revenue\n* `-revenue` - Revenue (descending)\n* `external_audience` - External audience\n* `-external_audience` - External audience (descending)\n* `internet_accessible` - Internet accessible\n* `-internet_accessible` - Internet accessible (descending)\n* `asset_manager` - Asset manager\n* `-asset_manager` - Asset manager (descending)\n* `asset_manager__first_name` - Asset manager  first name\n* `-asset_manager__first_name` - Asset manager  first name (descending)\n* `asset_manager__last_name` - Asset manager  last name\n* `-asset_manager__last_name` - Asset manager  last name (descending)\n* `technical_contact` - Technical contact\n* `-technical_contact` - Technical contact (descending)\n* `technical_contact__first_name` - Technical contact  first name\n* `-technical_contact__first_name` - Technical contact  first name (descending)\n* `technical_contact__last_name` - Technical contact  last name\n* `-technical_contact__last_name` - Technical contact  last name (descending)\n* `team_manager` - Team manager\n* `-team_manager` - Team manager (descending)\n* `team_manager__first_name` - Team manager  first name\n* `-team_manager__first_name` - Team manager  first name (descending)\n* `team_manager__last_name` - Team manager  last name\n* `-team_manager__last_name` - Team manager  last name (descending)\n* `organization` - Organization\n* `-organization` - Organization (descending)\n* `organization__name` - Organization  name\n* `-organization__name` - Organization  name (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `user_records` - User records\n* `-user_records` - User records (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"origin","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"outside_of_sla","schema":{"type":"number"}},{"in":"query","name":"pci_component_kind","schema":{"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","enum":["bespoke_or_custom_software","payment_page","system_component","third_party_software","unspecified"]},"description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},{"in":"query","name":"pci_scope","schema":{"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","enum":["cde","connected_or_security_impacting","not_assessed","out_of_scope"]},"description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},{"in":"query","name":"platform","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"regulations","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"revenue","schema":{"type":"number"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"team_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"technical_contact","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"tid","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was most recently saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"user_records","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"}],"tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/{id}/history/legacy/count/":{"get":{"operationId":"assets_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/{id}/priority_drivers/":{"get":{"operationId":"assets_priority_drivers_retrieve","description":"What drives this asset's finding priority and SLA: the five priority fields with their set or unset state and the prioritization engine's weight for each (revenue and user records also carry the asset's share of its organization's total), the prioritization engine, and the SLA configuration with where it comes from (`default`, `criticality_mapping` or `asset`).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriorityDrivers"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/{id}/remove_parent/":{"post":{"operationId":"assets_remove_parent_create","description":"Detach this asset from its current parent and decide what happens to the asset's own children in the same transaction. `orphan_child_children: false` closes the gap (the children move under the asset's former parent); `true` scatters them (each child becomes a root). To detach while keeping the subtree intact, `PATCH {\"parent\": null}` the asset instead. Requires the global Asset_Hierarchy_Edit permission plus Product_Edit on both the asset and its parent, and the `asset_hierarchy` feature flag. 400 when the asset has no parent or the resulting graph would break a hierarchy constraint.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["assets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveParentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RemoveParentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RemoveParentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/bulk_update/":{"post":{"operationId":"assets_bulk_update_create","description":"Apply the same change to many assets in one request: organization (`prod_type`), parent (`null` detaches), asset type, business criticality, contacts (`technical_contact`, `team_manager`, `product_manager`), SLA configuration, prioritization engine, and tags (added, never replaced). At most 500 assets per request. All-or-nothing: if any asset is refused, nothing is written and the 400 lists every refused asset under `errors`. Permissions match a single-asset PATCH: Product_Edit on each asset and on the new parent, Product_Type_Add_Product on the destination organization. Moving an asset to another organization moves its descendants with it unless `move_children` is false (the children then stay behind and become roots), and removes a parent link left crossing organizations. Setting `parent` requires the asset hierarchy. `dry_run: true` writes nothing and returns the change plan diff of the request instead: every field change with its value before and after, the descendants that move along, the parent links a move removes, the organizations whose priority is recalculated, and every refused asset (the same shape as `diff` on `/api/v2/hierarchy/plans/`).","tags":["assets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateAssetRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BulkUpdateAssetRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BulkUpdateAssetRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateResponse"}}},"description":"The counts of an applied update, or the diff of a dry run (dry_run: true)."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateRejected"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/needs_attention/":{"get":{"operationId":"assets_needs_attention_list","description":"Assets that still need attention after onboarding, with the reasons: `connector_default_org` (the asset sits in the organization a connector created as its default, and that connector mapped it) and `missing_priority_fields` (any of business_criticality, user_records, revenue, external_audience, internet_accessible is unset; `missing_fields` names which). Filter by `reason`, `missing_field`, `organization`, `connector` (comma-separated). Only assets the caller may view are listed.","parameters":[{"in":"query","name":"connector","schema":{"type":"string"},"description":"Connector configuration ids, comma-separated."},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"missing_field","schema":{"type":"string"},"description":"Priority fields, comma-separated (any of them missing)."},{"in":"query","name":"o","schema":{"type":"string"},"description":"Ordering: name, organization or id (prefix - for descending)."},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization","schema":{"type":"string"},"description":"Organization ids, comma-separated."},{"in":"query","name":"reason","schema":{"type":"string"},"description":"Reasons, comma-separated: connector_default_org, missing_priority_fields."},{"in":"query","name":"search","schema":{"type":"string"},"description":"Asset name contains."}],"tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedNeedsAttentionAssetList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/needs_attention/summary/":{"get":{"operationId":"assets_needs_attention_summary_retrieve","description":"Counts behind the assets needing attention list: `total`, `by_reason`, `by_field` (assets missing each priority field), `by_organization` (largest first, at most 100) and `by_connector`. Optionally scoped by `organization` and `connector`.","parameters":[{"in":"query","name":"connector","schema":{"type":"string"},"description":"Connector configuration ids, comma-separated."},{"in":"query","name":"organization","schema":{"type":"string"},"description":"Organization ids, comma-separated."}],"tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NeedsAttentionSummary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/assets/onboarding_status/":{"get":{"operationId":"assets_onboarding_status_retrieve","description":"Whether onboarding is complete: `onboarding_complete` is true when none of the assets the caller may view needs attention (no asset left in a connector's default organization, and every priority field set). Also returns the counts per reason.","tags":["assets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingStatus"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/audit_log/":{"get":{"operationId":"audit_log_list","description":"List pghistory events with normalization and prefetching. So we can't use DRF built-in filtering/pagination.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["audit_log"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/audit_log/{pgh_slug}/":{"get":{"operationId":"audit_log_retrieve","description":"Retrieve a single pghistory event, normalized like the list view.","parameters":[{"in":"path","name":"pgh_slug","schema":{"type":"string","pattern":"^[^/]+$"},"required":true}],"tags":["audit_log"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLog"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/audit_log/legacy/":{"get":{"operationId":"audit_log_legacy_retrieve","description":"Legacy audit log endpoint (django-auditlog entries).\n\nDelegates to LegacyAuditLogViewSet to handle django-auditlog entries.","tags":["audit_log"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLog"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/audit_log/legacy/count/":{"get":{"operationId":"audit_log_legacy_count_retrieve","description":"Legacy audit log count endpoint.\n\nReturns the total count of legacy audit log entries (unfiltered).","tags":["audit_log"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLog"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/audit_log/legacy/model_names/":{"get":{"operationId":"audit_log_legacy_model_names_retrieve","description":"Legacy model names endpoint.\n\nReturns model names from django-auditlog entries.","tags":["audit_log"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLog"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/audit_log/model_names/":{"get":{"operationId":"audit_log_model_names_retrieve","description":"Returns a list of all distinct model names present in the pghistory entries.","tags":["audit_log"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLog"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_categories/":{"get":{"operationId":"benchmark_categories_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"objective","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"references","schema":{"type":"string"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"type","schema":{"type":"integer"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}}],"tags":["benchmark_categories"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedBenchmarkCategoryList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"benchmark_categories_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["benchmark_categories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BenchmarkCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BenchmarkCategoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkCategory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_categories/{id}/":{"get":{"operationId":"benchmark_categories_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ category.","required":true},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["benchmark_categories"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkCategory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"benchmark_categories_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ category.","required":true}],"tags":["benchmark_categories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BenchmarkCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BenchmarkCategoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkCategory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"benchmark_categories_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ category.","required":true}],"tags":["benchmark_categories"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkCategoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkCategoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkCategoryRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkCategory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"benchmark_categories_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ category.","required":true}],"tags":["benchmark_categories"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_categories/{id}/delete_preview/":{"get":{"operationId":"benchmark_categories_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ category.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["benchmark_categories"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_product_summaries/":{"get":{"operationId":"benchmark_product_summaries_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"asvs_level_1_benchmark","schema":{"type":"integer"}},{"in":"query","name":"asvs_level_1_score","schema":{"type":"integer"}},{"in":"query","name":"asvs_level_2_benchmark","schema":{"type":"integer"}},{"in":"query","name":"asvs_level_2_score","schema":{"type":"integer"}},{"in":"query","name":"asvs_level_3_benchmark","schema":{"type":"integer"}},{"in":"query","name":"asvs_level_3_score","schema":{"type":"integer"}},{"in":"query","name":"benchmark_type","schema":{"type":"integer"}},{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"current_level","schema":{"type":"string","x-spec-enum-id":"51d382524500f67b","nullable":true,"enum":["Level 1","Level 2","Level 3"]},"description":"* `Level 1` - Level 1\n* `Level 2` - Level 2\n* `Level 3` - Level 3"},{"in":"query","name":"desired_level","schema":{"type":"string","x-spec-enum-id":"51d382524500f67b","enum":["Level 1","Level 2","Level 3"]},"description":"* `Level 1` - Level 1\n* `Level 2` - Level 2\n* `Level 3` - Level 3"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"publish","schema":{"type":"boolean"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}}],"tags":["benchmark_product_summaries"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedBenchmarkProductSummaryList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"benchmark_product_summaries_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["benchmark_product_summaries"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProductSummaryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BenchmarkProductSummaryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BenchmarkProductSummaryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProductSummary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_product_summaries/{id}/":{"get":{"operationId":"benchmark_product_summaries_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ product_ summary.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["benchmark_product_summaries"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProductSummary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"benchmark_product_summaries_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ product_ summary.","required":true}],"tags":["benchmark_product_summaries"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProductSummaryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BenchmarkProductSummaryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BenchmarkProductSummaryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProductSummary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"benchmark_product_summaries_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ product_ summary.","required":true}],"tags":["benchmark_product_summaries"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkProductSummaryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkProductSummaryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkProductSummaryRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProductSummary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"benchmark_product_summaries_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ product_ summary.","required":true}],"tags":["benchmark_product_summaries"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_product_summaries/{id}/delete_preview/":{"get":{"operationId":"benchmark_product_summaries_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ product_ summary.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["benchmark_product_summaries"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_products/":{"get":{"operationId":"benchmark_products_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"control","schema":{"type":"integer"}},{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"notes","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"pass_fail","schema":{"type":"boolean"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["notes","product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}}],"tags":["benchmark_products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedBenchmarkProductList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"benchmark_products_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["benchmark_products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProductRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BenchmarkProductRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BenchmarkProductRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProduct"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_products/{id}/":{"get":{"operationId":"benchmark_products_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ product.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["notes","product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["benchmark_products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProduct"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"benchmark_products_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ product.","required":true}],"tags":["benchmark_products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProductRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BenchmarkProductRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BenchmarkProductRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProduct"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"benchmark_products_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ product.","required":true}],"tags":["benchmark_products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkProductRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkProductRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkProductRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkProduct"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"benchmark_products_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ product.","required":true}],"tags":["benchmark_products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_products/{id}/delete_preview/":{"get":{"operationId":"benchmark_products_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ product.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["benchmark_products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_requirements/":{"get":{"operationId":"benchmark_requirements_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"category","schema":{"type":"integer"}},{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"level_1","schema":{"type":"boolean"}},{"in":"query","name":"level_2","schema":{"type":"boolean"}},{"in":"query","name":"level_3","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"objective","schema":{"type":"string"}},{"in":"query","name":"objective_number","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"references","schema":{"type":"string"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}}],"tags":["benchmark_requirements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedBenchmarkRequirementList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"benchmark_requirements_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["benchmark_requirements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkRequirementRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BenchmarkRequirementRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BenchmarkRequirementRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkRequirement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_requirements/{id}/":{"get":{"operationId":"benchmark_requirements_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ requirement.","required":true},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["benchmark_requirements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkRequirement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"benchmark_requirements_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ requirement.","required":true}],"tags":["benchmark_requirements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkRequirementRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BenchmarkRequirementRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BenchmarkRequirementRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkRequirement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"benchmark_requirements_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ requirement.","required":true}],"tags":["benchmark_requirements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkRequirementRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkRequirementRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkRequirementRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkRequirement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"benchmark_requirements_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ requirement.","required":true}],"tags":["benchmark_requirements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_requirements/{id}/delete_preview/":{"get":{"operationId":"benchmark_requirements_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ requirement.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["benchmark_requirements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_types/":{"get":{"operationId":"benchmark_types_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"benchmark_source","schema":{"type":"string","x-spec-enum-id":"091a6ccd03b2ee84","nullable":true,"enum":["OWASP ASVS","OWASP Mobile ASVS","PCI"]},"description":"* `PCI` - PCI\n* `OWASP ASVS` - OWASP ASVS\n* `OWASP Mobile ASVS` - OWASP Mobile ASVS"},{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"version","schema":{"type":"string"}}],"tags":["benchmark_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedBenchmarkTypeList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"benchmark_types_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["benchmark_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BenchmarkTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BenchmarkTypeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_types/{id}/":{"get":{"operationId":"benchmark_types_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ type.","required":true},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["benchmark_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"benchmark_types_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ type.","required":true}],"tags":["benchmark_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BenchmarkTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BenchmarkTypeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"benchmark_types_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ type.","required":true}],"tags":["benchmark_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedBenchmarkTypeRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BenchmarkType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"benchmark_types_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ type.","required":true}],"tags":["benchmark_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/benchmark_types/{id}/delete_preview/":{"get":{"operationId":"benchmark_types_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this benchmark_ type.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["benchmark_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/celery/queue/details/":{"get":{"operationId":"celery_queue_details_list","description":"Scans every message in the queue (O(N)) and returns task name, count, and oldest/newest queue positions. May be slow for large queues.","summary":"Get per-task breakdown of the Celery queue","tags":["celery"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CeleryQueueTaskDetail"}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/celery/queue/purge/":{"post":{"operationId":"celery_queue_purge_create","description":"Removes all pending tasks from the default Celery queue. Tasks already being executed by workers are not affected. Note: if deduplication tasks were queued, you may need to re-run deduplication manually via `python manage.py dedupe`.","summary":"Purge all pending Celery tasks from the queue","tags":["celery"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"purged":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/celery/queue/task/purge/":{"post":{"operationId":"celery_queue_task_purge_create","description":"Removes all pending tasks matching the given task name from the default Celery queue.","summary":"Purge all queued tasks with a given task name","tags":["celery"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"task_name":{"type":"string"}},"required":["task_name"]}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"purged":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/celery/status/":{"get":{"operationId":"celery_status_retrieve","description":"Returns Celery worker liveness, pending queue length, and the active task timeout/expiry configuration. Uses the Celery control channel (pidbox) for worker status so it works correctly even when the task queue is clogged.","summary":"Get Celery worker and queue status","tags":["celery"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CeleryStatus"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cicd_infrastructure/":{"get":{"operationId":"cicd_infrastructure_list","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"infrastructure_type","schema":{"type":"string","x-spec-enum-id":"a1515c7dc5876b23","enum":["build_server","orchestration","scm_server"]},"description":"* `scm_server` - SCM Server\n* `build_server` - Build Server\n* `orchestration` - Orchestration Engine"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["cicd_infrastructure"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCICDInfrastructureList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"cicd_infrastructure_create","tags":["cicd_infrastructure"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CICDInfrastructureRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CICDInfrastructureRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CICDInfrastructureRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CICDInfrastructure"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cicd_infrastructure/{id}/":{"get":{"operationId":"cicd_infrastructure_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cicd infrastructure.","required":true}],"tags":["cicd_infrastructure"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CICDInfrastructure"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"cicd_infrastructure_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cicd infrastructure.","required":true}],"tags":["cicd_infrastructure"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CICDInfrastructureRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CICDInfrastructureRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CICDInfrastructureRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CICDInfrastructure"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"cicd_infrastructure_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cicd infrastructure.","required":true}],"tags":["cicd_infrastructure"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCICDInfrastructureRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCICDInfrastructureRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCICDInfrastructureRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CICDInfrastructure"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"cicd_infrastructure_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cicd infrastructure.","required":true}],"tags":["cicd_infrastructure"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cicd_infrastructure/{id}/delete_preview/":{"get":{"operationId":"cicd_infrastructure_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cicd infrastructure.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["cicd_infrastructure"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/classifier/calls/":{"get":{"operationId":"classifier_calls_list","description":"``/api/v2/classifier/calls/``: the audit log of classifier calls, newest first, optionally\nnarrowed with ``?use=`` and ``?backend=``. Superusers only.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["classifier"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedClassifierCallList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/classifier/settings/":{"get":{"operationId":"classifier_settings_list","description":"``/api/v2/classifier/settings/``: the Jev connection. Superusers only.","tags":["classifier"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClassifierSettings"}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/classifier/settings/update/":{"patch":{"operationId":"classifier_settings_update_partial_update","description":"``/api/v2/classifier/settings/``: the Jev connection. Superusers only.","tags":["classifier"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedClassifierSettingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedClassifierSettingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedClassifierSettingsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassifierSettings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/classifier/uses/":{"get":{"operationId":"classifier_uses_list","description":"``/api/v2/classifier/uses/``: every registered use with its backend and threshold. Superusers\nonly, since enabling a backend decides where an instance's content is sent.","tags":["classifier"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClassifierUse"}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/classifier/uses/{use}/":{"get":{"operationId":"classifier_uses_retrieve","description":"``/api/v2/classifier/uses/``: every registered use with its backend and threshold. Superusers\nonly, since enabling a backend decides where an instance's content is sent.","parameters":[{"in":"path","name":"use","schema":{"type":"string","pattern":"^[a-z0-9_]+$"},"required":true}],"tags":["classifier"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassifierUse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"classifier_uses_partial_update","description":"``/api/v2/classifier/uses/``: every registered use with its backend and threshold. Superusers\nonly, since enabling a backend decides where an instance's content is sent.","parameters":[{"in":"path","name":"use","schema":{"type":"string","pattern":"^[a-z0-9_]+$"},"required":true}],"tags":["classifier"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedClassifierUseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedClassifierUseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedClassifierUseRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassifierUse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cloud_firewall/":{"get":{"operationId":"cloud_firewall_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["cloud_firewall"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedFireWallList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cloud_firewall/{id}/":{"get":{"operationId":"cloud_firewall_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this fire wall.","required":true}],"tags":["cloud_firewall"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FireWall"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cloud_firewall/add_rules/":{"post":{"operationId":"cloud_firewall_add_rules_create","tags":["cloud_firewall"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModifyFireWallRulesRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ModifyFireWallRulesRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ModifyFireWallRulesRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModifyFireWallRules"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cloud_firewall/remove_rules/":{"post":{"operationId":"cloud_firewall_remove_rules_create","tags":["cloud_firewall"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModifyFireWallRulesRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ModifyFireWallRulesRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ModifyFireWallRulesRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModifyFireWallRules"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cloud_firewall/update_external_services/":{"post":{"operationId":"cloud_firewall_update_external_services_create","tags":["cloud_firewall"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirewallExternalServicesRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FirewallExternalServicesRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FirewallExternalServicesRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirewallExternalServices"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_assessments/":{"get":{"operationId":"cmmc_assessments_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"catalog","schema":{"type":"integer"}},{"in":"query","name":"level","schema":{"type":"string","x-spec-enum-id":"117ff2bd42599a29","title":"CMMC Level","enum":["1","2","3"]},"description":"The CMMC level being assessed\n\n* `1` - Level 1\n* `2` - Level 2\n* `3` - Level 3"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"049f865152329835","enum":["conditional","expired","final","in_progress"]},"description":"Assessment lifecycle status\n\n* `in_progress` - In progress\n* `conditional` - Conditional\n* `final` - Final\n* `expired` - Expired (conditional closeout lapsed)"}],"tags":["cmmc_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCmmcAssessmentList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"cmmc_assessments_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["cmmc_assessments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcAssessment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_assessments/{id}/":{"get":{"operationId":"cmmc_assessments_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc assessment.","required":true}],"tags":["cmmc_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcAssessment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"cmmc_assessments_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc assessment.","required":true}],"tags":["cmmc_assessments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcAssessment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"cmmc_assessments_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc assessment.","required":true}],"tags":["cmmc_assessments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCmmcAssessmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCmmcAssessmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCmmcAssessmentRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcAssessment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"cmmc_assessments_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc assessment.","required":true}],"tags":["cmmc_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_assessments/{id}/history/":{"get":{"operationId":"cmmc_assessments_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"catalog","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc assessment.","required":true},{"in":"query","name":"level","schema":{"type":"string","x-spec-enum-id":"117ff2bd42599a29","title":"CMMC Level","enum":["1","2","3"]},"description":"The CMMC level being assessed\n\n* `1` - Level 1\n* `2` - Level 2\n* `3` - Level 3"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"049f865152329835","enum":["conditional","expired","final","in_progress"]},"description":"Assessment lifecycle status\n\n* `in_progress` - In progress\n* `conditional` - Conditional\n* `final` - Final\n* `expired` - Expired (conditional closeout lapsed)"}],"tags":["cmmc_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_assessments/{id}/history/legacy/":{"get":{"operationId":"cmmc_assessments_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"catalog","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc assessment.","required":true},{"in":"query","name":"level","schema":{"type":"string","x-spec-enum-id":"117ff2bd42599a29","title":"CMMC Level","enum":["1","2","3"]},"description":"The CMMC level being assessed\n\n* `1` - Level 1\n* `2` - Level 2\n* `3` - Level 3"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"049f865152329835","enum":["conditional","expired","final","in_progress"]},"description":"Assessment lifecycle status\n\n* `in_progress` - In progress\n* `conditional` - Conditional\n* `final` - Final\n* `expired` - Expired (conditional closeout lapsed)"}],"tags":["cmmc_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_assessments/{id}/history/legacy/count/":{"get":{"operationId":"cmmc_assessments_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc assessment.","required":true}],"tags":["cmmc_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_assessments/{id}/posture_evidence/":{"get":{"operationId":"cmmc_assessments_posture_evidence_retrieve","description":"Posture-scan evidence for the NIST SP 800-171 configuration management requirements (3.4.1, 3.4.2,\n3.4.6, 3.4.7): which posture scans ran in the 90 days up to the assessment date and what they still find\nopen, per host. A read, computed on request and never stored, so it writes nothing and stays out of the Go\ndelegation; the assessor still sets each result.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc assessment.","required":true}],"tags":["cmmc_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_assessments/{id}/recompute/":{"post":{"operationId":"cmmc_assessments_recompute_create","description":"Recompute the assessment's status (final/conditional/in-progress/expired) from its results.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc assessment.","required":true}],"tags":["cmmc_assessments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcAssessment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_assessments/{id}/seed_requirements/":{"post":{"operationId":"cmmc_assessments_seed_requirements_create","description":"Create a (not-met) result for every enabled control in the assessment's catalog that does not\nalready have one, so the requirements table is fully populated for the assessor to work through.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc assessment.","required":true}],"tags":["cmmc_assessments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CmmcAssessmentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcAssessment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_requirement_results/":{"get":{"operationId":"cmmc_requirement_results_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"assessment","schema":{"type":"integer"}},{"in":"query","name":"control","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"d36b34e3703ead72","title":"Result","enum":["met","na","not_met","planned"]},"description":"Whether the requirement is met, not met, not applicable, or planned on a POA&M\n\n* `met` - Met\n* `not_met` - Not met\n* `na` - Not applicable\n* `planned` - Planned (on POA&M)"}],"tags":["cmmc_requirement_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCmmcRequirementResultList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"cmmc_requirement_results_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["cmmc_requirement_results"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcRequirementResultRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CmmcRequirementResultRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CmmcRequirementResultRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcRequirementResult"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_requirement_results/{id}/":{"get":{"operationId":"cmmc_requirement_results_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc requirement result.","required":true}],"tags":["cmmc_requirement_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcRequirementResult"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"cmmc_requirement_results_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc requirement result.","required":true}],"tags":["cmmc_requirement_results"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcRequirementResultRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CmmcRequirementResultRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CmmcRequirementResultRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcRequirementResult"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"cmmc_requirement_results_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc requirement result.","required":true}],"tags":["cmmc_requirement_results"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCmmcRequirementResultRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCmmcRequirementResultRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCmmcRequirementResultRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CmmcRequirementResult"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"cmmc_requirement_results_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc requirement result.","required":true}],"tags":["cmmc_requirement_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_requirement_results/{id}/history/":{"get":{"operationId":"cmmc_requirement_results_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"assessment","schema":{"type":"integer"}},{"in":"query","name":"control","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc requirement result.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"d36b34e3703ead72","title":"Result","enum":["met","na","not_met","planned"]},"description":"Whether the requirement is met, not met, not applicable, or planned on a POA&M\n\n* `met` - Met\n* `not_met` - Not met\n* `na` - Not applicable\n* `planned` - Planned (on POA&M)"}],"tags":["cmmc_requirement_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_requirement_results/{id}/history/legacy/":{"get":{"operationId":"cmmc_requirement_results_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"assessment","schema":{"type":"integer"}},{"in":"query","name":"control","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc requirement result.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"d36b34e3703ead72","title":"Result","enum":["met","na","not_met","planned"]},"description":"Whether the requirement is met, not met, not applicable, or planned on a POA&M\n\n* `met` - Met\n* `not_met` - Not met\n* `na` - Not applicable\n* `planned` - Planned (on POA&M)"}],"tags":["cmmc_requirement_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/cmmc_requirement_results/{id}/history/legacy/count/":{"get":{"operationId":"cmmc_requirement_results_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this cmmc requirement result.","required":true}],"tags":["cmmc_requirement_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/compliance_profiles/":{"get":{"operationId":"compliance_profiles_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}}],"tags":["compliance_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedComplianceSystemProfileList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"compliance_profiles_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["compliance_profiles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfileRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/compliance_profiles/{id}/":{"get":{"operationId":"compliance_profiles_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this compliance system profile.","required":true}],"tags":["compliance_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"compliance_profiles_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this compliance system profile.","required":true}],"tags":["compliance_profiles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfileRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"compliance_profiles_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this compliance system profile.","required":true}],"tags":["compliance_profiles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedComplianceSystemProfileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedComplianceSystemProfileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedComplianceSystemProfileRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"compliance_profiles_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this compliance system profile.","required":true}],"tags":["compliance_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/compliance_profiles/{id}/history/":{"get":{"operationId":"compliance_profiles_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this compliance system profile.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}}],"tags":["compliance_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/compliance_profiles/{id}/history/legacy/":{"get":{"operationId":"compliance_profiles_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this compliance system profile.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}}],"tags":["compliance_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/compliance_profiles/{id}/history/legacy/count/":{"get":{"operationId":"compliance_profiles_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this compliance system profile.","required":true}],"tags":["compliance_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/compliance_profiles/{id}/sync/":{"post":{"operationId":"compliance_profiles_sync_create","description":"Trigger a POA&M sync for this profile's product.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this compliance system profile.","required":true}],"tags":["compliance_profiles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfileRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComplianceSystemProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/configuration_permissions/":{"get":{"operationId":"configuration_permissions_list","parameters":[{"in":"query","name":"codename","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["configuration_permissions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedExtendedConfigurationPermissionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/configuration_permissions/{id}/":{"get":{"operationId":"configuration_permissions_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this permission.","required":true}],"tags":["configuration_permissions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendedConfigurationPermission"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_configs/{id}/replace_assets/":{"get":{"operationId":"connector_configs_replace_assets_retrieve","description":"The public, token-authenticated mount of the connection re-place action (``/api/v2/connector_configs/``).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this connector config.","required":true}],"tags":["connector_configs"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"The latest run's status: state idle, queued, running, done or failed."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"connector_configs_replace_assets_create","description":"The public, token-authenticated mount of the connection re-place action (``/api/v2/connector_configs/``).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this connector config.","required":true}],"tags":["connector_configs"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplaceAssetsRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReplaceAssetsRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReplaceAssetsRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"The dry run: moves, organizations to create, subtree effects, skipped."},"202":{"description":"The run was queued; the body is its status."},"400":{"description":"The connector has no placement setting to apply."},"409":{"description":"A run for this connection is already queued or running."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_operations/":{"get":{"operationId":"connector_operations_list","parameters":[{"in":"query","name":"connector_config","schema":{"type":"integer"}},{"in":"query","name":"end_time_after","schema":{"type":"string","format":"date-time"},"description":"Filter by end_time range. Use `end_time_after` and `end_time_before`. Example: `/api/v2/connectors_operations/?end_time_after=2024-01-01T00:00:00Z&end_time_before=2024-02-01T00:00:00Z`"},{"in":"query","name":"end_time_before","schema":{"type":"string","format":"date-time"},"description":"Filter by end_time range. Use `end_time_after` and `end_time_before`. Example: `/api/v2/connectors_operations/?end_time_after=2024-01-01T00:00:00Z&end_time_before=2024-02-01T00:00:00Z`"},{"in":"query","name":"errors","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-duration","-end_time","-id","-operation","-start_time","-status","-trigger","duration","end_time","id","operation","start_time","status","trigger"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `duration` - Duration\n* `-duration` - Duration (descending)\n* `operation` - Operation\n* `-operation` - Operation (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `trigger` - Trigger\n* `-trigger` - Trigger (descending)\n* `start_time` - Start time\n* `-start_time` - Start time (descending)\n* `end_time` - End time\n* `-end_time` - End time (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"operation","schema":{"type":"string","x-spec-enum-id":"60d91fd4719782f6","nullable":true,"enum":["DISCOVER","SYNC"]},"description":"Filter by operation type.\n\n* `DISCOVER` - DISCOVER\n* `SYNC` - SYNC"},{"in":"query","name":"start_time_after","schema":{"type":"string","format":"date-time"},"description":"Filter by start_time range. Use `start_time_after` and `start_time_before`. Example: `/api/v2/connectors_operations/?start_time_after=2024-01-01T00:00:00Z&start_time_before=2024-02-01T00:00:00Z`"},{"in":"query","name":"start_time_before","schema":{"type":"string","format":"date-time"},"description":"Filter by start_time range. Use `start_time_after` and `start_time_before`. Example: `/api/v2/connectors_operations/?start_time_after=2024-01-01T00:00:00Z&start_time_before=2024-02-01T00:00:00Z`"},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"eafe5fec03783907","nullable":true,"enum":["ERROR","PENDING","SUCCESS","TIMEOUT"]},"description":"Filter by status type.\n\n* `SUCCESS` - SUCCESS\n* `ERROR` - ERROR\n* `TIMEOUT` - TIMEOUT\n* `PENDING` - PENDING"},{"in":"query","name":"trigger","schema":{"type":"string","x-spec-enum-id":"b656895639c7afd7","nullable":true,"enum":["MANUAL","SCHEDULED"]},"description":"Filter by trigger type.\n\n* `SCHEDULED` - SCHEDULED\n* `MANUAL` - MANUAL"}],"tags":["connector_operations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedOperationList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_operations/{id}/":{"get":{"operationId":"connector_operations_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this operation.","required":true}],"tags":["connector_operations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Operation"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_records/":{"get":{"operationId":"connector_records_list","parameters":[{"in":"query","name":"connector_config","schema":{"type":"integer"}},{"in":"query","name":"connector_type","schema":{"type":"string","enum":["assets","findings"]},"description":"Filter by connector type (findings or assets).\n\n* `findings` - findings\n* `assets` - assets"},{"in":"query","name":"delta_sync_timestamp","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"finalized_after","schema":{"type":"string","format":"date-time"},"description":"Filter by finalized range. Use `finalized_after` and `finalized_before`. Example: `/api/v2/connectors_operations/?finalized_after=2024-01-01T00:00:00Z&finalized_before=2024-02-01T00:00:00Z`"},{"in":"query","name":"finalized_before","schema":{"type":"string","format":"date-time"},"description":"Filter by finalized range. Use `finalized_after` and `finalized_before`. Example: `/api/v2/connectors_operations/?finalized_after=2024-01-01T00:00:00Z&finalized_before=2024-02-01T00:00:00Z`"},{"in":"query","name":"first_seen_after","schema":{"type":"string","format":"date-time"},"description":"Filter by first_seen range. Use `first_seen_after` and `first_seen_before`. Example: `/api/v2/connectors_operations/?first_seen_after=2024-01-01T00:00:00Z&first_seen_before=2024-02-01T00:00:00Z`"},{"in":"query","name":"first_seen_before","schema":{"type":"string","format":"date-time"},"description":"Filter by first_seen range. Use `first_seen_after` and `first_seen_before`. Example: `/api/v2/connectors_operations/?first_seen_after=2024-01-01T00:00:00Z&first_seen_before=2024-02-01T00:00:00Z`"},{"in":"query","name":"last_seen_after","schema":{"type":"string","format":"date-time"},"description":"Filter by last_seen range. Use `last_seen_after` and `last_seen_before`. Example: `/api/v2/connectors_operations/?last_seen_after=2024-01-01T00:00:00Z&last_seen_before=2024-02-01T00:00:00Z`"},{"in":"query","name":"last_seen_before","schema":{"type":"string","format":"date-time"},"description":"Filter by last_seen range. Use `last_seen_after` and `last_seen_before`. Example: `/api/v2/connectors_operations/?last_seen_after=2024-01-01T00:00:00Z&last_seen_before=2024-02-01T00:00:00Z`"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-finalized","-first_seen","-id","-last_seen","-state","finalized","first_seen","id","last_seen","state"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `first_seen` - First seen\n* `-first_seen` - First seen (descending)\n* `last_seen` - Last seen\n* `-last_seen` - Last seen (descending)\n* `finalized` - Finalized\n* `-finalized` - Finalized (descending)\n* `state` - State\n* `-state` - State (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"parent_vendor_equivalent_product_id","schema":{"type":"string"}},{"in":"query","name":"product_name","schema":{"type":"string"}},{"in":"query","name":"state","schema":{"type":"string","x-spec-enum-id":"bd142512a4c8aa6e","nullable":true,"enum":["GOOD","IGNORED","MISSING","NEW","PARTIAL","STALE"]},"description":"Filter by state type.\n\n* `NEW` - NEW\n* `GOOD` - GOOD\n* `STALE` - STALE\n* `MISSING` - MISSING\n* `IGNORED` - IGNORED\n* `PARTIAL` - PARTIAL"},{"in":"query","name":"sync_checkpoint_at","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"sync_checkpoint_key","schema":{"type":"string"}},{"in":"query","name":"vendor_equivalent_product_description","schema":{"type":"string"}},{"in":"query","name":"vendor_equivalent_product_id","schema":{"type":"string"}},{"in":"query","name":"vendor_equivalent_product_name","schema":{"type":"string"}}],"tags":["connector_records"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRecordList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_records/{id}/":{"get":{"operationId":"connector_records_retrieve","parameters":[{"in":"query","name":"extended_mapping","schema":{"type":"boolean"},"description":"Expand the details of the mapping for further details"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this record.","required":true}],"tags":["connector_records"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"connector_records_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this record.","required":true}],"tags":["connector_records"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_records/{id}/assign_product/":{"post":{"operationId":"connector_records_assign_product_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this record.","required":true}],"tags":["connector_records"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAssignProductRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PublicAssignProductRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PublicAssignProductRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAssignProduct"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_records/{id}/checkpoint/":{"post":{"operationId":"connector_records_checkpoint_create","description":"Mark this record finished for one sync run, so a resumed sync can skip it.\n\nA connector sync walks its records in order and, until now, an interrupted one\nstarted again from the first record -- so a worker restarting near the end of a\n500-record tenant re-synced 499 records to reach the one it had not done. The worker\ncalls this after each record lands, and on resume skips every record already carrying\nthe run's key.\n\nCALLED AFTER THE FINDINGS ARE IMPORTED, never before: a checkpoint written first\nwould let a crash mid-import mark a record done that never finished, and the resumed\nsync would skip it. Being late costs one repeated record; being early loses one\nsilently, which is much worse and invisible.\n\nTHE KEY IS THE SYNC RUN'S OWN IDENTITY (the queued operation's id), so nothing needs\nclearing: the next run carries a different key, matches nothing, and every record is\neligible again. A cleanup pass over stale checkpoints would be one more thing to get\nwrong, and the rows left behind are useful as per-record sync telemetry.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this record.","required":true}],"tags":["connector_records"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"Checkpoint recorded."},"400":{"description":"key is required."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_records/{id}/exposure/":{"post":{"operationId":"connector_records_exposure_create","description":"Asset-exposure ingest: the connectors service submits this record's current\nexposure opinion, scoped by the record's product mapping.\n\nA connector that predates this endpoint simply never calls it, and one running\nagainst a Django that predates it gets a 404 it is expected to treat as\ncapability-absent. That is why Django ships before the connectors service.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this record.","required":true}],"tags":["connector_records"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RecordRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RecordRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_records/{id}/locations/":{"post":{"operationId":"connector_records_locations_create","description":"Location-inventory ingest: the connectors service submits this record's current\nCOMPLETE location inventory, scoped by the record's product mapping. Anything this\nconfig created that the batch no longer names is mitigated, never deleted.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this record.","required":true}],"tags":["connector_records"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationBatchRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LocationBatchRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LocationBatchRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationBatch"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_records/{id}/update-subtype-filters/":{"patch":{"operationId":"connector_records_update_subtype_filters_partial_update","description":"User-facing variant -- same serializer; filter values aren't asymmetric between\nGo and user the way subtype status is.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this record.","required":true}],"tags":["connector_records"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedMappingSubtypeFiltersRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedMappingSubtypeFiltersRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedMappingSubtypeFiltersRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MappingSubtypeFilters"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_records/{id}/update-subtype-status/":{"patch":{"operationId":"connector_records_update_subtype_status_partial_update","description":"User-facing variant — restricts status choices to GOOD and IGNORED.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this record.","required":true}],"tags":["connector_records"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPublicMappingSubtypeStatusRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPublicMappingSubtypeStatusRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPublicMappingSubtypeStatusRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicMappingSubtypeStatus"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_records/{id}/update_status/":{"patch":{"operationId":"connector_records_update_status_partial_update","description":"Accepted values for state are \"NEW\" and \"IGNORED\"","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this record.","required":true}],"tags":["connector_records"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedRecordStatusRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedRecordStatusRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedRecordStatusRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordStatus"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/connector_records/{id}/verdicts/":{"post":{"operationId":"connector_records_verdicts_create","description":"Reachability provider contract, Endpoint B: the connectors service\nsubmits a verdict batch scoped by this record's product mapping.\nMatching, verdict recording, and the match-rate report are shared\nwith the general /api/v2/reachability/verdicts/ endpoint.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this record.","required":true}],"tags":["connector_records"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RecordRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RecordRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/container_image/":{"get":{"operationId":"container_image_list","description":"Container images, read-only.\n\nImages are scan-managed like source code locations: a scanner or connector\nreports them, and the identity is a hash of what was reported, so there is no\nmanual create or edit form. Rows are scoped through the authorized location\nqueryset, never a superuser gate.","parameters":[{"in":"query","name":"digest_contains","schema":{"type":"string"},"description":"Digest: Contains"},{"in":"query","name":"digest_ends_with","schema":{"type":"string"},"description":"Digest: Ends With"},{"in":"query","name":"digest_exact","schema":{"type":"string"},"description":"Digest: Exact Match"},{"in":"query","name":"digest_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Digest: Included in List","explode":false,"style":"form"},{"in":"query","name":"digest_known","schema":{"type":"boolean"},"description":"Digest Known: Equals"},{"in":"query","name":"digest_not_contains","schema":{"type":"string"},"description":"Digest: Not Contains"},{"in":"query","name":"digest_not_exact","schema":{"type":"string"},"description":"Digest: Not Exact Match"},{"in":"query","name":"digest_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Digest: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"digest_starts_with","schema":{"type":"string"},"description":"Digest: Starts With"},{"in":"query","name":"id_equals","schema":{"type":"integer"},"description":"ID: Equals"},{"in":"query","name":"id_greater_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Greater Than or Equal To"},{"in":"query","name":"id_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"id_less_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Less Than or Equal To"},{"in":"query","name":"id_not_equals","schema":{"type":"integer"},"description":"ID: Not Equals"},{"in":"query","name":"id_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Not Included in List","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location__created_at_contains","schema":{"type":"string"},"description":"Created At: Contains"},{"in":"query","name":"location__created_at_ends_with","schema":{"type":"string"},"description":"Created At: Ends With"},{"in":"query","name":"location__created_at_exact","schema":{"type":"string"},"description":"Created At: Exact Match"},{"in":"query","name":"location__created_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_not_contains","schema":{"type":"string"},"description":"Created At: Not Contains"},{"in":"query","name":"location__created_at_not_exact","schema":{"type":"string"},"description":"Created At: Not Exact Match"},{"in":"query","name":"location__created_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_starts_with","schema":{"type":"string"},"description":"Created At: Starts With"},{"in":"query","name":"location__findings__finding_equals","schema":{"type":"integer"},"description":"Finding ID: Equals"},{"in":"query","name":"location__findings__finding_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Greater Than or Equal To"},{"in":"query","name":"location__findings__finding_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__findings__finding_less_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Less Than or Equal To"},{"in":"query","name":"location__findings__finding_not_equals","schema":{"type":"integer"},"description":"Finding ID: Not Equals"},{"in":"query","name":"location__findings__finding_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_equals","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"location__products__product_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Greater Than or Equal To"},{"in":"query","name":"location__products__product_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_less_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Less Than or Equal To"},{"in":"query","name":"location__products__product_not_equals","schema":{"type":"integer"},"description":"Product ID: Not Equals"},{"in":"query","name":"location__products__product_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_contains","schema":{"type":"string"},"description":"Tags: Contains"},{"in":"query","name":"location__tags__name_ends_with","schema":{"type":"string"},"description":"Tags: Ends With"},{"in":"query","name":"location__tags__name_exact","schema":{"type":"string"},"description":"Tags: Exact Match"},{"in":"query","name":"location__tags__name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_not_contains","schema":{"type":"string"},"description":"Tags: Not Contains"},{"in":"query","name":"location__tags__name_not_exact","schema":{"type":"string"},"description":"Tags: Not Exact Match"},{"in":"query","name":"location__tags__name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_starts_with","schema":{"type":"string"},"description":"Tags: Starts With"},{"in":"query","name":"location__updated_at_contains","schema":{"type":"string"},"description":"Updated At: Contains"},{"in":"query","name":"location__updated_at_ends_with","schema":{"type":"string"},"description":"Updated At: Ends With"},{"in":"query","name":"location__updated_at_exact","schema":{"type":"string"},"description":"Updated At: Exact Match"},{"in":"query","name":"location__updated_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_not_contains","schema":{"type":"string"},"description":"Updated At: Not Contains"},{"in":"query","name":"location__updated_at_not_exact","schema":{"type":"string"},"description":"Updated At: Not Exact Match"},{"in":"query","name":"location__updated_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_starts_with","schema":{"type":"string"},"description":"Updated At: Starts With"},{"in":"query","name":"oci_revision_contains","schema":{"type":"string"},"description":"OCI Revision: Contains"},{"in":"query","name":"oci_revision_ends_with","schema":{"type":"string"},"description":"OCI Revision: Ends With"},{"in":"query","name":"oci_revision_exact","schema":{"type":"string"},"description":"OCI Revision: Exact Match"},{"in":"query","name":"oci_revision_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Revision: Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_revision_not_contains","schema":{"type":"string"},"description":"OCI Revision: Not Contains"},{"in":"query","name":"oci_revision_not_exact","schema":{"type":"string"},"description":"OCI Revision: Not Exact Match"},{"in":"query","name":"oci_revision_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Revision: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_revision_starts_with","schema":{"type":"string"},"description":"OCI Revision: Starts With"},{"in":"query","name":"oci_source_contains","schema":{"type":"string"},"description":"OCI Source: Contains"},{"in":"query","name":"oci_source_ends_with","schema":{"type":"string"},"description":"OCI Source: Ends With"},{"in":"query","name":"oci_source_exact","schema":{"type":"string"},"description":"OCI Source: Exact Match"},{"in":"query","name":"oci_source_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Source: Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_source_not_contains","schema":{"type":"string"},"description":"OCI Source: Not Contains"},{"in":"query","name":"oci_source_not_exact","schema":{"type":"string"},"description":"OCI Source: Not Exact Match"},{"in":"query","name":"oci_source_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Source: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_source_starts_with","schema":{"type":"string"},"description":"OCI Source: Starts With"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"array","items":{"type":"string","enum":["-created","-digest","-id","-registry","-repository","-tag","-updated","created","digest","id","registry","repository","tag","updated"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `registry` - Registry\n* `-registry` - Registry (descending)\n* `repository` - Repository\n* `-repository` - Repository (descending)\n* `tag` - Tag\n* `-tag` - Tag (descending)\n* `digest` - Digest\n* `-digest` - Digest (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"in":"query","name":"product","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"registry_contains","schema":{"type":"string"},"description":"Registry: Contains"},{"in":"query","name":"registry_ends_with","schema":{"type":"string"},"description":"Registry: Ends With"},{"in":"query","name":"registry_exact","schema":{"type":"string"},"description":"Registry: Exact Match"},{"in":"query","name":"registry_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Registry: Included in List","explode":false,"style":"form"},{"in":"query","name":"registry_not_contains","schema":{"type":"string"},"description":"Registry: Not Contains"},{"in":"query","name":"registry_not_exact","schema":{"type":"string"},"description":"Registry: Not Exact Match"},{"in":"query","name":"registry_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Registry: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"registry_starts_with","schema":{"type":"string"},"description":"Registry: Starts With"},{"in":"query","name":"repository_contains","schema":{"type":"string"},"description":"Repository: Contains"},{"in":"query","name":"repository_ends_with","schema":{"type":"string"},"description":"Repository: Ends With"},{"in":"query","name":"repository_exact","schema":{"type":"string"},"description":"Repository: Exact Match"},{"in":"query","name":"repository_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Repository: Included in List","explode":false,"style":"form"},{"in":"query","name":"repository_not_contains","schema":{"type":"string"},"description":"Repository: Not Contains"},{"in":"query","name":"repository_not_exact","schema":{"type":"string"},"description":"Repository: Not Exact Match"},{"in":"query","name":"repository_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Repository: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"repository_starts_with","schema":{"type":"string"},"description":"Repository: Starts With"},{"in":"query","name":"tag_contains","schema":{"type":"string"},"description":"Tag: Contains"},{"in":"query","name":"tag_ends_with","schema":{"type":"string"},"description":"Tag: Ends With"},{"in":"query","name":"tag_exact","schema":{"type":"string"},"description":"Tag: Exact Match"},{"in":"query","name":"tag_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tag: Included in List","explode":false,"style":"form"},{"in":"query","name":"tag_not_contains","schema":{"type":"string"},"description":"Tag: Not Contains"},{"in":"query","name":"tag_not_exact","schema":{"type":"string"},"description":"Tag: Not Exact Match"},{"in":"query","name":"tag_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tag: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"tag_starts_with","schema":{"type":"string"},"description":"Tag: Starts With"}],"tags":["container_image"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedContainerImageList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/container_image/{id}/":{"get":{"operationId":"container_image_retrieve","description":"Container images, read-only.\n\nImages are scan-managed like source code locations: a scanner or connector\nreports them, and the identity is a hash of what was reported, so there is no\nmanual create or edit form. Rows are scoped through the authorized location\nqueryset, never a superuser gate.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this container image.","required":true}],"tags":["container_image"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContainerImage"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/container_image/{id}/history/":{"get":{"operationId":"container_image_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"digest_contains","schema":{"type":"string"},"description":"Digest: Contains"},{"in":"query","name":"digest_ends_with","schema":{"type":"string"},"description":"Digest: Ends With"},{"in":"query","name":"digest_exact","schema":{"type":"string"},"description":"Digest: Exact Match"},{"in":"query","name":"digest_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Digest: Included in List","explode":false,"style":"form"},{"in":"query","name":"digest_known","schema":{"type":"boolean"},"description":"Digest Known: Equals"},{"in":"query","name":"digest_not_contains","schema":{"type":"string"},"description":"Digest: Not Contains"},{"in":"query","name":"digest_not_exact","schema":{"type":"string"},"description":"Digest: Not Exact Match"},{"in":"query","name":"digest_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Digest: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"digest_starts_with","schema":{"type":"string"},"description":"Digest: Starts With"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this container image.","required":true},{"in":"query","name":"id_equals","schema":{"type":"integer"},"description":"ID: Equals"},{"in":"query","name":"id_greater_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Greater Than or Equal To"},{"in":"query","name":"id_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"id_less_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Less Than or Equal To"},{"in":"query","name":"id_not_equals","schema":{"type":"integer"},"description":"ID: Not Equals"},{"in":"query","name":"id_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Not Included in List","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location__created_at_contains","schema":{"type":"string"},"description":"Created At: Contains"},{"in":"query","name":"location__created_at_ends_with","schema":{"type":"string"},"description":"Created At: Ends With"},{"in":"query","name":"location__created_at_exact","schema":{"type":"string"},"description":"Created At: Exact Match"},{"in":"query","name":"location__created_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_not_contains","schema":{"type":"string"},"description":"Created At: Not Contains"},{"in":"query","name":"location__created_at_not_exact","schema":{"type":"string"},"description":"Created At: Not Exact Match"},{"in":"query","name":"location__created_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_starts_with","schema":{"type":"string"},"description":"Created At: Starts With"},{"in":"query","name":"location__findings__finding_equals","schema":{"type":"integer"},"description":"Finding ID: Equals"},{"in":"query","name":"location__findings__finding_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Greater Than or Equal To"},{"in":"query","name":"location__findings__finding_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__findings__finding_less_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Less Than or Equal To"},{"in":"query","name":"location__findings__finding_not_equals","schema":{"type":"integer"},"description":"Finding ID: Not Equals"},{"in":"query","name":"location__findings__finding_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_equals","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"location__products__product_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Greater Than or Equal To"},{"in":"query","name":"location__products__product_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_less_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Less Than or Equal To"},{"in":"query","name":"location__products__product_not_equals","schema":{"type":"integer"},"description":"Product ID: Not Equals"},{"in":"query","name":"location__products__product_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_contains","schema":{"type":"string"},"description":"Tags: Contains"},{"in":"query","name":"location__tags__name_ends_with","schema":{"type":"string"},"description":"Tags: Ends With"},{"in":"query","name":"location__tags__name_exact","schema":{"type":"string"},"description":"Tags: Exact Match"},{"in":"query","name":"location__tags__name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_not_contains","schema":{"type":"string"},"description":"Tags: Not Contains"},{"in":"query","name":"location__tags__name_not_exact","schema":{"type":"string"},"description":"Tags: Not Exact Match"},{"in":"query","name":"location__tags__name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_starts_with","schema":{"type":"string"},"description":"Tags: Starts With"},{"in":"query","name":"location__updated_at_contains","schema":{"type":"string"},"description":"Updated At: Contains"},{"in":"query","name":"location__updated_at_ends_with","schema":{"type":"string"},"description":"Updated At: Ends With"},{"in":"query","name":"location__updated_at_exact","schema":{"type":"string"},"description":"Updated At: Exact Match"},{"in":"query","name":"location__updated_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_not_contains","schema":{"type":"string"},"description":"Updated At: Not Contains"},{"in":"query","name":"location__updated_at_not_exact","schema":{"type":"string"},"description":"Updated At: Not Exact Match"},{"in":"query","name":"location__updated_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_starts_with","schema":{"type":"string"},"description":"Updated At: Starts With"},{"in":"query","name":"oci_revision_contains","schema":{"type":"string"},"description":"OCI Revision: Contains"},{"in":"query","name":"oci_revision_ends_with","schema":{"type":"string"},"description":"OCI Revision: Ends With"},{"in":"query","name":"oci_revision_exact","schema":{"type":"string"},"description":"OCI Revision: Exact Match"},{"in":"query","name":"oci_revision_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Revision: Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_revision_not_contains","schema":{"type":"string"},"description":"OCI Revision: Not Contains"},{"in":"query","name":"oci_revision_not_exact","schema":{"type":"string"},"description":"OCI Revision: Not Exact Match"},{"in":"query","name":"oci_revision_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Revision: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_revision_starts_with","schema":{"type":"string"},"description":"OCI Revision: Starts With"},{"in":"query","name":"oci_source_contains","schema":{"type":"string"},"description":"OCI Source: Contains"},{"in":"query","name":"oci_source_ends_with","schema":{"type":"string"},"description":"OCI Source: Ends With"},{"in":"query","name":"oci_source_exact","schema":{"type":"string"},"description":"OCI Source: Exact Match"},{"in":"query","name":"oci_source_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Source: Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_source_not_contains","schema":{"type":"string"},"description":"OCI Source: Not Contains"},{"in":"query","name":"oci_source_not_exact","schema":{"type":"string"},"description":"OCI Source: Not Exact Match"},{"in":"query","name":"oci_source_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Source: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_source_starts_with","schema":{"type":"string"},"description":"OCI Source: Starts With"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"array","items":{"type":"string","enum":["-created","-digest","-id","-registry","-repository","-tag","-updated","created","digest","id","registry","repository","tag","updated"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `registry` - Registry\n* `-registry` - Registry (descending)\n* `repository` - Repository\n* `-repository` - Repository (descending)\n* `tag` - Tag\n* `-tag` - Tag (descending)\n* `digest` - Digest\n* `-digest` - Digest (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"in":"query","name":"product","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"registry_contains","schema":{"type":"string"},"description":"Registry: Contains"},{"in":"query","name":"registry_ends_with","schema":{"type":"string"},"description":"Registry: Ends With"},{"in":"query","name":"registry_exact","schema":{"type":"string"},"description":"Registry: Exact Match"},{"in":"query","name":"registry_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Registry: Included in List","explode":false,"style":"form"},{"in":"query","name":"registry_not_contains","schema":{"type":"string"},"description":"Registry: Not Contains"},{"in":"query","name":"registry_not_exact","schema":{"type":"string"},"description":"Registry: Not Exact Match"},{"in":"query","name":"registry_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Registry: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"registry_starts_with","schema":{"type":"string"},"description":"Registry: Starts With"},{"in":"query","name":"repository_contains","schema":{"type":"string"},"description":"Repository: Contains"},{"in":"query","name":"repository_ends_with","schema":{"type":"string"},"description":"Repository: Ends With"},{"in":"query","name":"repository_exact","schema":{"type":"string"},"description":"Repository: Exact Match"},{"in":"query","name":"repository_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Repository: Included in List","explode":false,"style":"form"},{"in":"query","name":"repository_not_contains","schema":{"type":"string"},"description":"Repository: Not Contains"},{"in":"query","name":"repository_not_exact","schema":{"type":"string"},"description":"Repository: Not Exact Match"},{"in":"query","name":"repository_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Repository: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"repository_starts_with","schema":{"type":"string"},"description":"Repository: Starts With"},{"in":"query","name":"tag_contains","schema":{"type":"string"},"description":"Tag: Contains"},{"in":"query","name":"tag_ends_with","schema":{"type":"string"},"description":"Tag: Ends With"},{"in":"query","name":"tag_exact","schema":{"type":"string"},"description":"Tag: Exact Match"},{"in":"query","name":"tag_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tag: Included in List","explode":false,"style":"form"},{"in":"query","name":"tag_not_contains","schema":{"type":"string"},"description":"Tag: Not Contains"},{"in":"query","name":"tag_not_exact","schema":{"type":"string"},"description":"Tag: Not Exact Match"},{"in":"query","name":"tag_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tag: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"tag_starts_with","schema":{"type":"string"},"description":"Tag: Starts With"}],"tags":["container_image"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/container_image/{id}/history/legacy/":{"get":{"operationId":"container_image_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"digest_contains","schema":{"type":"string"},"description":"Digest: Contains"},{"in":"query","name":"digest_ends_with","schema":{"type":"string"},"description":"Digest: Ends With"},{"in":"query","name":"digest_exact","schema":{"type":"string"},"description":"Digest: Exact Match"},{"in":"query","name":"digest_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Digest: Included in List","explode":false,"style":"form"},{"in":"query","name":"digest_known","schema":{"type":"boolean"},"description":"Digest Known: Equals"},{"in":"query","name":"digest_not_contains","schema":{"type":"string"},"description":"Digest: Not Contains"},{"in":"query","name":"digest_not_exact","schema":{"type":"string"},"description":"Digest: Not Exact Match"},{"in":"query","name":"digest_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Digest: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"digest_starts_with","schema":{"type":"string"},"description":"Digest: Starts With"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this container image.","required":true},{"in":"query","name":"id_equals","schema":{"type":"integer"},"description":"ID: Equals"},{"in":"query","name":"id_greater_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Greater Than or Equal To"},{"in":"query","name":"id_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"id_less_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Less Than or Equal To"},{"in":"query","name":"id_not_equals","schema":{"type":"integer"},"description":"ID: Not Equals"},{"in":"query","name":"id_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Not Included in List","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location__created_at_contains","schema":{"type":"string"},"description":"Created At: Contains"},{"in":"query","name":"location__created_at_ends_with","schema":{"type":"string"},"description":"Created At: Ends With"},{"in":"query","name":"location__created_at_exact","schema":{"type":"string"},"description":"Created At: Exact Match"},{"in":"query","name":"location__created_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_not_contains","schema":{"type":"string"},"description":"Created At: Not Contains"},{"in":"query","name":"location__created_at_not_exact","schema":{"type":"string"},"description":"Created At: Not Exact Match"},{"in":"query","name":"location__created_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_starts_with","schema":{"type":"string"},"description":"Created At: Starts With"},{"in":"query","name":"location__findings__finding_equals","schema":{"type":"integer"},"description":"Finding ID: Equals"},{"in":"query","name":"location__findings__finding_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Greater Than or Equal To"},{"in":"query","name":"location__findings__finding_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__findings__finding_less_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Less Than or Equal To"},{"in":"query","name":"location__findings__finding_not_equals","schema":{"type":"integer"},"description":"Finding ID: Not Equals"},{"in":"query","name":"location__findings__finding_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_equals","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"location__products__product_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Greater Than or Equal To"},{"in":"query","name":"location__products__product_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_less_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Less Than or Equal To"},{"in":"query","name":"location__products__product_not_equals","schema":{"type":"integer"},"description":"Product ID: Not Equals"},{"in":"query","name":"location__products__product_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_contains","schema":{"type":"string"},"description":"Tags: Contains"},{"in":"query","name":"location__tags__name_ends_with","schema":{"type":"string"},"description":"Tags: Ends With"},{"in":"query","name":"location__tags__name_exact","schema":{"type":"string"},"description":"Tags: Exact Match"},{"in":"query","name":"location__tags__name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_not_contains","schema":{"type":"string"},"description":"Tags: Not Contains"},{"in":"query","name":"location__tags__name_not_exact","schema":{"type":"string"},"description":"Tags: Not Exact Match"},{"in":"query","name":"location__tags__name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_starts_with","schema":{"type":"string"},"description":"Tags: Starts With"},{"in":"query","name":"location__updated_at_contains","schema":{"type":"string"},"description":"Updated At: Contains"},{"in":"query","name":"location__updated_at_ends_with","schema":{"type":"string"},"description":"Updated At: Ends With"},{"in":"query","name":"location__updated_at_exact","schema":{"type":"string"},"description":"Updated At: Exact Match"},{"in":"query","name":"location__updated_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_not_contains","schema":{"type":"string"},"description":"Updated At: Not Contains"},{"in":"query","name":"location__updated_at_not_exact","schema":{"type":"string"},"description":"Updated At: Not Exact Match"},{"in":"query","name":"location__updated_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_starts_with","schema":{"type":"string"},"description":"Updated At: Starts With"},{"in":"query","name":"oci_revision_contains","schema":{"type":"string"},"description":"OCI Revision: Contains"},{"in":"query","name":"oci_revision_ends_with","schema":{"type":"string"},"description":"OCI Revision: Ends With"},{"in":"query","name":"oci_revision_exact","schema":{"type":"string"},"description":"OCI Revision: Exact Match"},{"in":"query","name":"oci_revision_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Revision: Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_revision_not_contains","schema":{"type":"string"},"description":"OCI Revision: Not Contains"},{"in":"query","name":"oci_revision_not_exact","schema":{"type":"string"},"description":"OCI Revision: Not Exact Match"},{"in":"query","name":"oci_revision_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Revision: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_revision_starts_with","schema":{"type":"string"},"description":"OCI Revision: Starts With"},{"in":"query","name":"oci_source_contains","schema":{"type":"string"},"description":"OCI Source: Contains"},{"in":"query","name":"oci_source_ends_with","schema":{"type":"string"},"description":"OCI Source: Ends With"},{"in":"query","name":"oci_source_exact","schema":{"type":"string"},"description":"OCI Source: Exact Match"},{"in":"query","name":"oci_source_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Source: Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_source_not_contains","schema":{"type":"string"},"description":"OCI Source: Not Contains"},{"in":"query","name":"oci_source_not_exact","schema":{"type":"string"},"description":"OCI Source: Not Exact Match"},{"in":"query","name":"oci_source_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"OCI Source: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"oci_source_starts_with","schema":{"type":"string"},"description":"OCI Source: Starts With"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"array","items":{"type":"string","enum":["-created","-digest","-id","-registry","-repository","-tag","-updated","created","digest","id","registry","repository","tag","updated"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `registry` - Registry\n* `-registry` - Registry (descending)\n* `repository` - Repository\n* `-repository` - Repository (descending)\n* `tag` - Tag\n* `-tag` - Tag (descending)\n* `digest` - Digest\n* `-digest` - Digest (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"in":"query","name":"product","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"registry_contains","schema":{"type":"string"},"description":"Registry: Contains"},{"in":"query","name":"registry_ends_with","schema":{"type":"string"},"description":"Registry: Ends With"},{"in":"query","name":"registry_exact","schema":{"type":"string"},"description":"Registry: Exact Match"},{"in":"query","name":"registry_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Registry: Included in List","explode":false,"style":"form"},{"in":"query","name":"registry_not_contains","schema":{"type":"string"},"description":"Registry: Not Contains"},{"in":"query","name":"registry_not_exact","schema":{"type":"string"},"description":"Registry: Not Exact Match"},{"in":"query","name":"registry_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Registry: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"registry_starts_with","schema":{"type":"string"},"description":"Registry: Starts With"},{"in":"query","name":"repository_contains","schema":{"type":"string"},"description":"Repository: Contains"},{"in":"query","name":"repository_ends_with","schema":{"type":"string"},"description":"Repository: Ends With"},{"in":"query","name":"repository_exact","schema":{"type":"string"},"description":"Repository: Exact Match"},{"in":"query","name":"repository_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Repository: Included in List","explode":false,"style":"form"},{"in":"query","name":"repository_not_contains","schema":{"type":"string"},"description":"Repository: Not Contains"},{"in":"query","name":"repository_not_exact","schema":{"type":"string"},"description":"Repository: Not Exact Match"},{"in":"query","name":"repository_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Repository: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"repository_starts_with","schema":{"type":"string"},"description":"Repository: Starts With"},{"in":"query","name":"tag_contains","schema":{"type":"string"},"description":"Tag: Contains"},{"in":"query","name":"tag_ends_with","schema":{"type":"string"},"description":"Tag: Ends With"},{"in":"query","name":"tag_exact","schema":{"type":"string"},"description":"Tag: Exact Match"},{"in":"query","name":"tag_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tag: Included in List","explode":false,"style":"form"},{"in":"query","name":"tag_not_contains","schema":{"type":"string"},"description":"Tag: Not Contains"},{"in":"query","name":"tag_not_exact","schema":{"type":"string"},"description":"Tag: Not Exact Match"},{"in":"query","name":"tag_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tag: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"tag_starts_with","schema":{"type":"string"},"description":"Tag: Starts With"}],"tags":["container_image"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/container_image/{id}/history/legacy/count/":{"get":{"operationId":"container_image_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this container image.","required":true}],"tags":["container_image"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/control_catalogs/":{"get":{"operationId":"control_catalogs_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["control_catalogs"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedControlCatalogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/control_catalogs/{id}/":{"get":{"operationId":"control_catalogs_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this control catalog.","required":true}],"tags":["control_catalogs"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ControlCatalog"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/control_coverage/":{"get":{"operationId":"control_coverage_retrieve","description":"Read-only open-weakness coverage rollup for one product against a control catalog.\n\nGET /control_coverage/?product=<id>[&catalog=<id>] -- product is required and must be visible to\nthe caller; catalog defaults to the newest enabled NIST SP 800-53 catalog.","parameters":[{"in":"query","name":"catalog","schema":{"type":"integer"},"description":"Control catalog id; defaults to the newest enabled NIST SP 800-53 catalog."},{"in":"query","name":"product","schema":{"type":"integer"},"description":"Product (asset) id; must be visible to the caller.","required":true}],"tags":["control_coverage"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/criticality_sla_mappings/":{"get":{"operationId":"criticality_sla_mappings_list","description":"The criticality-to-SLA mapping table: one SLA configuration per business-criticality band.\n\nA system-wide configuration, not a per-product record, so it authorizes with the same\n``UserHasSLAPermission`` the SLA configuration editor uses -- the two sit on the same settings\npage and are managed by the same people. Saving a mapping reassigns the products in its band\n(see pro.regulatory.signals / pro.regulatory.tasks).","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["criticality_sla_mappings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCriticalitySLAMappingList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"criticality_sla_mappings_create","description":"The criticality-to-SLA mapping table: one SLA configuration per business-criticality band.\n\nA system-wide configuration, not a per-product record, so it authorizes with the same\n``UserHasSLAPermission`` the SLA configuration editor uses -- the two sit on the same settings\npage and are managed by the same people. Saving a mapping reassigns the products in its band\n(see pro.regulatory.signals / pro.regulatory.tasks).","tags":["criticality_sla_mappings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CriticalitySLAMappingRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CriticalitySLAMappingRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CriticalitySLAMappingRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CriticalitySLAMapping"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/criticality_sla_mappings/{id}/":{"get":{"operationId":"criticality_sla_mappings_retrieve","description":"The criticality-to-SLA mapping table: one SLA configuration per business-criticality band.\n\nA system-wide configuration, not a per-product record, so it authorizes with the same\n``UserHasSLAPermission`` the SLA configuration editor uses -- the two sit on the same settings\npage and are managed by the same people. Saving a mapping reassigns the products in its band\n(see pro.regulatory.signals / pro.regulatory.tasks).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this criticality sla mapping.","required":true}],"tags":["criticality_sla_mappings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CriticalitySLAMapping"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"criticality_sla_mappings_update","description":"The criticality-to-SLA mapping table: one SLA configuration per business-criticality band.\n\nA system-wide configuration, not a per-product record, so it authorizes with the same\n``UserHasSLAPermission`` the SLA configuration editor uses -- the two sit on the same settings\npage and are managed by the same people. Saving a mapping reassigns the products in its band\n(see pro.regulatory.signals / pro.regulatory.tasks).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this criticality sla mapping.","required":true}],"tags":["criticality_sla_mappings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CriticalitySLAMappingRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CriticalitySLAMappingRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CriticalitySLAMappingRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CriticalitySLAMapping"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"criticality_sla_mappings_partial_update","description":"The criticality-to-SLA mapping table: one SLA configuration per business-criticality band.\n\nA system-wide configuration, not a per-product record, so it authorizes with the same\n``UserHasSLAPermission`` the SLA configuration editor uses -- the two sit on the same settings\npage and are managed by the same people. Saving a mapping reassigns the products in its band\n(see pro.regulatory.signals / pro.regulatory.tasks).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this criticality sla mapping.","required":true}],"tags":["criticality_sla_mappings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCriticalitySLAMappingRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCriticalitySLAMappingRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCriticalitySLAMappingRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CriticalitySLAMapping"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"criticality_sla_mappings_destroy","description":"The criticality-to-SLA mapping table: one SLA configuration per business-criticality band.\n\nA system-wide configuration, not a per-product record, so it authorizes with the same\n``UserHasSLAPermission`` the SLA configuration editor uses -- the two sit on the same settings\npage and are managed by the same people. Saving a mapping reassigns the products in its band\n(see pro.regulatory.signals / pro.regulatory.tasks).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this criticality sla mapping.","required":true}],"tags":["criticality_sla_mappings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/custom_fields/definitions/":{"get":{"operationId":"custom_fields_definitions_list","description":"CRUD for custom field definitions.\n\nAuthentication: the standard /api/v2/ triad (session for the Vue UI, plus API token and\nbasic for external clients) -- this viewset is also mounted at\n/api/v2/custom_fields/definitions/ for token-driven automation. Authorization: any\nauthenticated user may read; the global Custom_Field_Manage permission is required to\ncreate, edit, or delete. Deleting a definition cascades its values (they belong to the field).","parameters":[{"in":"query","name":"entity_type","schema":{"type":"string","enum":["asset","engagement","finding","organization","product","product_type","risk_acceptance","test"]},"description":"Only definitions for this object type. `asset` is the same as `product`, and `organization` the same as `product_type`."},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["Custom Fields"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCustomFieldDefinitionList"}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"additionalProperties":{"type":"array","items":{"type":"string"}}},"examples":{"UnknownEntityType":{"value":{"entity_type":["Invalid value for 'entity_type': assets is not a valid identifier."],"message":"entity_type: Invalid value for 'entity_type': assets is not a valid identifier."},"summary":"Unknown entity type"}}}},"description":"`entity_type` is not a known object type."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"custom_fields_definitions_create","description":"CRUD for custom field definitions.\n\nAuthentication: the standard /api/v2/ triad (session for the Vue UI, plus API token and\nbasic for external clients) -- this viewset is also mounted at\n/api/v2/custom_fields/definitions/ for token-driven automation. Authorization: any\nauthenticated user may read; the global Custom_Field_Manage permission is required to\ncreate, edit, or delete. Deleting a definition cascades its values (they belong to the field).","tags":["Custom Fields"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinition"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/custom_fields/definitions/{id}/":{"get":{"operationId":"custom_fields_definitions_retrieve","description":"CRUD for custom field definitions.\n\nAuthentication: the standard /api/v2/ triad (session for the Vue UI, plus API token and\nbasic for external clients) -- this viewset is also mounted at\n/api/v2/custom_fields/definitions/ for token-driven automation. Authorization: any\nauthenticated user may read; the global Custom_Field_Manage permission is required to\ncreate, edit, or delete. Deleting a definition cascades its values (they belong to the field).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this custom field definition.","required":true}],"tags":["Custom Fields"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinition"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"custom_fields_definitions_update","description":"CRUD for custom field definitions.\n\nAuthentication: the standard /api/v2/ triad (session for the Vue UI, plus API token and\nbasic for external clients) -- this viewset is also mounted at\n/api/v2/custom_fields/definitions/ for token-driven automation. Authorization: any\nauthenticated user may read; the global Custom_Field_Manage permission is required to\ncreate, edit, or delete. Deleting a definition cascades its values (they belong to the field).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this custom field definition.","required":true}],"tags":["Custom Fields"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinitionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinition"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"custom_fields_definitions_partial_update","description":"CRUD for custom field definitions.\n\nAuthentication: the standard /api/v2/ triad (session for the Vue UI, plus API token and\nbasic for external clients) -- this viewset is also mounted at\n/api/v2/custom_fields/definitions/ for token-driven automation. Authorization: any\nauthenticated user may read; the global Custom_Field_Manage permission is required to\ncreate, edit, or delete. Deleting a definition cascades its values (they belong to the field).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this custom field definition.","required":true}],"tags":["Custom Fields"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCustomFieldDefinitionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCustomFieldDefinitionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCustomFieldDefinitionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldDefinition"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"custom_fields_definitions_destroy","description":"CRUD for custom field definitions.\n\nAuthentication: the standard /api/v2/ triad (session for the Vue UI, plus API token and\nbasic for external clients) -- this viewset is also mounted at\n/api/v2/custom_fields/definitions/ for token-driven automation. Authorization: any\nauthenticated user may read; the global Custom_Field_Manage permission is required to\ncreate, edit, or delete. Deleting a definition cascades its values (they belong to the field).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this custom field definition.","required":true}],"tags":["Custom Fields"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/custom_fields/values/":{"get":{"operationId":"custom_fields_values_list","description":"CRUD for custom field values, scoped to the objects the user can view/edit.\n\nRead: values whose owner is in the user's authorized-view set (optionally narrowed to a\nsingle owner via ``?finding=<id>``, ``?asset=<id>`` etc.). Write: only when the user can edit the owner.\n\nAlso mounted at ``/api/v2/custom_fields/values/`` with the standard API-token auth triad, so\nautomation reads and writes values with a personal token; the per-row authorization above is\nthe same on either mount.","parameters":[{"in":"query","name":"asset","schema":{"type":"integer"},"description":"Only values on the Asset (Product) with this id; same as `product`."},{"in":"query","name":"engagement","schema":{"type":"integer"},"description":"Only values on the engagement with this id."},{"in":"query","name":"finding","schema":{"type":"integer"},"description":"Only values on the finding with this id."},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization","schema":{"type":"integer"},"description":"Only values on the Organization (Product Type) with this id; same as `product_type`."},{"in":"query","name":"product","schema":{"type":"integer"},"description":"Only values on the Asset (Product) with this id."},{"in":"query","name":"product_type","schema":{"type":"integer"},"description":"Only values on the Organization (Product Type) with this id."},{"in":"query","name":"risk_acceptance","schema":{"type":"integer"},"description":"Only values on the risk acceptance with this id."},{"in":"query","name":"test","schema":{"type":"integer"},"description":"Only values on the test with this id."}],"tags":["Custom Fields"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCustomFieldValueList"}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"additionalProperties":{"type":"array","items":{"type":"string"}}},"examples":{"Non-integerAssetId":{"value":{"asset":["Enter a whole number."],"message":"asset: Enter a whole number."},"summary":"Non-integer asset id"}}}},"description":"An owner filter is not a whole number. The key is the parameter that was rejected; `message` repeats the error as one string."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"custom_fields_values_create","description":"CRUD for custom field values, scoped to the objects the user can view/edit.\n\nRead: values whose owner is in the user's authorized-view set (optionally narrowed to a\nsingle owner via ``?finding=<id>``, ``?asset=<id>`` etc.). Write: only when the user can edit the owner.\n\nAlso mounted at ``/api/v2/custom_fields/values/`` with the standard API-token auth triad, so\nautomation reads and writes values with a personal token; the per-row authorization above is\nthe same on either mount.","tags":["Custom Fields"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldValueRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CustomFieldValueRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CustomFieldValueRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldValue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/custom_fields/values/{id}/":{"get":{"operationId":"custom_fields_values_retrieve","description":"CRUD for custom field values, scoped to the objects the user can view/edit.\n\nRead: values whose owner is in the user's authorized-view set (optionally narrowed to a\nsingle owner via ``?finding=<id>``, ``?asset=<id>`` etc.). Write: only when the user can edit the owner.\n\nAlso mounted at ``/api/v2/custom_fields/values/`` with the standard API-token auth triad, so\nautomation reads and writes values with a personal token; the per-row authorization above is\nthe same on either mount.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this custom field value.","required":true}],"tags":["Custom Fields"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldValue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"custom_fields_values_update","description":"CRUD for custom field values, scoped to the objects the user can view/edit.\n\nRead: values whose owner is in the user's authorized-view set (optionally narrowed to a\nsingle owner via ``?finding=<id>``, ``?asset=<id>`` etc.). Write: only when the user can edit the owner.\n\nAlso mounted at ``/api/v2/custom_fields/values/`` with the standard API-token auth triad, so\nautomation reads and writes values with a personal token; the per-row authorization above is\nthe same on either mount.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this custom field value.","required":true}],"tags":["Custom Fields"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldValueRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CustomFieldValueRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CustomFieldValueRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldValue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"custom_fields_values_partial_update","description":"CRUD for custom field values, scoped to the objects the user can view/edit.\n\nRead: values whose owner is in the user's authorized-view set (optionally narrowed to a\nsingle owner via ``?finding=<id>``, ``?asset=<id>`` etc.). Write: only when the user can edit the owner.\n\nAlso mounted at ``/api/v2/custom_fields/values/`` with the standard API-token auth triad, so\nautomation reads and writes values with a personal token; the per-row authorization above is\nthe same on either mount.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this custom field value.","required":true}],"tags":["Custom Fields"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedCustomFieldValueRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedCustomFieldValueRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedCustomFieldValueRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomFieldValue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"custom_fields_values_destroy","description":"CRUD for custom field values, scoped to the objects the user can view/edit.\n\nRead: values whose owner is in the user's authorized-view set (optionally narrowed to a\nsingle owner via ``?finding=<id>``, ``?asset=<id>`` etc.). Write: only when the user can edit the owner.\n\nAlso mounted at ``/api/v2/custom_fields/values/`` with the standard API-token auth triad, so\nautomation reads and writes values with a personal token; the per-row authorization above is\nthe same on either mount.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this custom field value.","required":true}],"tags":["Custom Fields"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard/":{"get":{"operationId":"dashboard_list","parameters":[{"in":"query","name":"graphs","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"questionnaires","schema":{"type":"boolean"}},{"in":"query","name":"tables","schema":{"type":"boolean"}},{"in":"query","name":"tiles","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"user","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"}],"tags":["dashboard"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDashboardConfigurationList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"dashboard_create","tags":["dashboard"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DashboardConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DashboardConfigurationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard/{id}/":{"get":{"operationId":"dashboard_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard configuration.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["dashboard"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"dashboard_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard configuration.","required":true}],"tags":["dashboard"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DashboardConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DashboardConfigurationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"dashboard_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard configuration.","required":true}],"tags":["dashboard"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedDashboardConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedDashboardConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedDashboardConfigurationRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"dashboard_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard configuration.","required":true}],"tags":["dashboard"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard/{id}/delete_preview/":{"get":{"operationId":"dashboard_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard configuration.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["dashboard"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard/{id}/reset/":{"post":{"operationId":"dashboard_reset_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard configuration.","required":true}],"tags":["dashboard"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DashboardConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DashboardConfigurationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard/filter_options/":{"get":{"operationId":"dashboard_filter_options_retrieve","tags":["dashboard"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard/graded_products/":{"get":{"operationId":"dashboard_graded_products_retrieve","tags":["dashboard"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard/graph_data/":{"get":{"operationId":"dashboard_graph_data_retrieve","tags":["dashboard"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard/questionnaires/":{"get":{"operationId":"dashboard_questionnaires_retrieve","tags":["dashboard"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard_tile/":{"get":{"operationId":"dashboard_tile_list","parameters":[{"in":"query","name":"color","schema":{"type":"string","x-spec-enum-id":"9c9a36b0f59676ad","title":"Tile Color","enum":["blue","cyan","dark","green","indigo","light","orange","pink","purple","red","teal","yellow"]},"description":"The color of this tile (if dynamic tile is enabled, selected color will be ignored).\n\n* `red` - Red\n* `orange` - Orange\n* `yellow` - Yellow\n* `green` - Green\n* `teal` - Teal\n* `cyan` - Cyan\n* `blue` - Blue\n* `indigo` - Indigo\n* `purple` - Purple\n* `pink` - Pink\n* `dark` - Dark\n* `light` - Light"},{"in":"query","name":"count","schema":{"type":"integer"}},{"in":"query","name":"dynamic","schema":{"type":"boolean"}},{"in":"query","name":"footer","schema":{"type":"string"}},{"in":"query","name":"header","schema":{"type":"string"}},{"in":"query","name":"icon","schema":{"type":"string","x-spec-enum-id":"c3556497146d88cf","title":"Tile Icon","enum":["align-left","ban","bars","bolt","box-archive","bug","bullseye","calendar-days","certificate","check","circle-exclamation","circle-info","circle-question","clock","code","download","file","filter","fire-extinguisher","flag","gear","house","list-check","lock","lock-open","magnifying-glass","user"]},"description":"The icon to display within this tile.\n\n* `align-left` - Align Left\n* `box-archive` - Archive\n* `bars` - Bars\n* `ban` - Ban\n* `bolt` - Bolt\n* `bug` - Bug\n* `bullseye` - Bullseye\n* `calendar-days` - Calendar\n* `certificate` - Certificate\n* `check` - Check\n* `code` - Code\n* `gear` - Cog\n* `clock` - Clock\n* `download` - Download\n* `circle-exclamation` - Exclamation\n* `file` - File\n* `filter` - Filter\n* `fire-extinguisher` - Fire Extinguisher\n* `flag` - Flag\n* `house` - Home\n* `circle-info` - Info\n* `lock` - Lock\n* `circle-question` - Question\n* `magnifying-glass` - Search\n* `list-check` - Tasks\n* `lock-open` - Unlock\n* `user` - User"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"maximum","schema":{"type":"integer"}},{"in":"query","name":"minimum","schema":{"type":"integer"}},{"in":"query","name":"model","schema":{"type":"string","x-spec-enum-id":"a6e596d1d03709b5","title":"Tile Type","enum":["endpoint","engagement","finding","prod-grade","product","scan-time","sla","test"]},"description":"The type of data to display within this tile.\n\n* `product` - Product\n* `engagement` - Engagement\n* `test` - Test\n* `finding` - Finding\n* `endpoint` - Endpoint\n* `sla` - SLA Violation\n* `scan-time` - Scan Time Violation\n* `prod-grade` - Product Grade"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["dashboard_tile"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDashboardTileList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"dashboard_tile_create","tags":["dashboard_tile"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardTileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DashboardTileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DashboardTileRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardTile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard_tile/{id}/":{"get":{"operationId":"dashboard_tile_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard tile.","required":true}],"tags":["dashboard_tile"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardTile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"dashboard_tile_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard tile.","required":true}],"tags":["dashboard_tile"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardTileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DashboardTileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DashboardTileRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardTile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"dashboard_tile_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard tile.","required":true}],"tags":["dashboard_tile"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedDashboardTileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedDashboardTileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedDashboardTileRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardTile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"dashboard_tile_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard tile.","required":true}],"tags":["dashboard_tile"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard_tile/{id}/fetch_count/":{"get":{"operationId":"dashboard_tile_fetch_count_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard tile.","required":true}],"tags":["dashboard_tile"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardTile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard_tile/all_tiles/":{"get":{"operationId":"dashboard_tile_all_tiles_retrieve","tags":["dashboard_tile"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardTile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboard_tile/fetch_counts/":{"get":{"operationId":"dashboard_tile_fetch_counts_retrieve","description":"Fetch counts for the tiles on the dashboard in one request.\n\nOnly the first configuration's tiles are counted: that is the dashboard the Pro UI\nrenders (the first result of the dashboard list) and the classic fetch_counts view\ncounts. Tiles of one model are counted with a single aggregate query\n(batch_tile_counts); the rest go through fast_tile_count one at a time.","tags":["dashboard_tile"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardTile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/exec_pack_schedules/":{"get":{"operationId":"dashboards_exec_pack_schedules_list","description":"A user's exec pack schedules: strictly own-rows CRUD plus a test fire.\n\nCreating a schedule is exactly \"may generate reports\", so the gate is the\nexplicit ``Permissions.Generated_Report_Add`` global check the reporting\nsurface already uses, on top of the dashboard flag and the reporting flag\n(the pack renders through the reporting pipeline).","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["dashboards"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedExecPackScheduleList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"dashboards_exec_pack_schedules_create","description":"A user's exec pack schedules: strictly own-rows CRUD plus a test fire.\n\nCreating a schedule is exactly \"may generate reports\", so the gate is the\nexplicit ``Permissions.Generated_Report_Add`` global check the reporting\nsurface already uses, on top of the dashboard flag and the reporting flag\n(the pack renders through the reporting pipeline).","tags":["dashboards"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecPackScheduleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ExecPackScheduleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ExecPackScheduleRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecPackSchedule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/exec_pack_schedules/{id}/":{"get":{"operationId":"dashboards_exec_pack_schedules_retrieve","description":"A user's exec pack schedules: strictly own-rows CRUD plus a test fire.\n\nCreating a schedule is exactly \"may generate reports\", so the gate is the\nexplicit ``Permissions.Generated_Report_Add`` global check the reporting\nsurface already uses, on top of the dashboard flag and the reporting flag\n(the pack renders through the reporting pipeline).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this exec pack schedule.","required":true}],"tags":["dashboards"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecPackSchedule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"dashboards_exec_pack_schedules_partial_update","description":"A user's exec pack schedules: strictly own-rows CRUD plus a test fire.\n\nCreating a schedule is exactly \"may generate reports\", so the gate is the\nexplicit ``Permissions.Generated_Report_Add`` global check the reporting\nsurface already uses, on top of the dashboard flag and the reporting flag\n(the pack renders through the reporting pipeline).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this exec pack schedule.","required":true}],"tags":["dashboards"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedExecPackScheduleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedExecPackScheduleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedExecPackScheduleRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecPackSchedule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"dashboards_exec_pack_schedules_destroy","description":"A user's exec pack schedules: strictly own-rows CRUD plus a test fire.\n\nCreating a schedule is exactly \"may generate reports\", so the gate is the\nexplicit ``Permissions.Generated_Report_Add`` global check the reporting\nsurface already uses, on top of the dashboard flag and the reporting flag\n(the pack renders through the reporting pipeline).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this exec pack schedule.","required":true}],"tags":["dashboards"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/exec_pack_schedules/{id}/run_now/":{"post":{"operationId":"dashboards_exec_pack_run_now","description":"A user's exec pack schedules: strictly own-rows CRUD plus a test fire.\n\nCreating a schedule is exactly \"may generate reports\", so the gate is the\nexplicit ``Permissions.Generated_Report_Add`` global check the reporting\nsurface already uses, on top of the dashboard flag and the reporting flag\n(the pack renders through the reporting pipeline).","summary":"Generate this pack immediately (a test fire)","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this exec pack schedule.","required":true}],"tags":["dashboards"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecPackScheduleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ExecPackScheduleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ExecPackScheduleRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"202":{"description":"Generation queued; watch Generated Reports."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/layouts/":{"get":{"operationId":"dashboards_layouts_list","description":"CRUD + sharing + cloning for dashboard layouts.\n\nA layout is a persistent collection of widgets the user assembles\ninto a dashboard. Each layout belongs to a single user (or to the\nshared catalog when ``is_shared=True``) and carries:\n\n  * ``widgets`` — an ordered list of widget objects, each with a\n    ``type`` (one of the values from\n    ``/api/v2/dashboards/widget_catalog/``), a ``title``, a\n    per-widget ``config`` matching that type's schema, and a\n    UUID ``id`` that ties the widget to its grid position.\n  * ``layout`` — a UUID → grid-position map (``{x, y, w, h,\n    min_w, min_h, max_w, max_h}``) describing where each widget\n    sits on the 12-column grid.\n  * ``settings`` — free-form per-layout settings the frontend\n    owns (column count overrides, theme tweaks, ...).\n\nAuthorisation model:\n\n  * The whole surface is gated behind the ``dashboard_v2`` feature\n    flag (``DashboardV2Enabled``); when it is off every endpoint\n    returns 403 regardless of the caller's role.\n  * Any authenticated user can list / read their own layouts and\n    every shared (``is_shared=True``) layout.\n  * Anyone can create their own layouts.\n  * Publishing a shared layout (``is_shared=True`` on create or\n    update) requires the global maintainer permission.\n  * Modifying / deleting a shared layout requires the same, with\n    one exception: any authenticated user may change the\n    ``layout``, ``widgets`` and ``settings`` of a shared layout\n    flagged ``is_collaborative=True``. That flag is gated like\n    ``is_shared`` and only a shared layout can carry it. Renaming,\n    sharing, collaboration and deletion stay with the owner or a\n    share-permission holder. Every response reports the caller's\n    rights as ``can_edit`` (content) and ``can_manage`` (metadata).\n  * Cloning is always allowed — the clone is owned by the caller\n    and is independent of the source. A clone is never collaborative.\n\nTypical AI-agent flow:\n\n  1. ``GET widget_catalog/`` once to discover widget types.\n  2. ``POST layouts/`` to create a new layout with the desired\n     ``widgets`` + ``layout`` map.\n  3. (Optionally) ``POST layouts/{id}/set_default/`` to make the\n     new layout the user's default landing dashboard.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["Dashboards · Layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDashboardLayoutList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"dashboards_layouts_create","description":"CRUD + sharing + cloning for dashboard layouts.\n\nA layout is a persistent collection of widgets the user assembles\ninto a dashboard. Each layout belongs to a single user (or to the\nshared catalog when ``is_shared=True``) and carries:\n\n  * ``widgets`` — an ordered list of widget objects, each with a\n    ``type`` (one of the values from\n    ``/api/v2/dashboards/widget_catalog/``), a ``title``, a\n    per-widget ``config`` matching that type's schema, and a\n    UUID ``id`` that ties the widget to its grid position.\n  * ``layout`` — a UUID → grid-position map (``{x, y, w, h,\n    min_w, min_h, max_w, max_h}``) describing where each widget\n    sits on the 12-column grid.\n  * ``settings`` — free-form per-layout settings the frontend\n    owns (column count overrides, theme tweaks, ...).\n\nAuthorisation model:\n\n  * The whole surface is gated behind the ``dashboard_v2`` feature\n    flag (``DashboardV2Enabled``); when it is off every endpoint\n    returns 403 regardless of the caller's role.\n  * Any authenticated user can list / read their own layouts and\n    every shared (``is_shared=True``) layout.\n  * Anyone can create their own layouts.\n  * Publishing a shared layout (``is_shared=True`` on create or\n    update) requires the global maintainer permission.\n  * Modifying / deleting a shared layout requires the same, with\n    one exception: any authenticated user may change the\n    ``layout``, ``widgets`` and ``settings`` of a shared layout\n    flagged ``is_collaborative=True``. That flag is gated like\n    ``is_shared`` and only a shared layout can carry it. Renaming,\n    sharing, collaboration and deletion stay with the owner or a\n    share-permission holder. Every response reports the caller's\n    rights as ``can_edit`` (content) and ``can_manage`` (metadata).\n  * Cloning is always allowed — the clone is owned by the caller\n    and is independent of the source. A clone is never collaborative.\n\nTypical AI-agent flow:\n\n  1. ``GET widget_catalog/`` once to discover widget types.\n  2. ``POST layouts/`` to create a new layout with the desired\n     ``widgets`` + ``layout`` map.\n  3. (Optionally) ``POST layouts/{id}/set_default/`` to make the\n     new layout the user's default landing dashboard.","tags":["Dashboards · Layouts"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLayoutRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DashboardLayoutRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DashboardLayoutRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLayout"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/layouts/{id}/":{"get":{"operationId":"dashboards_layouts_retrieve","description":"CRUD + sharing + cloning for dashboard layouts.\n\nA layout is a persistent collection of widgets the user assembles\ninto a dashboard. Each layout belongs to a single user (or to the\nshared catalog when ``is_shared=True``) and carries:\n\n  * ``widgets`` — an ordered list of widget objects, each with a\n    ``type`` (one of the values from\n    ``/api/v2/dashboards/widget_catalog/``), a ``title``, a\n    per-widget ``config`` matching that type's schema, and a\n    UUID ``id`` that ties the widget to its grid position.\n  * ``layout`` — a UUID → grid-position map (``{x, y, w, h,\n    min_w, min_h, max_w, max_h}``) describing where each widget\n    sits on the 12-column grid.\n  * ``settings`` — free-form per-layout settings the frontend\n    owns (column count overrides, theme tweaks, ...).\n\nAuthorisation model:\n\n  * The whole surface is gated behind the ``dashboard_v2`` feature\n    flag (``DashboardV2Enabled``); when it is off every endpoint\n    returns 403 regardless of the caller's role.\n  * Any authenticated user can list / read their own layouts and\n    every shared (``is_shared=True``) layout.\n  * Anyone can create their own layouts.\n  * Publishing a shared layout (``is_shared=True`` on create or\n    update) requires the global maintainer permission.\n  * Modifying / deleting a shared layout requires the same, with\n    one exception: any authenticated user may change the\n    ``layout``, ``widgets`` and ``settings`` of a shared layout\n    flagged ``is_collaborative=True``. That flag is gated like\n    ``is_shared`` and only a shared layout can carry it. Renaming,\n    sharing, collaboration and deletion stay with the owner or a\n    share-permission holder. Every response reports the caller's\n    rights as ``can_edit`` (content) and ``can_manage`` (metadata).\n  * Cloning is always allowed — the clone is owned by the caller\n    and is independent of the source. A clone is never collaborative.\n\nTypical AI-agent flow:\n\n  1. ``GET widget_catalog/`` once to discover widget types.\n  2. ``POST layouts/`` to create a new layout with the desired\n     ``widgets`` + ``layout`` map.\n  3. (Optionally) ``POST layouts/{id}/set_default/`` to make the\n     new layout the user's default landing dashboard.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard layout.","required":true}],"tags":["Dashboards · Layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLayout"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"dashboards_layouts_update","description":"PUT/PATCH with an optional ``If-Match`` lost-update guard.\n\nNo header -> last write wins, exactly as before. With a header, the row's\ncurrent ``etag`` has to match (or the header is ``*``) or the request\nfails with 412 and the body reports the tag it should have carried.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard layout.","required":true}],"tags":["Dashboards · Layouts"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLayoutRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DashboardLayoutRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DashboardLayoutRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLayout"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"dashboards_layouts_partial_update","description":"CRUD + sharing + cloning for dashboard layouts.\n\nA layout is a persistent collection of widgets the user assembles\ninto a dashboard. Each layout belongs to a single user (or to the\nshared catalog when ``is_shared=True``) and carries:\n\n  * ``widgets`` — an ordered list of widget objects, each with a\n    ``type`` (one of the values from\n    ``/api/v2/dashboards/widget_catalog/``), a ``title``, a\n    per-widget ``config`` matching that type's schema, and a\n    UUID ``id`` that ties the widget to its grid position.\n  * ``layout`` — a UUID → grid-position map (``{x, y, w, h,\n    min_w, min_h, max_w, max_h}``) describing where each widget\n    sits on the 12-column grid.\n  * ``settings`` — free-form per-layout settings the frontend\n    owns (column count overrides, theme tweaks, ...).\n\nAuthorisation model:\n\n  * The whole surface is gated behind the ``dashboard_v2`` feature\n    flag (``DashboardV2Enabled``); when it is off every endpoint\n    returns 403 regardless of the caller's role.\n  * Any authenticated user can list / read their own layouts and\n    every shared (``is_shared=True``) layout.\n  * Anyone can create their own layouts.\n  * Publishing a shared layout (``is_shared=True`` on create or\n    update) requires the global maintainer permission.\n  * Modifying / deleting a shared layout requires the same, with\n    one exception: any authenticated user may change the\n    ``layout``, ``widgets`` and ``settings`` of a shared layout\n    flagged ``is_collaborative=True``. That flag is gated like\n    ``is_shared`` and only a shared layout can carry it. Renaming,\n    sharing, collaboration and deletion stay with the owner or a\n    share-permission holder. Every response reports the caller's\n    rights as ``can_edit`` (content) and ``can_manage`` (metadata).\n  * Cloning is always allowed — the clone is owned by the caller\n    and is independent of the source. A clone is never collaborative.\n\nTypical AI-agent flow:\n\n  1. ``GET widget_catalog/`` once to discover widget types.\n  2. ``POST layouts/`` to create a new layout with the desired\n     ``widgets`` + ``layout`` map.\n  3. (Optionally) ``POST layouts/{id}/set_default/`` to make the\n     new layout the user's default landing dashboard.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard layout.","required":true}],"tags":["Dashboards · Layouts"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedDashboardLayoutRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedDashboardLayoutRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedDashboardLayoutRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLayout"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"dashboards_layouts_destroy","description":"CRUD + sharing + cloning for dashboard layouts.\n\nA layout is a persistent collection of widgets the user assembles\ninto a dashboard. Each layout belongs to a single user (or to the\nshared catalog when ``is_shared=True``) and carries:\n\n  * ``widgets`` — an ordered list of widget objects, each with a\n    ``type`` (one of the values from\n    ``/api/v2/dashboards/widget_catalog/``), a ``title``, a\n    per-widget ``config`` matching that type's schema, and a\n    UUID ``id`` that ties the widget to its grid position.\n  * ``layout`` — a UUID → grid-position map (``{x, y, w, h,\n    min_w, min_h, max_w, max_h}``) describing where each widget\n    sits on the 12-column grid.\n  * ``settings`` — free-form per-layout settings the frontend\n    owns (column count overrides, theme tweaks, ...).\n\nAuthorisation model:\n\n  * The whole surface is gated behind the ``dashboard_v2`` feature\n    flag (``DashboardV2Enabled``); when it is off every endpoint\n    returns 403 regardless of the caller's role.\n  * Any authenticated user can list / read their own layouts and\n    every shared (``is_shared=True``) layout.\n  * Anyone can create their own layouts.\n  * Publishing a shared layout (``is_shared=True`` on create or\n    update) requires the global maintainer permission.\n  * Modifying / deleting a shared layout requires the same, with\n    one exception: any authenticated user may change the\n    ``layout``, ``widgets`` and ``settings`` of a shared layout\n    flagged ``is_collaborative=True``. That flag is gated like\n    ``is_shared`` and only a shared layout can carry it. Renaming,\n    sharing, collaboration and deletion stay with the owner or a\n    share-permission holder. Every response reports the caller's\n    rights as ``can_edit`` (content) and ``can_manage`` (metadata).\n  * Cloning is always allowed — the clone is owned by the caller\n    and is independent of the source. A clone is never collaborative.\n\nTypical AI-agent flow:\n\n  1. ``GET widget_catalog/`` once to discover widget types.\n  2. ``POST layouts/`` to create a new layout with the desired\n     ``widgets`` + ``layout`` map.\n  3. (Optionally) ``POST layouts/{id}/set_default/`` to make the\n     new layout the user's default landing dashboard.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard layout.","required":true}],"tags":["Dashboards · Layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/layouts/{id}/clone/":{"post":{"operationId":"dashboards_layouts_clone","description":"Creates a personal copy of the source layout. Each widget in the copy gets a freshly-generated UUID so the clone doesn't share widget identifiers with the source — important so subsequent PATCHes to the clone don't accidentally rewrite the source. The clone is owned by the caller and starts with ``is_shared=false`` regardless of the source's sharing state. Cloning a collaborative layout forks it: the clone is never collaborative.\n\nIf the optional ``name`` field is omitted, the clone is named ``\"Copy of <source name>\"``. A 400 is returned if a layout with the target name already exists for the caller — clients should pick a different ``name`` or delete the existing one first.","summary":"Clone an existing layout into the caller's own space","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard layout.","required":true}],"tags":["Dashboards · Layouts"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLayoutCloneRequestRequest"},"examples":{"CloneWithCustomName":{"value":{"name":"My Triage Dashboard"},"summary":"Clone with custom name"}}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DashboardLayoutCloneRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DashboardLayoutCloneRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLayout"}}},"description":""},"400":{"description":"Name already exists for caller."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/layouts/{id}/set_default/":{"post":{"operationId":"dashboards_layouts_set_default","description":"Sets the layout identified by ``id`` as the user's default. The default determines which dashboard the UI renders on first load and which layout the ``is_default=true`` flag points at in serialised responses. A user may set one of their OWN layouts, or any collaborative shared layout (``is_shared`` and ``is_collaborative`` both true), as the default — attempts to default a non-collaborative shared catalog row return 400. The previous default is replaced atomically.","summary":"Mark a layout as the caller's default landing dashboard","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard layout.","required":true}],"tags":["Dashboards · Layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLayout"}}},"description":""},"400":{"description":"Not the layout owner and not a collaborative layout."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/layouts/{id}/set_shared_default/":{"post":{"operationId":"dashboards_layouts_set_shared_default","description":"Requires the global ``Dashboard_Share`` permission. The target must already be shared (``is_shared=true``); a personal row returns 400. When layout customization is restricted, every non-superuser is pinned to this layout. A single pointer exists for the whole instance, so the previous one is replaced atomically.","summary":"Make a shared layout the global default dashboard","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dashboard layout.","required":true}],"tags":["Dashboards · Layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLayout"}}},"description":""},"400":{"description":"Target layout is not shared."},"403":{"description":"Missing the share permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/layouts/clear_shared_default/":{"post":{"operationId":"dashboards_layouts_clear_shared_default","description":"Requires the global ``Dashboard_Share`` permission. Restricted users then fall back to the seeded starter template. Idempotent: 204 whether or not a pointer existed.","summary":"Drop the global default dashboard pointer","tags":["Dashboards · Layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"Pointer cleared."},"403":{"description":"Missing the share permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/layouts/for_current_user/":{"get":{"operationId":"dashboards_layouts_for_current_user","description":"Returns a ``{results, default_id, shared_default_id}`` envelope describing every layout the caller owns, followed by every collaborative shared layout (``is_collaborative=true``) visible to them, plus the id of their default layout. On a first hit (no owned layouts), lazily clones the starter template into the caller's own space so the very first call always returns at least one layout — subsequent calls are idempotent.\n\nWhen layout customization is restricted (the ``restrict_layout_customization`` system setting), a non-superuser instead gets only the admin-designated shared default (or the starter template when none is set), with no clone and no personal default written.\n\n``shared_default_id`` is the admin-designated global default, surfaced so the layout manager can flag it; it is null when none is set.","summary":"Bootstrap endpoint — list the caller's layouts + default id","tags":["Dashboards · Layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardLayoutsForCurrentUserResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/layouts/shared/":{"get":{"operationId":"dashboards_layouts_shared","description":"Returns the set of layouts visible to every authenticated user — the curated catalog templates (Default Dashboard, Priority Layout, Mitigation Layout, Tool Layout) plus any team-published shared layouts. Catalog rows carry ``is_catalog=true``; user-published ones carry ``is_catalog=false``.","summary":"List every shared (catalog or team-published) layout","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["Dashboards · Layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDashboardLayoutList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/layouts/shared_default/":{"get":{"operationId":"dashboards_layouts_shared_default","description":"Read-only overview for the Layout Defaults settings page. Returns the designated global default layout's id and name, or nulls when none is set.","summary":"Read the global default dashboard pointer","tags":["Dashboards · Layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardSharedDefaultResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_catalog/":{"get":{"operationId":"dashboards_widget_catalog_list","description":"Returns the full widget catalog plus the four category groups. Each catalog entry carries the widget ``type`` (the value to set on a widget in a saved layout), a human-readable label and description, the category id, the data endpoints the widget reads from, a minimal ``config_example`` you can copy as a starting point, and ``requires`` — the feature flags, licensed features and permissions the widget's data endpoint enforces beyond the ``dashboard_v2`` baseline (all empty for an ungated widget). The order of the entries is editorial — the Vue UI's Add Widget Dialog renders them in this order, and client-side reorderings should preserve it.","summary":"List every widget type the dashboard supports","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["Dashboards · Widget Catalog"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedWidgetCatalogResponseList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_catalog/config_schema/":{"get":{"operationId":"dashboards_widget_catalog_config_schema","description":"Returns a JSON Schema (draft 2020-12) per widget type describing the ``config`` object a saved widget of that type accepts: the keys, their types, the allowed values for enumerated keys, numeric bounds and the defaults the server fills in. A client can validate a widget config before ``POST``/``PATCH``-ing a layout instead of round-tripping a 400. The server-side validator in ``widget_schema.py`` stays authoritative: it also normalises values and enforces the few cross-field rules (e.g. ``group_by`` must be a dimension of the chosen ``model``) that the schema only approximates, so a config the schema accepts can still be rejected on save. Pass ``?type=<widget type>`` to fetch one schema.","summary":"JSON Schema for every widget type's ``config``","parameters":[{"in":"query","name":"type","schema":{"type":"string"},"description":"Restrict the response to a single widget type. Unknown type -> 404."}],"tags":["Dashboards · Widget Catalog"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetConfigSchemaResponse"}}},"description":""},"404":{"description":"``type`` names no widget type."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/aggregate/":{"post":{"operationId":"dashboards_widget_data_aggregate","description":"Returns a ``{labels, series, group_by, aggregation, time_bucket, model, model_label, group_by_label}`` envelope suitable for direct rendering as an eCharts bar / line / pie / area chart. ``group_by`` must be a key from the model's dimension catalog (see ``GET dimensions/?model=<m>``); ``aggregation`` is a key from the same endpoint's ``aggregations`` list: ``count`` (rows) for every model, or one of the finding-only distinct operators (``distinct_cwe``, ``distinct_vulnerability_id``, ``distinct_issue``) that count unique issues rather than findings. With ``include_total``, ``total`` is the operator applied once over the filtered set (or over the ``total_groups`` buckets), which for a distinct operator is not the sum of the buckets.","summary":"Group-by aggregation for the Graph widget","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetAggregateRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetAggregateRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetAggregateRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"Chart envelope (labels + series + metadata)."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/aging/":{"post":{"operationId":"dashboards_widget_data_aging","description":"Returns one bar per age bucket (defined by ``boundaries`` — defaults to [30, 90, 180] producing [0-30d, 30-90d, 90-180d, 180+d]); each bar splits by severity. ``date_field`` picks which timestamp drives the bucketing (default ``created``).","summary":"Vulnerability aging — stacked bars by age bucket × severity","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetAgingRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetAgingRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetAgingRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{labels, series:[Critical, High, Medium, Low, Info], total}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/ai_footprint/":{"post":{"operationId":"dashboards_widget_data_ai_footprint","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Assets carrying each kind of AI component","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{assets_with_ai, by_kind, generated_at}``."},"403":{"description":"Dashboards 2.0 or AI Inventory and Governance is off.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/asset_onboarding/":{"post":{"operationId":"dashboards_widget_data_asset_onboarding","description":"Counts the assets the requesting user may see that still sit in a connector's default organization or miss any of the five priority fields, and whether onboarding is complete (nothing left). The same read as ``GET /api/v2/assets/onboarding_status/``, plus how many open hierarchy suggestions the user can act on (null while hierarchy suggestions are off).","summary":"How many assets still need placement or priority data","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{onboarding_complete, needs_attention, total_assets, by_reason: {connector_default_org, missing_priority_fields}, hierarchy_suggestions}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/automation_rate/":{"post":{"operationId":"dashboards_widget_data_automation_rate","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Auto-actioned vs hand-triaged, from the rules ledger","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationRateRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AutomationRateRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AutomationRateRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{rate, auto_actions, manual_closures, series, ...}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/big_kpi/":{"post":{"operationId":"dashboards_widget_data_big_kpi","description":"The value is live; the delta compares against the snapshot backbone at the requested window and names the baseline period. When no snapshot is old enough the delta is absent with a stated reason, never a zero.","summary":"One display-size number with an honest, ledgered delta","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BigKpiRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BigKpiRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BigKpiRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{metric, value, delta, window_days, baseline_period, delta_unavailable_reason}``."},"400":{"description":"Unknown metric or window."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/command_center_scene/":{"post":{"operationId":"dashboards_widget_data_command_center_scene","description":"Everything the flagship screen draws, composed from the readers the widgets already use and versioned as one contract. Every number carries its availability, its delta against the previous equivalent window (or null when no ledger can support one) and a door: a list destination whose filter keys are on the URL contract, a receipts export, or the posture why drawer. ``scope=authorized`` (default) reads the caller's authorized products; ``scope=global`` needs a global view permission. ``as_of`` replays a past day from the snapshot ledger; sections the ledger does not carry come back unavailable rather than recomputed.","summary":"The Command Center scene: sources, flow, score, outcomes and strip in one round trip","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommandCenterSceneRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CommandCenterSceneRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CommandCenterSceneRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{contract_version, as_of, availability, brief, sources, flow, automation, score, outcomes, strip}``."},"400":{"description":"Malformed window, scope, product_ids or as_of."},"403":{"description":"Global scope without a global view permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/count/":{"post":{"operationId":"dashboards_widget_data_count","description":"Returns the count of rows matching ``filters`` for the given ``model``. The same filter dict the equivalent list view accepts (the v2 ``Extended*Filter`` chain) works here — see the ``url_contracts`` in the catalog module for the URL-contract-safe subset. Result is cached for 10s per ``(user, model, filter-hash)`` to keep a dashboard refresh cheap.","summary":"Filtered row count for a single model","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetCountRequestRequest"},"examples":{"ActiveCriticalFindings":{"value":{"model":"finding","filters":{"status_any":"Active","severity":"Critical"}},"summary":"Active critical findings"}}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetCountRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetCountRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetCountResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/cra_article14_deadlines/":{"get":{"operationId":"dashboards_widget_data_cra_article14_deadlines","description":"``breached`` (the miss is recorded and does not clear when the stage is submitted) is counted apart from ``overdue`` (past the deadline, not yet scanned). Needs the regulatory flag, not PSIRT.","summary":"Pending CRA Article 14 report stages by state, on the products the caller can see","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{pending, counts:{breached, overdue, due_soon, on_track}, attention:[...]}``."},"403":{"description":"The regulatory flag is off.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/dedupe_funnel/":{"post":{"operationId":"dashboards_widget_data_dedupe_funnel","description":"Five exact stage counts (ingested, unique after dedupe, after rules and triage, prioritized, actionable now) over a trailing window, with every gap itemized from a ledger: matched dedupe outcomes, rule removals, and the manual remainder. ``scope=global`` (instance truth including ledger rows whose product no longer resolves) requires a global view permission.","summary":"The instrumented pipeline funnel with itemized stage gaps","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DedupeFunnelRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DedupeFunnelRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DedupeFunnelRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{window, stages, matched, rules, manual_triage, scope}``."},"400":{"description":"Malformed window, product_ids, or scope."},"403":{"description":"Flag off, or global scope without a global view permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/dimensions/":{"get":{"operationId":"dashboards_widget_data_dimensions","description":"Returns the curated dimension catalog for one model — the same allowlist ``POST aggregate/`` enforces. Each entry carries the dim ``key`` (the value to pass as ``group_by``), a human ``label``, and a ``kind`` (``categorical`` / ``boolean`` / ``time`` / ``banded``). ``aggregations`` lists the operators ``POST aggregate/`` and ``POST count/`` accept for the model (``count`` everywhere; the distinct CWE / vulnerability-id / issue operators on ``finding`` only). The Graph / Sunburst / Sankey / Count / Severity Tiles config dialogs populate their dropdowns from this endpoint.","summary":"List the group-by dimensions valid for a model","parameters":[{"in":"query","name":"model","schema":{"type":"string"},"description":"Target model (finding / product / engagement / test).","required":true}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetDimensionsResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/fda_metrics/":{"post":{"operationId":"dashboards_widget_data_fda_metrics","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"The three Section 524B lifecycle metrics across visible cyber devices","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FdaMetricsRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FdaMetricsRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FdaMetricsRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{devices, metrics: [{key, value, gap_count, ...}], ...}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/filter_contract/":{"get":{"operationId":"dashboards_widget_data_filter_contract","description":"Returns the complete filter vocabulary for one model — every key the widget-data endpoints (``count``, ``aggregate``, ``top_records``, ``rate``, ...) accept in their ``filters`` dict, as declared by the model's FilterSet. Unknown filter keys are silently ignored by those endpoints (the number comes back unfiltered, not rejected), so scripted callers should validate their filters against this list first. Each entry names the ``filter`` class, the ORM ``field`` and ``lookup`` it applies, any ``help_text`` / ``label`` / static ``choices`` the FilterSet declares, and ``url_safe`` — whether the key round-trips through a Count widget's click-through URL into the list view (the same allowlist the built-in catalog is held to). Also bundles the model's group-by ``dimensions`` (as ``GET dimensions/``) and ``record_metrics`` (as ``GET record_metrics/``) so one call describes everything a widget config can reference.","summary":"List every filter key, dimension and record metric a model accepts","parameters":[{"in":"query","name":"model","schema":{"type":"string"},"description":"Target model (finding / product / engagement / test).","required":true}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetFilterContractResponse"}}},"description":""},"400":{"description":"Unknown model."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/fix_durability/":{"post":{"operationId":"dashboards_widget_data_fix_durability","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Reopen rates over honest closure cohorts","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FixDurabilityRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FixDurabilityRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FixDurabilityRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{cohorts, by_group, group_by}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/freshness_trend/":{"post":{"operationId":"dashboards_widget_data_freshness_trend","description":"How many products were scanned within 30/90/180/365 days, and how many had never been scanned, over time. Never-scanned is a distinct series, not a zero. Same envelope, scoping and honesty rules as posture_trend.","summary":"Scan freshness history from the daily snapshot backbone","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FreshnessTrendRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FreshnessTrendRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FreshnessTrendRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{periods, series, availability, markers, scope, granularity}``."},"400":{"description":"Malformed dates, span too large, or bad granularity/scope."},"403":{"description":"Flag off, or global scope without a global view permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/funnel_receipts/":{"post":{"operationId":"dashboards_widget_data_funnel_receipts","description":"The metering ledger rows behind the funnel's first two stages and the rule events behind its triage stage, newest first, capped at 5000 rows per kind with an explicit truncation flag. This is the receipts export: which findings each stage dropped, and why, as data.","summary":"The funnel's audit-trail export: raw evidence rows","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunnelReceiptsRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FunnelReceiptsRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FunnelReceiptsRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{window, imports?, rules?, generated_at, scope}``."},"400":{"description":"Malformed parameters."},"403":{"description":"Global scope without a global view permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/funnel_trend/":{"post":{"operationId":"dashboards_widget_data_funnel_trend","description":"Submitted, unique-created, rule-actioned, prioritized and actionable series over time. Same envelope, scoping and honesty rules as posture_trend.","summary":"Dedupe funnel history from the daily snapshot backbone","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FunnelTrendRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FunnelTrendRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FunnelTrendRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{periods, series, availability, markers, scope, granularity}``."},"400":{"description":"Malformed dates, span too large, or bad granularity/scope."},"403":{"description":"Flag off, or global scope without a global view permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/heatmap/":{"post":{"operationId":"dashboards_widget_data_heatmap","description":"Returns a per-day count array suitable for an eCharts calendar series. Use ``date_field`` to choose which timestamp drives bucketing (``created`` for inflow, ``mitigated`` for outflow, ``date`` for discovery).","summary":"GitHub-style calendar heatmap of daily activity","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetHeatmapRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetHeatmapRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetHeatmapRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{cells:[{date, count}, ...], start, end, max, total}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/hero_summary/":{"get":{"operationId":"dashboards_widget_data_hero_summary","description":"Open counts by severity, the actionable backlog, SLA pressure (including the Critical plus High headline), KEV exposure, scan freshness, the trailing automation count, and the latest snapshot period for the band's own freshness stamp. ``sections`` filters which tiles are computed.","summary":"Everything the hero band shows, in one round trip","parameters":[{"in":"query","name":"sections","schema":{"type":"string"},"description":"CSV subset of severity, actionable, sla, freshness, kev, automation."}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{tiles, snapshot, posture_score}``."},"400":{"description":"Unknown section names."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/ingest_health/":{"get":{"operationId":"dashboards_widget_data_ingest_health","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"The sensors rail: connector and import pipeline health by volume","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{rows, generated_at}``."},"403":{"description":"Flag off, or the caller is not a global maintainer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/insights_plot/":{"post":{"operationId":"dashboards_widget_data_insights_plot","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"One of three Insights plots, as a dashboard widget","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardInsightsPlotRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DashboardInsightsPlotRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DashboardInsightsPlotRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{plot, title, date_range, rows, availability}``."},"400":{"description":"Unknown plot, or a date_range outside 1 to 3650 days."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/mttr_mttd/":{"post":{"operationId":"dashboards_widget_data_mttr_mttd","description":"Paired time series — mean time to remediate (MTTR) and mean time to detect (MTTD) bucketed at ``time_bucket`` granularity over ``window_days``. MTTR anchors on ``mitigated`` minus ``date``; MTTD on ``last_status_update`` minus ``date``.","summary":"MTTR + MTTD time series","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetMttrMttdRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetMttrMttdRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetMttrMttdRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{mttr:{value, count, trend:[...], labels:[...]}, mttd:{value, count, trend, labels}, time_bucket, window_days}`` — ``value`` is mean days (or null when count is 0); ``trend`` is per-bucket mean days."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/mttr_survival/":{"post":{"operationId":"dashboards_widget_data_mttr_survival","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Remediation survival curve with a median marker","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MttrSurvivalRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/MttrSurvivalRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/MttrSurvivalRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{marks, surviving, median_days, resolved_total}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/my_work/":{"get":{"operationId":"dashboards_widget_data_my_work","description":"Always scopes to ``request.user`` server-side — a shared layout that embeds this widget renders each viewer's own queue rather than the layout owner's. Use the ``buckets`` query param to subset which categories are returned; default is all three.","summary":"Per-caller work queue (assignments / mentions / reviews)","parameters":[{"in":"query","name":"buckets","schema":{"type":"string"},"description":"Comma-separated bucket names: assigned, mentions, pending_reviews. Omit for all."},{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Max rows per bucket. 1-50, default 10."}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{assigned:[...], mentions:[...], pending_reviews:[...], totals:{assigned, mentions, pending_reviews}}`` — only the requested buckets are populated; ``totals`` always reflects all three."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/pci_quarter_status/":{"post":{"operationId":"dashboards_widget_data_pci_quarter_status","description":"Returns how many in-scope assets the requesting user may see have an internal scan, an authenticated scan and a passing ASV scan recorded for the current assessment quarter, how many are still short, and the fewest days remaining across those quarters. Read from the nightly materialization rather than recomputed. Returns empty counts when the pci_dss feature is off.","summary":"PCI DSS Requirement 11 evidence for the quarter that is open today","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{in_scope_products, days_remaining, materialized, checks: [{key, label, satisfied, missing, not_applicable}, ...]}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/posture_formula/":{"get":{"operationId":"dashboards_widget_data_posture_formula","description":"The exact scale, bands, weights, constants and normalizations of the posture score model, plus the version history. This endpoint is the API half of the published-formula commitment; the docs page renders the same descriptor in prose. It exposes math, not data.","summary":"The published posture score formula, machine-readable","parameters":[{"in":"query","name":"version","schema":{"type":"integer"},"description":"A specific formula version (default: current)."}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{version, current_version, scale, constants, components, versions}``."},"404":{"description":"Unknown formula version."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/posture_score/":{"get":{"operationId":"dashboards_widget_data_posture_score","description":"Scale 0 to 1000, computed from the daily snapshot's stored input vector through the published, versioned formula (see ``posture_formula``). ``include`` selects extra sections: ``breakdown`` (per-component weights, values and contributions plus the raw inputs), ``levers`` (exact counterfactuals ranked by score delta; deltas are lower bounds), ``trend`` (score series; ``trend_basis=current`` recomputes history under the current formula, ``as_published`` replays the number as it stood). ``scope=authorized`` (default) scores exactly the caller's authorized products; ``scope=global`` requires a global view permission.","summary":"The published posture score, with its why-breakdown and counterfactual levers","parameters":[{"in":"query","name":"date","schema":{"type":"string"},"description":"ISO date to score (default: latest snapshot)."},{"in":"query","name":"formula_version","schema":{"type":"integer"},"description":"Pin a formula version (default: current)."},{"in":"query","name":"include","schema":{"type":"string"},"description":"CSV of breakdown, levers, trend."},{"in":"query","name":"scope","schema":{"type":"string"},"description":"authorized (default) or global."},{"in":"query","name":"trend_basis","schema":{"type":"string"},"description":"current (default) or as_published."},{"in":"query","name":"trend_days","schema":{"type":"integer"},"description":"Trend window, 14 to 3650 (default 365)."}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{score, band, delta_30d, formula_version, breakdown?, levers?, trend?}``."},"400":{"description":"Malformed parameters or unknown formula version."},"403":{"description":"Global scope without a global view permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/posture_trend/":{"post":{"operationId":"dashboards_widget_data_posture_trend","description":"Open findings by severity, SLA breaches, actionable backlog and KEV exposure over time, read from the append-only daily snapshot table rather than recomputed. ``scope=authorized`` (default) aggregates the caller's authorized products; ``scope=global`` serves instance truth and requires a global view permission. Periods with no snapshot render as gaps; ``availability`` lists reconstructed (non-live) periods and ``markers`` carries trend annotations such as scanner onboardings and score model changes.","summary":"Multi-year posture history from the daily snapshot backbone","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SnapshotTrendRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SnapshotTrendRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SnapshotTrendRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{periods, series, availability, markers, scope, granularity}``."},"400":{"description":"Malformed dates, span too large, or bad granularity/scope."},"403":{"description":"Flag off, or global scope without a global view permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/priority_histogram/":{"post":{"operationId":"dashboards_widget_data_priority_histogram","description":"Returns an equal-width histogram of ``EnhancedFinding.priority`` over the filtered universe. Bins are auto-computed between the dataset's observed min and max. Findings with NULL priority (engine hasn't run yet) are reported separately as ``without_priority``.","summary":"Continuous distribution of priority scores","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetPriorityHistogramRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetPriorityHistogramRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetPriorityHistogramRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{min, max, bin_count, bin_width, bins:[{low, high, label, count}, ...], total, without_priority}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/psirt_advisory_status/":{"get":{"operationId":"dashboards_widget_data_psirt_advisory_status","description":"Status breakdown plus the advisories sitting in review or approved without movement for a fortnight — the part a lead wants, which a plain status breakdown buries among the drafts.","summary":"Where this team's own advisories are, and which have stalled","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{by_status:{...}, total, stuck:[...], headline}``."},"403":{"description":"PSIRT flag off, or unlicensed, or caller is not a global maintainer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/psirt_exposure/":{"get":{"operationId":"dashboards_widget_data_psirt_exposure","description":"Answers 'am I affected?' for the advisories that arrived in the window. Four buckets that are never merged: ``affected`` (a match exists), ``unknown`` (matched, but the version could not be decided), ``not_affected`` (matching ran and found nothing), and ``no_signal`` (matching has not run, or there is no inventory to match against). ``not_affected`` and ``no_signal`` are kept apart deliberately — collapsing them reports ignorance as safety.","summary":"Newly-ingested advisories split by what they mean for your inventory","parameters":[{"in":"query","name":"severity_floor","schema":{"type":"string"},"description":"Drop advisories below this severity. Omit for no floor."},{"in":"query","name":"window_days","schema":{"type":"integer"},"description":"1-90, default 7."}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{window_days, since, total, counts:{...}, advisory_ids:{...}, top:[...], headline}``."},"403":{"description":"PSIRT flag off, or unlicensed, or caller is not a global maintainer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/psirt_feed_health/":{"get":{"operationId":"dashboards_widget_data_psirt_feed_health","description":"Leads with what is wrong rather than a success count. A feed that stopped polling produces no advisories, and no advisories looks exactly like a quiet week — so ``silent`` (enabled, nothing delivered for ``stale_after_hours``) and ``erroring`` are the payload's point.","summary":"Whether the enabled PSIRT feeds are actually delivering","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{enabled, total, silent:[...], erroring:[...], healthy, stale_after_hours, headline}``."},"403":{"description":"PSIRT flag off, or unlicensed, or caller is not a global maintainer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/psirt_sla_pressure/":{"get":{"operationId":"dashboards_widget_data_psirt_sla_pressure","description":"``overdue`` means the deadline has passed and the breach scanner has not been round yet; ``breached`` means the miss is recorded and will not clear when the work finishes. They are reported separately because a single 'late' number hides which of the two a reader is looking at.","summary":"Live PSIRT SLA clocks by state, with breached counted separately from overdue","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{live, counts:{...}, attention:[...], armed_publishes, failed_schedules, headline}``."},"403":{"description":"PSIRT flag off, or unlicensed, or caller is not a global maintainer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/rate_chart/":{"post":{"operationId":"dashboards_widget_data_rate_chart","description":"Two FilterSets in one call — ``filters`` defines the universe (denominator); ``pass_filters`` defines the numerator subset. The endpoint groups both populations by ``group_by`` and emits per-category rates. Single round-trip replaces what would otherwise be N+1 count fetches.","summary":"Per-category numerator/denominator rate","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetRateChartRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetRateChartRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetRateChartRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{labels, series:[rate, numerator, denominator], ...}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/recent_activity/":{"get":{"operationId":"dashboards_widget_data_recent_activity","description":"Returns the N most recently updated rows for the model scoped through the same ``get_authorized_*`` queryset the list view uses. Each row carries enough metadata (id, title, when, who) to render a clickable feed entry.","summary":"Most-recent rows for the chosen model","parameters":[{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Row cap (per the recent_activity helper)."},{"in":"query","name":"model","schema":{"type":"string"},"description":"finding / engagement / test / risk_acceptance. Default finding."}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{items:[{id, title, when, ...}, ...], model:<str>, limit:<int>}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/record_metrics/":{"get":{"operationId":"dashboards_widget_data_record_metrics","description":"Mirrors ``GET dimensions/`` but for the Top-N widget's records mode. Returns the allowlist of per-record metrics ``POST top_records/`` accepts as ``metric`` — e.g. ``priority``, ``numeric_grade``, ``oldest_open``, ``recently_mitigated``. Each entry carries a user-facing ``label`` plus the metric's natural sort direction.","summary":"List the per-record sort metrics valid for a model","parameters":[{"in":"query","name":"model","schema":{"type":"string"},"description":"Target model (finding / product).","required":true}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetRecordMetricsResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/regulatory_scope/":{"post":{"operationId":"dashboards_widget_data_regulatory_scope","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Compliance posture, one row per regulation the caller can see","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryScopeRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulatoryScopeRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulatoryScopeRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{rows, include_support_period}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/risk_acceptance_debt/":{"post":{"operationId":"dashboards_widget_data_risk_acceptance_debt","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Expiring, overdue and serial risk acceptances","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceDebtRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceDebtRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceDebtRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{expiring_soon, overdue_unhandled, rows, ...}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/risk_matrix/":{"post":{"operationId":"dashboards_widget_data_risk_matrix","description":"Returns a ``cells`` grid where rows are EPSS bands (top → bottom = highest probability → lowest) and columns are the chosen X dimension's canonical low → high-risk order. Findings with no EPSS data are excluded from the matrix and surfaced separately as ``without_epss``.","summary":"EPSS × risk-dimension 5×N heatmap (finding-only)","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetRiskMatrixRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetRiskMatrixRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetRiskMatrixRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{x_dim, x_dim_label, x_labels, y_labels, cells, total, without_epss}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/root_causes/":{"post":{"operationId":"dashboards_widget_data_root_causes","description":"Returns the highest-ranked ``RootCause`` clusters the requesting user may see, in the same order as the Root Causes page. Counts are authorization-scoped, so two users can legitimately see different numbers for the same cluster. Returns an empty list when the finding_correlation feature is off.","summary":"Top root causes by authorization-scoped risk","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetRootCausesRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetRootCausesRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetRootCausesRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{rows: [{id, cause_type, display_name, fixed_version, active_member_count, product_count, max_priority, risk, severity_score, score_basis, muted}, ...], limit}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/sankey/":{"post":{"operationId":"dashboards_widget_data_sankey","description":"Returns ``{nodes, links}`` in eCharts sankey shape. Each node carries display ``label`` + namespaced ``name`` (``src::<value>`` / ``tgt::<value>``) so overlapping values across the two dims don't trip the DAG-cycle check eCharts applies.","summary":"Sankey flow — source dim → target dim","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetSankeyRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetSankeyRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetSankeyRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{nodes, links, source_dim, target_dim, ...}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/saved_reports/":{"get":{"operationId":"dashboards_widget_data_saved_reports","description":"Returns the user's accessible Report Templates plus each template's ``latest_run`` metadata. Run + download is handled via the existing ``/api/vue/generated_reports/`` endpoint — this read-only endpoint just surfaces the catalog. Requires the ``reporting`` feature flag; instances without it return 403.","summary":"Caller's saved Report Templates with latest run state","parameters":[{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Row cap, defaults to the SAVED_REPORTS default."}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{rows:[{id, name, latest_run, ...}, ...]}``."},"403":{"description":"Reporting feature flag is off.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/scan_cadence/":{"get":{"operationId":"dashboards_widget_data_scan_cadence_retrieve","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Scan cadence status counts and most overdue products","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"dashboards_widget_data_scan_cadence_create","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Scan cadence status counts and most overdue products","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/scan_coverage/":{"post":{"operationId":"dashboards_widget_data_scan_coverage","description":"Returns one ``band`` per window — each with the count of matching rows scanned within ``window_days`` days, the universe total, and the percentage. Bands are sorted ascending by ``window_days`` so the funnel reads tightest-window-first.","summary":"Multi-window scan-recency rollup","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetScanCoverageRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetScanCoverageRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetScanCoverageRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{bands:[{window_days, label, scanned, total, percent}, ...], total, model}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/scan_freshness/":{"post":{"operationId":"dashboards_widget_data_scan_freshness","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Honest coverage: freshness buckets with never-scanned distinct","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanFreshnessRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ScanFreshnessRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ScanFreshnessRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{boundaries, buckets, total, by_scan_type?}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/sensei_brief/":{"get":{"operationId":"dashboards_widget_data_sensei_brief","description":"Assembled strictly from the same grounded numbers the screen shows; each sentence cites the fact ids it used and the response carries the full receipts map. Generated by the instance's Sensei LLM when available, and by a deterministic template otherwise (the ``generator`` field says which). ``force=1`` regenerates instead of serving the cached brief.","summary":"The three-sentence morning brief, every claim carrying its receipt","parameters":[{"in":"query","name":"force","schema":{"type":"boolean"},"description":"Regenerate instead of serving the cached brief."}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{generated_at, generator, model, sentences, receipts}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/sensor_coverage/":{"post":{"operationId":"dashboards_widget_data_sensor_coverage","description":"Counts the sensor coverage of the assets the requesting user may see, by status, with the applicable total (protected, likely, stale and missing) and the share protected (null when nothing is applicable).","summary":"The share of applicable assets a sensor protects","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{counts: {<status>: n}, applicable, protected_share}``."},"403":{"description":"The feature is not enabled or not licensed on this instance.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/shadow_ai/":{"post":{"operationId":"dashboards_widget_data_shadow_ai","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Unauthorized and undecided AI components, by kind","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShadowAiRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ShadowAiRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ShadowAiRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{unauthorized, needs_review, by_kind, top_assets, generated_at}``."},"403":{"description":"Dashboards 2.0 or AI Inventory and Governance is off.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/sla_burndown/":{"get":{"operationId":"dashboards_widget_data_sla_burndown","description":"Returns up to ``limit`` findings whose SLA expiration is within ``days_threshold`` days of today. Use ``severity_filter`` (comma-separated, e.g. ``Critical,High``) to scope to a specific tier; omit for all severities. ``include_overdue=false`` excludes already-breached findings (default includes them).","summary":"Findings approaching SLA breach, sorted by days remaining","parameters":[{"in":"query","name":"days_threshold","schema":{"type":"integer"},"description":"SLA window, -365..365, default 14."},{"in":"query","name":"include_overdue","schema":{"type":"boolean"},"description":"Include findings past SLA. Default true."},{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Row cap, 1..100, default 10."},{"in":"query","name":"severity_filter","schema":{"type":"string"},"description":"Comma-separated severities. Omit for all."}],"tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{rows:[{id, title, severity, sla_days_remaining, product_name, ...}, ...]}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/sla_five_state/":{"post":{"operationId":"dashboards_widget_data_sla_five_state","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"The five-state SLA model: resolved late is not still-open-late","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlaFiveStateRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SlaFiveStateRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SlaFiveStateRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{states, total_open, window_days}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/sunburst/":{"post":{"operationId":"dashboards_widget_data_sunburst","description":"Returns a ``{tree, hierarchy, total, labels, model}`` envelope in eCharts sunburst data shape. ``hierarchy`` is one or two dimension keys (1 = single-ring pie, 2 = drill-down sunburst). Top-level slices and per-parent fan-out are capped at 12 and 8 respectively; overflow rolls into synthetic 'Other' arcs.","summary":"Two-level hierarchical breakdown (sunburst chart)","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetSunburstRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetSunburstRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetSunburstRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{tree, hierarchy, total, labels, model}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/team_scorecard/":{"post":{"operationId":"dashboards_widget_data_team_scorecard","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Scope-normalized per-organization scorecard from the latest snapshot","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamScorecardRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TeamScorecardRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TeamScorecardRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{period, rows, availability}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/threat_pulse/":{"post":{"operationId":"dashboards_widget_data_threat_pulse","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"KEV additions and EPSS jumps against the caller's open findings","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatPulseRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ThreatPulseRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ThreatPulseRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{rows, total_events, window_days}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/top_fixes/":{"post":{"operationId":"dashboards_widget_data_top_fixes","description":"Per-widget data fetchers.\n\nEach action takes the relevant slice of widget config (the same\nconfig persisted on a saved dashboard layout) and returns the\nrendered data shape the widget expects. Splitting the data\npipeline from layout storage means the same render path serves\nsaved widgets, in-flight edits in the config dialog, and direct\nAPI callers (AI agents, scripted reports).\n\nAll endpoints:\n\n  * Require the ``dashboard_v2`` feature flag\n    (``DashboardV2Enabled``); when it is off the endpoint returns\n    403 before any data work runs.\n  * Accept Session, Token, or Basic authentication.\n  * Require an authenticated user — anonymous calls return\n    401/403.\n  * Apply the same ``get_authorized_*`` queryset scoping the rest\n    of the platform uses, so a caller only ever sees data they\n    have access to via the product / product-type permission\n    model. Sharing a layout never widens the data scope; viewers\n    of a shared layout see only the rows their own permissions\n    allow.\n\nResponse shapes are documented per-action. Most endpoints return\na ``{labels, series, ...}`` envelope eCharts can render directly,\nbut a handful (count, recent_activity, my_work) return more\nspecific shapes — see the per-action ``responses`` definition.","summary":"Root causes ranked by portfolio risk removed","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TopFixesRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TopFixesRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TopFixesRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{rows, open_risk_total, availability}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/top_records/":{"post":{"operationId":"dashboards_widget_data_top_records","description":"Returns the top N individual records (NOT aggregated buckets) ranked by a per-record metric — e.g. 'top products by grade', 'top findings by priority'. The ``metric`` must be one of the keys from ``GET record_metrics/?model=<m>``.","summary":"Top-N records by a per-record metric (Top-N widget, records mode)","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetTopRecordsRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetTopRecordsRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetTopRecordsRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{labels, series, metric, model, ...}`` chart envelope."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/treemap/":{"post":{"operationId":"dashboards_widget_data_treemap","description":"Returns a nested-rectangle ``tree`` in eCharts treemap shape. Inner rectangles are products grouped under their parent organisations; rectangle area scales with the chosen ``metric`` (``count`` or ``active_count``). Colour scales with severity weight.","summary":"Portfolio treemap (organisation → product, sized by metric)","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetTreemapRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetTreemapRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetTreemapRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{tree:[...], total, max_weight, metric}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/usage/":{"get":{"operationId":"dashboards_widget_data_usage","description":"Returns the account's current license-usage verdict — aggregate status / level / percentage plus a per-signal ``breakdown`` array (one entry per enforcement on the license, e.g. ``database_size_limit``, ``weekly_finding_usage``). Result is cached for 30s by the licensing module, so refreshing the widget at a high cadence stays cheap.\n\nAccount-wide signal — accepts no payload. The widget config carries no knobs in v1 (the user just adds the widget and it renders the current usage).","summary":"License usage + per-signal enforcement breakdown","tags":["Dashboards · Widget Data"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{status, level, usage, capacity, percentage, human_string, breakdown:[{measurement_type, level, usage, capacity, percentage, human_string, ...}]}``."},"403":{"description":"Caller lacks the maintainer permission the License Manager requires.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dashboards/widget_data/velocity/":{"post":{"operationId":"dashboards_widget_data_velocity","description":"Returns paired time series of finding *creation* (grouped by ``date``) and *closure* (grouped by ``mitigated``) per bucket, plus a running net delta. Indicator for whether the backlog is growing or shrinking.","summary":"Finding velocity — created vs closed per bucket","tags":["Dashboards · Widget Data"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetVelocityRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/WidgetVelocityRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WidgetVelocityRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"``{labels, series:[created, closed, net], totals}``."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/defectdojo_information/feature_flags/":{"get":{"operationId":"defectdojo_information_feature_flags_list","description":"Return every non-stale, non-hidden feature flag with its display metadata (title, description, documentation link, warnings, availability, beta), and its resolved effective value. This is a read-only view of the feature-flag data available to any authenticated user; it carries no write path. Use the superuser-gated `feature-flags` endpoint to change a flag.","summary":"List feature flags (read-only)","tags":["defectdojo_information"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FeatureFlag"}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/defectdojo_information/version/":{"get":{"operationId":"defectdojo_information_version_retrieve","tags":["defectdojo_information"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Version"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dependency/":{"get":{"operationId":"dependency_list","description":"A simple ViewSet for viewing and editing Dependencies.","parameters":[{"in":"query","name":"file_path_contains","schema":{"type":"string"},"description":"File Path: Contains"},{"in":"query","name":"file_path_ends_with","schema":{"type":"string"},"description":"File Path: Ends With"},{"in":"query","name":"file_path_exact","schema":{"type":"string"},"description":"File Path: Exact Match"},{"in":"query","name":"file_path_includes","schema":{"type":"array","items":{"type":"string"}},"description":"File Path: Included in List","explode":false,"style":"form"},{"in":"query","name":"file_path_not_contains","schema":{"type":"string"},"description":"File Path: Not Contains"},{"in":"query","name":"file_path_not_exact","schema":{"type":"string"},"description":"File Path: Not Exact Match"},{"in":"query","name":"file_path_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"File Path: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"file_path_starts_with","schema":{"type":"string"},"description":"File Path: Starts With"},{"in":"query","name":"id_equals","schema":{"type":"integer"},"description":"ID: Equals"},{"in":"query","name":"id_greater_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Greater Than or Equal To"},{"in":"query","name":"id_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"id_less_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Less Than or Equal To"},{"in":"query","name":"id_not_equals","schema":{"type":"integer"},"description":"ID: Not Equals"},{"in":"query","name":"id_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"license_expression_contains","schema":{"type":"string"},"description":"License Expression: Contains"},{"in":"query","name":"license_expression_ends_with","schema":{"type":"string"},"description":"License Expression: Ends With"},{"in":"query","name":"license_expression_exact","schema":{"type":"string"},"description":"License Expression: Exact Match"},{"in":"query","name":"license_expression_includes","schema":{"type":"array","items":{"type":"string"}},"description":"License Expression: Included in List","explode":false,"style":"form"},{"in":"query","name":"license_expression_not_contains","schema":{"type":"string"},"description":"License Expression: Not Contains"},{"in":"query","name":"license_expression_not_exact","schema":{"type":"string"},"description":"License Expression: Not Exact Match"},{"in":"query","name":"license_expression_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"License Expression: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"license_expression_starts_with","schema":{"type":"string"},"description":"License Expression: Starts With"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location__created_at_contains","schema":{"type":"string"},"description":"Created At: Contains"},{"in":"query","name":"location__created_at_ends_with","schema":{"type":"string"},"description":"Created At: Ends With"},{"in":"query","name":"location__created_at_exact","schema":{"type":"string"},"description":"Created At: Exact Match"},{"in":"query","name":"location__created_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_not_contains","schema":{"type":"string"},"description":"Created At: Not Contains"},{"in":"query","name":"location__created_at_not_exact","schema":{"type":"string"},"description":"Created At: Not Exact Match"},{"in":"query","name":"location__created_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_starts_with","schema":{"type":"string"},"description":"Created At: Starts With"},{"in":"query","name":"location__findings__finding_equals","schema":{"type":"integer"},"description":"Finding ID: Equals"},{"in":"query","name":"location__findings__finding_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Greater Than or Equal To"},{"in":"query","name":"location__findings__finding_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__findings__finding_less_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Less Than or Equal To"},{"in":"query","name":"location__findings__finding_not_equals","schema":{"type":"integer"},"description":"Finding ID: Not Equals"},{"in":"query","name":"location__findings__finding_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_equals","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"location__products__product_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Greater Than or Equal To"},{"in":"query","name":"location__products__product_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_less_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Less Than or Equal To"},{"in":"query","name":"location__products__product_not_equals","schema":{"type":"integer"},"description":"Product ID: Not Equals"},{"in":"query","name":"location__products__product_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_contains","schema":{"type":"string"},"description":"Tags: Contains"},{"in":"query","name":"location__tags__name_ends_with","schema":{"type":"string"},"description":"Tags: Ends With"},{"in":"query","name":"location__tags__name_exact","schema":{"type":"string"},"description":"Tags: Exact Match"},{"in":"query","name":"location__tags__name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_not_contains","schema":{"type":"string"},"description":"Tags: Not Contains"},{"in":"query","name":"location__tags__name_not_exact","schema":{"type":"string"},"description":"Tags: Not Exact Match"},{"in":"query","name":"location__tags__name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_starts_with","schema":{"type":"string"},"description":"Tags: Starts With"},{"in":"query","name":"location__updated_at_contains","schema":{"type":"string"},"description":"Updated At: Contains"},{"in":"query","name":"location__updated_at_ends_with","schema":{"type":"string"},"description":"Updated At: Ends With"},{"in":"query","name":"location__updated_at_exact","schema":{"type":"string"},"description":"Updated At: Exact Match"},{"in":"query","name":"location__updated_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_not_contains","schema":{"type":"string"},"description":"Updated At: Not Contains"},{"in":"query","name":"location__updated_at_not_exact","schema":{"type":"string"},"description":"Updated At: Not Exact Match"},{"in":"query","name":"location__updated_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_starts_with","schema":{"type":"string"},"description":"Updated At: Starts With"},{"in":"query","name":"name_contains","schema":{"type":"string"},"description":"Name: Contains"},{"in":"query","name":"name_ends_with","schema":{"type":"string"},"description":"Name: Ends With"},{"in":"query","name":"name_exact","schema":{"type":"string"},"description":"Name: Exact Match"},{"in":"query","name":"name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Name: Included in List","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"},"description":"Name: Not Contains"},{"in":"query","name":"name_not_exact","schema":{"type":"string"},"description":"Name: Not Exact Match"},{"in":"query","name":"name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Name: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"name_starts_with","schema":{"type":"string"},"description":"Name: Starts With"},{"in":"query","name":"namespace_contains","schema":{"type":"string"},"description":"Namespace: Contains"},{"in":"query","name":"namespace_ends_with","schema":{"type":"string"},"description":"Namespace: Ends With"},{"in":"query","name":"namespace_exact","schema":{"type":"string"},"description":"Namespace: Exact Match"},{"in":"query","name":"namespace_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Namespace: Included in List","explode":false,"style":"form"},{"in":"query","name":"namespace_not_contains","schema":{"type":"string"},"description":"Namespace: Not Contains"},{"in":"query","name":"namespace_not_exact","schema":{"type":"string"},"description":"Namespace: Not Exact Match"},{"in":"query","name":"namespace_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Namespace: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"namespace_starts_with","schema":{"type":"string"},"description":"Namespace: Starts With"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"array","items":{"type":"string","enum":["-created","-file_path","-id","-license_expression","-name","-namespace","-purl_type","-updated","-version","created","file_path","id","license_expression","name","namespace","purl_type","updated","version"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `purl_type` - Purl type\n* `-purl_type` - Purl type (descending)\n* `namespace` - Namespace\n* `-namespace` - Namespace (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `file_path` - File path\n* `-file_path` - File path (descending)\n* `license_expression` - License expression\n* `-license_expression` - License expression (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"in":"query","name":"product","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"purl_type_contains","schema":{"type":"string"},"description":"Package Type: Contains"},{"in":"query","name":"purl_type_ends_with","schema":{"type":"string"},"description":"Package Type: Ends With"},{"in":"query","name":"purl_type_exact","schema":{"type":"string"},"description":"Package Type: Exact Match"},{"in":"query","name":"purl_type_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Package Type: Included in List","explode":false,"style":"form"},{"in":"query","name":"purl_type_not_contains","schema":{"type":"string"},"description":"Package Type: Not Contains"},{"in":"query","name":"purl_type_not_exact","schema":{"type":"string"},"description":"Package Type: Not Exact Match"},{"in":"query","name":"purl_type_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Package Type: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"purl_type_starts_with","schema":{"type":"string"},"description":"Package Type: Starts With"},{"in":"query","name":"version_contains","schema":{"type":"string"},"description":"Version: Contains"},{"in":"query","name":"version_ends_with","schema":{"type":"string"},"description":"Version: Ends With"},{"in":"query","name":"version_exact","schema":{"type":"string"},"description":"Version: Exact Match"},{"in":"query","name":"version_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Version: Included in List","explode":false,"style":"form"},{"in":"query","name":"version_not_contains","schema":{"type":"string"},"description":"Version: Not Contains"},{"in":"query","name":"version_not_exact","schema":{"type":"string"},"description":"Version: Not Exact Match"},{"in":"query","name":"version_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Version: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"version_starts_with","schema":{"type":"string"},"description":"Version: Starts With"}],"tags":["dependency"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDependencyList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"dependency_create","description":"A simple ViewSet for viewing and editing Dependencies.","tags":["dependency"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DependencyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DependencyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DependencyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dependency"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dependency/{id}/":{"get":{"operationId":"dependency_retrieve","description":"A simple ViewSet for viewing and editing Dependencies.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dependency.","required":true}],"tags":["dependency"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dependency"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"dependency_update","description":"A simple ViewSet for viewing and editing Dependencies.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dependency.","required":true}],"tags":["dependency"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DependencyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DependencyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DependencyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dependency"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"dependency_partial_update","description":"A simple ViewSet for viewing and editing Dependencies.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dependency.","required":true}],"tags":["dependency"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedDependencyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedDependencyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedDependencyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Dependency"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"dependency_destroy","description":"A simple ViewSet for viewing and editing Dependencies.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dependency.","required":true}],"tags":["dependency"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dependency/{id}/history/":{"get":{"operationId":"dependency_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"file_path_contains","schema":{"type":"string"},"description":"File Path: Contains"},{"in":"query","name":"file_path_ends_with","schema":{"type":"string"},"description":"File Path: Ends With"},{"in":"query","name":"file_path_exact","schema":{"type":"string"},"description":"File Path: Exact Match"},{"in":"query","name":"file_path_includes","schema":{"type":"array","items":{"type":"string"}},"description":"File Path: Included in List","explode":false,"style":"form"},{"in":"query","name":"file_path_not_contains","schema":{"type":"string"},"description":"File Path: Not Contains"},{"in":"query","name":"file_path_not_exact","schema":{"type":"string"},"description":"File Path: Not Exact Match"},{"in":"query","name":"file_path_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"File Path: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"file_path_starts_with","schema":{"type":"string"},"description":"File Path: Starts With"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dependency.","required":true},{"in":"query","name":"id_equals","schema":{"type":"integer"},"description":"ID: Equals"},{"in":"query","name":"id_greater_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Greater Than or Equal To"},{"in":"query","name":"id_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"id_less_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Less Than or Equal To"},{"in":"query","name":"id_not_equals","schema":{"type":"integer"},"description":"ID: Not Equals"},{"in":"query","name":"id_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"license_expression_contains","schema":{"type":"string"},"description":"License Expression: Contains"},{"in":"query","name":"license_expression_ends_with","schema":{"type":"string"},"description":"License Expression: Ends With"},{"in":"query","name":"license_expression_exact","schema":{"type":"string"},"description":"License Expression: Exact Match"},{"in":"query","name":"license_expression_includes","schema":{"type":"array","items":{"type":"string"}},"description":"License Expression: Included in List","explode":false,"style":"form"},{"in":"query","name":"license_expression_not_contains","schema":{"type":"string"},"description":"License Expression: Not Contains"},{"in":"query","name":"license_expression_not_exact","schema":{"type":"string"},"description":"License Expression: Not Exact Match"},{"in":"query","name":"license_expression_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"License Expression: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"license_expression_starts_with","schema":{"type":"string"},"description":"License Expression: Starts With"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location__created_at_contains","schema":{"type":"string"},"description":"Created At: Contains"},{"in":"query","name":"location__created_at_ends_with","schema":{"type":"string"},"description":"Created At: Ends With"},{"in":"query","name":"location__created_at_exact","schema":{"type":"string"},"description":"Created At: Exact Match"},{"in":"query","name":"location__created_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_not_contains","schema":{"type":"string"},"description":"Created At: Not Contains"},{"in":"query","name":"location__created_at_not_exact","schema":{"type":"string"},"description":"Created At: Not Exact Match"},{"in":"query","name":"location__created_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_starts_with","schema":{"type":"string"},"description":"Created At: Starts With"},{"in":"query","name":"location__findings__finding_equals","schema":{"type":"integer"},"description":"Finding ID: Equals"},{"in":"query","name":"location__findings__finding_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Greater Than or Equal To"},{"in":"query","name":"location__findings__finding_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__findings__finding_less_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Less Than or Equal To"},{"in":"query","name":"location__findings__finding_not_equals","schema":{"type":"integer"},"description":"Finding ID: Not Equals"},{"in":"query","name":"location__findings__finding_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_equals","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"location__products__product_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Greater Than or Equal To"},{"in":"query","name":"location__products__product_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_less_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Less Than or Equal To"},{"in":"query","name":"location__products__product_not_equals","schema":{"type":"integer"},"description":"Product ID: Not Equals"},{"in":"query","name":"location__products__product_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_contains","schema":{"type":"string"},"description":"Tags: Contains"},{"in":"query","name":"location__tags__name_ends_with","schema":{"type":"string"},"description":"Tags: Ends With"},{"in":"query","name":"location__tags__name_exact","schema":{"type":"string"},"description":"Tags: Exact Match"},{"in":"query","name":"location__tags__name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_not_contains","schema":{"type":"string"},"description":"Tags: Not Contains"},{"in":"query","name":"location__tags__name_not_exact","schema":{"type":"string"},"description":"Tags: Not Exact Match"},{"in":"query","name":"location__tags__name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_starts_with","schema":{"type":"string"},"description":"Tags: Starts With"},{"in":"query","name":"location__updated_at_contains","schema":{"type":"string"},"description":"Updated At: Contains"},{"in":"query","name":"location__updated_at_ends_with","schema":{"type":"string"},"description":"Updated At: Ends With"},{"in":"query","name":"location__updated_at_exact","schema":{"type":"string"},"description":"Updated At: Exact Match"},{"in":"query","name":"location__updated_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_not_contains","schema":{"type":"string"},"description":"Updated At: Not Contains"},{"in":"query","name":"location__updated_at_not_exact","schema":{"type":"string"},"description":"Updated At: Not Exact Match"},{"in":"query","name":"location__updated_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_starts_with","schema":{"type":"string"},"description":"Updated At: Starts With"},{"in":"query","name":"name_contains","schema":{"type":"string"},"description":"Name: Contains"},{"in":"query","name":"name_ends_with","schema":{"type":"string"},"description":"Name: Ends With"},{"in":"query","name":"name_exact","schema":{"type":"string"},"description":"Name: Exact Match"},{"in":"query","name":"name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Name: Included in List","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"},"description":"Name: Not Contains"},{"in":"query","name":"name_not_exact","schema":{"type":"string"},"description":"Name: Not Exact Match"},{"in":"query","name":"name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Name: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"name_starts_with","schema":{"type":"string"},"description":"Name: Starts With"},{"in":"query","name":"namespace_contains","schema":{"type":"string"},"description":"Namespace: Contains"},{"in":"query","name":"namespace_ends_with","schema":{"type":"string"},"description":"Namespace: Ends With"},{"in":"query","name":"namespace_exact","schema":{"type":"string"},"description":"Namespace: Exact Match"},{"in":"query","name":"namespace_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Namespace: Included in List","explode":false,"style":"form"},{"in":"query","name":"namespace_not_contains","schema":{"type":"string"},"description":"Namespace: Not Contains"},{"in":"query","name":"namespace_not_exact","schema":{"type":"string"},"description":"Namespace: Not Exact Match"},{"in":"query","name":"namespace_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Namespace: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"namespace_starts_with","schema":{"type":"string"},"description":"Namespace: Starts With"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"array","items":{"type":"string","enum":["-created","-file_path","-id","-license_expression","-name","-namespace","-purl_type","-updated","-version","created","file_path","id","license_expression","name","namespace","purl_type","updated","version"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `purl_type` - Purl type\n* `-purl_type` - Purl type (descending)\n* `namespace` - Namespace\n* `-namespace` - Namespace (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `file_path` - File path\n* `-file_path` - File path (descending)\n* `license_expression` - License expression\n* `-license_expression` - License expression (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"in":"query","name":"product","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"purl_type_contains","schema":{"type":"string"},"description":"Package Type: Contains"},{"in":"query","name":"purl_type_ends_with","schema":{"type":"string"},"description":"Package Type: Ends With"},{"in":"query","name":"purl_type_exact","schema":{"type":"string"},"description":"Package Type: Exact Match"},{"in":"query","name":"purl_type_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Package Type: Included in List","explode":false,"style":"form"},{"in":"query","name":"purl_type_not_contains","schema":{"type":"string"},"description":"Package Type: Not Contains"},{"in":"query","name":"purl_type_not_exact","schema":{"type":"string"},"description":"Package Type: Not Exact Match"},{"in":"query","name":"purl_type_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Package Type: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"purl_type_starts_with","schema":{"type":"string"},"description":"Package Type: Starts With"},{"in":"query","name":"version_contains","schema":{"type":"string"},"description":"Version: Contains"},{"in":"query","name":"version_ends_with","schema":{"type":"string"},"description":"Version: Ends With"},{"in":"query","name":"version_exact","schema":{"type":"string"},"description":"Version: Exact Match"},{"in":"query","name":"version_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Version: Included in List","explode":false,"style":"form"},{"in":"query","name":"version_not_contains","schema":{"type":"string"},"description":"Version: Not Contains"},{"in":"query","name":"version_not_exact","schema":{"type":"string"},"description":"Version: Not Exact Match"},{"in":"query","name":"version_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Version: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"version_starts_with","schema":{"type":"string"},"description":"Version: Starts With"}],"tags":["dependency"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dependency/{id}/history/legacy/":{"get":{"operationId":"dependency_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"file_path_contains","schema":{"type":"string"},"description":"File Path: Contains"},{"in":"query","name":"file_path_ends_with","schema":{"type":"string"},"description":"File Path: Ends With"},{"in":"query","name":"file_path_exact","schema":{"type":"string"},"description":"File Path: Exact Match"},{"in":"query","name":"file_path_includes","schema":{"type":"array","items":{"type":"string"}},"description":"File Path: Included in List","explode":false,"style":"form"},{"in":"query","name":"file_path_not_contains","schema":{"type":"string"},"description":"File Path: Not Contains"},{"in":"query","name":"file_path_not_exact","schema":{"type":"string"},"description":"File Path: Not Exact Match"},{"in":"query","name":"file_path_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"File Path: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"file_path_starts_with","schema":{"type":"string"},"description":"File Path: Starts With"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dependency.","required":true},{"in":"query","name":"id_equals","schema":{"type":"integer"},"description":"ID: Equals"},{"in":"query","name":"id_greater_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Greater Than or Equal To"},{"in":"query","name":"id_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"id_less_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Less Than or Equal To"},{"in":"query","name":"id_not_equals","schema":{"type":"integer"},"description":"ID: Not Equals"},{"in":"query","name":"id_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"license_expression_contains","schema":{"type":"string"},"description":"License Expression: Contains"},{"in":"query","name":"license_expression_ends_with","schema":{"type":"string"},"description":"License Expression: Ends With"},{"in":"query","name":"license_expression_exact","schema":{"type":"string"},"description":"License Expression: Exact Match"},{"in":"query","name":"license_expression_includes","schema":{"type":"array","items":{"type":"string"}},"description":"License Expression: Included in List","explode":false,"style":"form"},{"in":"query","name":"license_expression_not_contains","schema":{"type":"string"},"description":"License Expression: Not Contains"},{"in":"query","name":"license_expression_not_exact","schema":{"type":"string"},"description":"License Expression: Not Exact Match"},{"in":"query","name":"license_expression_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"License Expression: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"license_expression_starts_with","schema":{"type":"string"},"description":"License Expression: Starts With"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location__created_at_contains","schema":{"type":"string"},"description":"Created At: Contains"},{"in":"query","name":"location__created_at_ends_with","schema":{"type":"string"},"description":"Created At: Ends With"},{"in":"query","name":"location__created_at_exact","schema":{"type":"string"},"description":"Created At: Exact Match"},{"in":"query","name":"location__created_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_not_contains","schema":{"type":"string"},"description":"Created At: Not Contains"},{"in":"query","name":"location__created_at_not_exact","schema":{"type":"string"},"description":"Created At: Not Exact Match"},{"in":"query","name":"location__created_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_starts_with","schema":{"type":"string"},"description":"Created At: Starts With"},{"in":"query","name":"location__findings__finding_equals","schema":{"type":"integer"},"description":"Finding ID: Equals"},{"in":"query","name":"location__findings__finding_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Greater Than or Equal To"},{"in":"query","name":"location__findings__finding_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__findings__finding_less_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Less Than or Equal To"},{"in":"query","name":"location__findings__finding_not_equals","schema":{"type":"integer"},"description":"Finding ID: Not Equals"},{"in":"query","name":"location__findings__finding_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_equals","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"location__products__product_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Greater Than or Equal To"},{"in":"query","name":"location__products__product_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_less_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Less Than or Equal To"},{"in":"query","name":"location__products__product_not_equals","schema":{"type":"integer"},"description":"Product ID: Not Equals"},{"in":"query","name":"location__products__product_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_contains","schema":{"type":"string"},"description":"Tags: Contains"},{"in":"query","name":"location__tags__name_ends_with","schema":{"type":"string"},"description":"Tags: Ends With"},{"in":"query","name":"location__tags__name_exact","schema":{"type":"string"},"description":"Tags: Exact Match"},{"in":"query","name":"location__tags__name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_not_contains","schema":{"type":"string"},"description":"Tags: Not Contains"},{"in":"query","name":"location__tags__name_not_exact","schema":{"type":"string"},"description":"Tags: Not Exact Match"},{"in":"query","name":"location__tags__name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_starts_with","schema":{"type":"string"},"description":"Tags: Starts With"},{"in":"query","name":"location__updated_at_contains","schema":{"type":"string"},"description":"Updated At: Contains"},{"in":"query","name":"location__updated_at_ends_with","schema":{"type":"string"},"description":"Updated At: Ends With"},{"in":"query","name":"location__updated_at_exact","schema":{"type":"string"},"description":"Updated At: Exact Match"},{"in":"query","name":"location__updated_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_not_contains","schema":{"type":"string"},"description":"Updated At: Not Contains"},{"in":"query","name":"location__updated_at_not_exact","schema":{"type":"string"},"description":"Updated At: Not Exact Match"},{"in":"query","name":"location__updated_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_starts_with","schema":{"type":"string"},"description":"Updated At: Starts With"},{"in":"query","name":"name_contains","schema":{"type":"string"},"description":"Name: Contains"},{"in":"query","name":"name_ends_with","schema":{"type":"string"},"description":"Name: Ends With"},{"in":"query","name":"name_exact","schema":{"type":"string"},"description":"Name: Exact Match"},{"in":"query","name":"name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Name: Included in List","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"},"description":"Name: Not Contains"},{"in":"query","name":"name_not_exact","schema":{"type":"string"},"description":"Name: Not Exact Match"},{"in":"query","name":"name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Name: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"name_starts_with","schema":{"type":"string"},"description":"Name: Starts With"},{"in":"query","name":"namespace_contains","schema":{"type":"string"},"description":"Namespace: Contains"},{"in":"query","name":"namespace_ends_with","schema":{"type":"string"},"description":"Namespace: Ends With"},{"in":"query","name":"namespace_exact","schema":{"type":"string"},"description":"Namespace: Exact Match"},{"in":"query","name":"namespace_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Namespace: Included in List","explode":false,"style":"form"},{"in":"query","name":"namespace_not_contains","schema":{"type":"string"},"description":"Namespace: Not Contains"},{"in":"query","name":"namespace_not_exact","schema":{"type":"string"},"description":"Namespace: Not Exact Match"},{"in":"query","name":"namespace_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Namespace: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"namespace_starts_with","schema":{"type":"string"},"description":"Namespace: Starts With"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"array","items":{"type":"string","enum":["-created","-file_path","-id","-license_expression","-name","-namespace","-purl_type","-updated","-version","created","file_path","id","license_expression","name","namespace","purl_type","updated","version"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `purl_type` - Purl type\n* `-purl_type` - Purl type (descending)\n* `namespace` - Namespace\n* `-namespace` - Namespace (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `file_path` - File path\n* `-file_path` - File path (descending)\n* `license_expression` - License expression\n* `-license_expression` - License expression (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"in":"query","name":"product","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"purl_type_contains","schema":{"type":"string"},"description":"Package Type: Contains"},{"in":"query","name":"purl_type_ends_with","schema":{"type":"string"},"description":"Package Type: Ends With"},{"in":"query","name":"purl_type_exact","schema":{"type":"string"},"description":"Package Type: Exact Match"},{"in":"query","name":"purl_type_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Package Type: Included in List","explode":false,"style":"form"},{"in":"query","name":"purl_type_not_contains","schema":{"type":"string"},"description":"Package Type: Not Contains"},{"in":"query","name":"purl_type_not_exact","schema":{"type":"string"},"description":"Package Type: Not Exact Match"},{"in":"query","name":"purl_type_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Package Type: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"purl_type_starts_with","schema":{"type":"string"},"description":"Package Type: Starts With"},{"in":"query","name":"version_contains","schema":{"type":"string"},"description":"Version: Contains"},{"in":"query","name":"version_ends_with","schema":{"type":"string"},"description":"Version: Ends With"},{"in":"query","name":"version_exact","schema":{"type":"string"},"description":"Version: Exact Match"},{"in":"query","name":"version_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Version: Included in List","explode":false,"style":"form"},{"in":"query","name":"version_not_contains","schema":{"type":"string"},"description":"Version: Not Contains"},{"in":"query","name":"version_not_exact","schema":{"type":"string"},"description":"Version: Not Exact Match"},{"in":"query","name":"version_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Version: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"version_starts_with","schema":{"type":"string"},"description":"Version: Starts With"}],"tags":["dependency"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dependency/{id}/history/legacy/count/":{"get":{"operationId":"dependency_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dependency.","required":true}],"tags":["dependency"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/development_environments/":{"get":{"operationId":"development_environments_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["development_environments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDevelopmentEnvironmentList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"development_environments_create","tags":["development_environments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentEnvironmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DevelopmentEnvironmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DevelopmentEnvironmentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentEnvironment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/development_environments/{id}/":{"get":{"operationId":"development_environments_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this development_ environment.","required":true}],"tags":["development_environments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentEnvironment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"development_environments_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this development_ environment.","required":true}],"tags":["development_environments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentEnvironmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DevelopmentEnvironmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DevelopmentEnvironmentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentEnvironment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"development_environments_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this development_ environment.","required":true}],"tags":["development_environments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedDevelopmentEnvironmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedDevelopmentEnvironmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedDevelopmentEnvironmentRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DevelopmentEnvironment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"development_environments_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this development_ environment.","required":true}],"tags":["development_environments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/development_environments/{id}/delete_preview/":{"get":{"operationId":"development_environments_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this development_ environment.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["development_environments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/diagnostic_events/":{"get":{"operationId":"diagnostic_events_list","description":"Every integration failure in one place: connectors, downstream integrators,\nJira, SSO/SAML/LDAP, imports, rules, scheduling and Sensei.","parameters":[{"in":"query","name":"actor_equals","schema":{"type":"integer"}},{"in":"query","name":"actor_greater_than","schema":{"type":"integer"}},{"in":"query","name":"actor_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"actor_in","schema":{"type":"array","items":{"type":"number"}},"description":"Filter by the triggering user's ID. Comma-separated for multiple.","explode":false,"style":"form"},{"in":"query","name":"actor_label_contains","schema":{"type":"string"}},{"in":"query","name":"actor_label_ends_with","schema":{"type":"string"}},{"in":"query","name":"actor_label_exact","schema":{"type":"string"}},{"in":"query","name":"actor_label_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"actor_label_not_contains","schema":{"type":"string"}},{"in":"query","name":"actor_label_not_exact","schema":{"type":"string"}},{"in":"query","name":"actor_label_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"actor_label_not_regex","schema":{"type":"string"}},{"in":"query","name":"actor_label_regex","schema":{"type":"string"}},{"in":"query","name":"actor_label_starts_with","schema":{"type":"string"}},{"in":"query","name":"actor_less_than","schema":{"type":"integer"}},{"in":"query","name":"actor_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"actor_not_equals","schema":{"type":"integer"}},{"in":"query","name":"actor_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"config_label_contains","schema":{"type":"string"}},{"in":"query","name":"config_label_ends_with","schema":{"type":"string"}},{"in":"query","name":"config_label_exact","schema":{"type":"string"}},{"in":"query","name":"config_label_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"config_label_not_contains","schema":{"type":"string"}},{"in":"query","name":"config_label_not_exact","schema":{"type":"string"}},{"in":"query","name":"config_label_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"config_label_not_regex","schema":{"type":"string"}},{"in":"query","name":"config_label_regex","schema":{"type":"string"}},{"in":"query","name":"config_label_starts_with","schema":{"type":"string"}},{"in":"query","name":"correlation_id_contains","schema":{"type":"string"}},{"in":"query","name":"correlation_id_ends_with","schema":{"type":"string"}},{"in":"query","name":"correlation_id_exact","schema":{"type":"string"}},{"in":"query","name":"correlation_id_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"correlation_id_not_contains","schema":{"type":"string"}},{"in":"query","name":"correlation_id_not_exact","schema":{"type":"string"}},{"in":"query","name":"correlation_id_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"correlation_id_not_regex","schema":{"type":"string"}},{"in":"query","name":"correlation_id_regex","schema":{"type":"string"}},{"in":"query","name":"correlation_id_starts_with","schema":{"type":"string"}},{"in":"query","name":"created_at_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at_during","schema":{"type":"string"}},{"in":"query","name":"created_at_on","schema":{"type":"string"}},{"in":"query","name":"created_at_past_days","schema":{"type":"number"}},{"in":"query","name":"duration_ms_equals","schema":{"type":"integer"}},{"in":"query","name":"duration_ms_greater_than","schema":{"type":"integer"}},{"in":"query","name":"duration_ms_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"duration_ms_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"duration_ms_less_than","schema":{"type":"integer"}},{"in":"query","name":"duration_ms_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"duration_ms_not_equals","schema":{"type":"integer"}},{"in":"query","name":"duration_ms_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"external_reference_contains","schema":{"type":"string"}},{"in":"query","name":"external_reference_ends_with","schema":{"type":"string"}},{"in":"query","name":"external_reference_exact","schema":{"type":"string"}},{"in":"query","name":"external_reference_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"external_reference_not_contains","schema":{"type":"string"}},{"in":"query","name":"external_reference_not_exact","schema":{"type":"string"}},{"in":"query","name":"external_reference_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"external_reference_not_regex","schema":{"type":"string"}},{"in":"query","name":"external_reference_regex","schema":{"type":"string"}},{"in":"query","name":"external_reference_starts_with","schema":{"type":"string"}},{"in":"query","name":"failures_only","schema":{"type":"boolean"},"description":"When true, return only events that failed or timed out."},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-actor_label","-config_label","-correlation_id","-created_at","-duration_ms","-external_reference","-finished_at","-object_label","-operation","-product_name","-provider","-severity","-source","-started_at","-status","-summary","-trigger","actor_label","config_label","correlation_id","created_at","duration_ms","external_reference","finished_at","object_label","operation","product_name","provider","severity","source","started_at","status","summary","trigger"]}},"description":"Ordering\n\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `started_at` - Started at\n* `-started_at` - Started at (descending)\n* `finished_at` - Finished at\n* `-finished_at` - Finished at (descending)\n* `source` - Source\n* `-source` - Source (descending)\n* `provider` - Provider\n* `-provider` - Provider (descending)\n* `operation` - Operation\n* `-operation` - Operation (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `severity` - Severity\n* `-severity` - Severity (descending)\n* `trigger` - Trigger\n* `-trigger` - Trigger (descending)\n* `summary` - Summary\n* `-summary` - Summary (descending)\n* `actor_label` - Actor label\n* `-actor_label` - Actor label (descending)\n* `config_label` - Config label\n* `-config_label` - Config label (descending)\n* `object_label` - Object label\n* `-object_label` - Object label (descending)\n* `external_reference` - External reference\n* `-external_reference` - External reference (descending)\n* `correlation_id` - Correlation id\n* `-correlation_id` - Correlation id (descending)\n* `duration_ms` - Duration ms\n* `-duration_ms` - Duration ms (descending)\n* `product_name` - Product name\n* `-product_name` - Product name (descending)","explode":false,"style":"form"},{"in":"query","name":"object_id_equals","schema":{"type":"integer"}},{"in":"query","name":"object_id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"object_id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"object_id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"object_id_less_than","schema":{"type":"integer"}},{"in":"query","name":"object_id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"object_id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"object_id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"object_label_contains","schema":{"type":"string"}},{"in":"query","name":"object_label_ends_with","schema":{"type":"string"}},{"in":"query","name":"object_label_exact","schema":{"type":"string"}},{"in":"query","name":"object_label_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"object_label_not_contains","schema":{"type":"string"}},{"in":"query","name":"object_label_not_exact","schema":{"type":"string"}},{"in":"query","name":"object_label_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"object_label_not_regex","schema":{"type":"string"}},{"in":"query","name":"object_label_regex","schema":{"type":"string"}},{"in":"query","name":"object_label_starts_with","schema":{"type":"string"}},{"in":"query","name":"object_model","schema":{"type":"string"},"description":"Dotted model label of the related object, e.g. `dojo.Finding`."},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"operation_contains","schema":{"type":"string"}},{"in":"query","name":"operation_ends_with","schema":{"type":"string"}},{"in":"query","name":"operation_exact","schema":{"type":"string"}},{"in":"query","name":"operation_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"operation_not_contains","schema":{"type":"string"}},{"in":"query","name":"operation_not_exact","schema":{"type":"string"}},{"in":"query","name":"operation_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"operation_not_regex","schema":{"type":"string"}},{"in":"query","name":"operation_regex","schema":{"type":"string"}},{"in":"query","name":"operation_starts_with","schema":{"type":"string"}},{"in":"query","name":"product_equals","schema":{"type":"integer"}},{"in":"query","name":"product_greater_than","schema":{"type":"integer"}},{"in":"query","name":"product_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"product_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_less_than","schema":{"type":"integer"}},{"in":"query","name":"product_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"product_name_contains","schema":{"type":"string"}},{"in":"query","name":"product_name_ends_with","schema":{"type":"string"}},{"in":"query","name":"product_name_exact","schema":{"type":"string"}},{"in":"query","name":"product_name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_name_not_contains","schema":{"type":"string"}},{"in":"query","name":"product_name_not_exact","schema":{"type":"string"}},{"in":"query","name":"product_name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_name_not_regex","schema":{"type":"string"}},{"in":"query","name":"product_name_regex","schema":{"type":"string"}},{"in":"query","name":"product_name_starts_with","schema":{"type":"string"}},{"in":"query","name":"product_not_equals","schema":{"type":"integer"}},{"in":"query","name":"product_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"provider_contains","schema":{"type":"string"}},{"in":"query","name":"provider_ends_with","schema":{"type":"string"}},{"in":"query","name":"provider_exact","schema":{"type":"string"}},{"in":"query","name":"provider_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"provider_not_contains","schema":{"type":"string"}},{"in":"query","name":"provider_not_exact","schema":{"type":"string"}},{"in":"query","name":"provider_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"provider_not_regex","schema":{"type":"string"}},{"in":"query","name":"provider_regex","schema":{"type":"string"}},{"in":"query","name":"provider_starts_with","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: summary, operation, provider, source, config_label, object_label, external_reference, actor_label, product__name"},{"in":"query","name":"severity","schema":{"type":"array","items":{"type":"string"}},"description":"Filter by severity. Comma-separated for multiple, e.g. `error,critical`.","explode":false,"style":"form"},{"in":"query","name":"severity_not","schema":{"type":"string"}},{"in":"query","name":"source","schema":{"type":"array","items":{"type":"string"}},"description":"Filter by source subsystem. Comma-separated for multiple, e.g. `jira,connector`.","explode":false,"style":"form"},{"in":"query","name":"source_is","schema":{"type":"string"},"description":"Exactly one source. Deliberately separate from `source`: this is the page's single-select quick filter (a chip), pinned on every request, while `source` is the multi-select column filter. One shared parameter would have them overwrite each other -- pinned params are re-applied after column filters on every fetch -- so separate names let both apply with each control still showing its own state."},{"in":"query","name":"source_not","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"array","items":{"type":"string"}},"description":"Filter by outcome. Comma-separated for multiple, e.g. `failed,timeout`.","explode":false,"style":"form"},{"in":"query","name":"status_not","schema":{"type":"string"}},{"in":"query","name":"summary_contains","schema":{"type":"string"}},{"in":"query","name":"summary_ends_with","schema":{"type":"string"}},{"in":"query","name":"summary_exact","schema":{"type":"string"}},{"in":"query","name":"summary_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"summary_not_contains","schema":{"type":"string"}},{"in":"query","name":"summary_not_exact","schema":{"type":"string"}},{"in":"query","name":"summary_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"summary_not_regex","schema":{"type":"string"}},{"in":"query","name":"summary_regex","schema":{"type":"string"}},{"in":"query","name":"summary_starts_with","schema":{"type":"string"}},{"in":"query","name":"timestamp_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"timestamp_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"timestamp_during","schema":{"type":"string"}},{"in":"query","name":"timestamp_on","schema":{"type":"string"}},{"in":"query","name":"timestamp_past_days","schema":{"type":"number"}},{"in":"query","name":"trigger","schema":{"type":"array","items":{"type":"string"}},"description":"Filter by what set the operation off. Comma-separated for multiple.","explode":false,"style":"form"},{"in":"query","name":"trigger_not","schema":{"type":"string"}},{"in":"query","name":"unresolved_only","schema":{"type":"boolean"},"description":"When true, return only events still marked running or queued -- the ones whose outcome was never recorded, which is what a process that died mid-operation leaves behind."}],"tags":["diagnostic_events"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDiagnosticEventList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/diagnostic_events/{id}/":{"get":{"operationId":"diagnostic_events_retrieve","description":"Every integration failure in one place: connectors, downstream integrators,\nJira, SSO/SAML/LDAP, imports, rules, scheduling and Sensei.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Diagnostic Event.","required":true}],"tags":["diagnostic_events"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiagnosticEvent"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/diagnostic_events/choices/":{"get":{"operationId":"diagnostic_events_choices_retrieve","description":"The enumerations and the providers actually present in this instance's ledger, so the filter controls offer real values instead of a hardcoded list that drifts as connectors and identity providers are added.","tags":["diagnostic_events"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiagnosticEvent"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/diagnostic_events/summary/":{"get":{"operationId":"diagnostic_events_summary_retrieve","description":"Counts over the requested window, honoring the same authorization scope and filters as the list endpoint. Drives the page's headline tiles.","tags":["diagnostic_events"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiagnosticEventSummary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dojo_group_members/":{"get":{"operationId":"dojo_group_members_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}},{"in":"query","name":"user","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"user_id","schema":{"type":"integer"}}],"tags":["dojo_group_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedDojoGroupMemberList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"dojo_group_members_create","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","tags":["dojo_group_members"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedDojoGroupMemberRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedDojoGroupMemberRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedDojoGroupMemberRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedDojoGroupMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dojo_group_members/{id}/":{"get":{"operationId":"dojo_group_members_retrieve","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group_ member.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["dojo_group_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedDojoGroupMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"dojo_group_members_update","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group_ member.","required":true}],"tags":["dojo_group_members"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedDojoGroupMemberRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedDojoGroupMemberRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedDojoGroupMemberRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedDojoGroupMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"dojo_group_members_destroy","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group_ member.","required":true}],"tags":["dojo_group_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dojo_group_members/{id}/delete_preview/":{"get":{"operationId":"dojo_group_members_delete_preview_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group_ member.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["dojo_group_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dojo_groups/":{"get":{"operationId":"dojo_groups_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"email","schema":{"type":"string"},"description":"Email"},{"in":"query","name":"email_contains","schema":{"type":"string"},"description":"Email Contains"},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["users"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"social_provider","schema":{"type":"string","x-spec-enum-id":"6fdea05504945238","nullable":true,"title":"Social Authentication Provider","enum":["AzureAD","OIDC","Remote","SCIM"]},"description":"Group imported from a social provider.\n\n* `AzureAD` - AzureAD\n* `Remote` - Remote\n* `OIDC` - OIDC\n* `SCIM` - SCIM"}],"tags":["dojo_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDojoGroupList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"dojo_groups_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["dojo_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DojoGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DojoGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DojoGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DojoGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dojo_groups/{id}/":{"get":{"operationId":"dojo_groups_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["users"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["dojo_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DojoGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"dojo_groups_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group.","required":true}],"tags":["dojo_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DojoGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DojoGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DojoGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DojoGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"dojo_groups_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group.","required":true}],"tags":["dojo_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedDojoGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedDojoGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedDojoGroupRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DojoGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"dojo_groups_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group.","required":true}],"tags":["dojo_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dojo_groups/{id}/delete_preview/":{"get":{"operationId":"dojo_groups_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["dojo_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dojo_groups/{id}/history/":{"get":{"operationId":"dojo_groups_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"email","schema":{"type":"string"},"description":"Email"},{"in":"query","name":"email_contains","schema":{"type":"string"},"description":"Email Contains"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"social_provider","schema":{"type":"string","x-spec-enum-id":"6fdea05504945238","nullable":true,"title":"Social Authentication Provider","enum":["AzureAD","OIDC","Remote","SCIM"]},"description":"Group imported from a social provider.\n\n* `AzureAD` - AzureAD\n* `Remote` - Remote\n* `OIDC` - OIDC\n* `SCIM` - SCIM"}],"tags":["dojo_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dojo_groups/{id}/history/legacy/":{"get":{"operationId":"dojo_groups_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"email","schema":{"type":"string"},"description":"Email"},{"in":"query","name":"email_contains","schema":{"type":"string"},"description":"Email Contains"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"social_provider","schema":{"type":"string","x-spec-enum-id":"6fdea05504945238","nullable":true,"title":"Social Authentication Provider","enum":["AzureAD","OIDC","Remote","SCIM"]},"description":"Group imported from a social provider.\n\n* `AzureAD` - AzureAD\n* `Remote` - Remote\n* `OIDC` - OIDC\n* `SCIM` - SCIM"}],"tags":["dojo_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/dojo_groups/{id}/history/legacy/count/":{"get":{"operationId":"dojo_groups_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ group.","required":true}],"tags":["dojo_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/endpoint_meta_import/":{"post":{"operationId":"endpoint_meta_import_create","description":"Imports a CSV file into a product to propagate arbitrary meta and tags on endpoints.\n\nBy Names:\n- Provide `product_name` of existing product\n\nBy ID:\n- Provide the id of the product in the `product` parameter\n\nIn this scenario Defect Dojo will look up the product by the provided details.","tags":["endpoint_meta_import"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EndpointMetaImporterRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointMetaImporter"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/endpoint_status/":{"get":{"operationId":"endpoint_status_list","parameters":[{"in":"query","name":"endpoint","schema":{"type":"integer"}},{"in":"query","name":"false_positive","schema":{"type":"boolean"}},{"in":"query","name":"finding","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"mitigated","schema":{"type":"boolean"}},{"in":"query","name":"mitigated_by","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"out_of_scope","schema":{"type":"boolean"}},{"in":"query","name":"risk_accepted","schema":{"type":"boolean"}}],"tags":["endpoint_status"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEndpointStatusList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"endpoint_status_create","tags":["endpoint_status"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointStatusRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EndpointStatusRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EndpointStatusRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointStatus"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/endpoint_status/{id}/":{"get":{"operationId":"endpoint_status_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this endpoint_ status.","required":true}],"tags":["endpoint_status"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointStatus"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"endpoint_status_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this endpoint_ status.","required":true}],"tags":["endpoint_status"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointStatusRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EndpointStatusRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EndpointStatusRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointStatus"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"endpoint_status_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this endpoint_ status.","required":true}],"tags":["endpoint_status"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedEndpointStatusRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedEndpointStatusRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedEndpointStatusRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointStatus"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"endpoint_status_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this endpoint_ status.","required":true}],"tags":["endpoint_status"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/endpoint_status/{id}/delete_preview/":{"get":{"operationId":"endpoint_status_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this endpoint_ status.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["endpoint_status"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/endpoints/":{"get":{"operationId":"endpoints_list","description":"Read-only ViewSet for LocationProductReferences that behaves similar to EndpointViewSet for reads.","parameters":[{"in":"query","name":"fragment","schema":{"type":"string"}},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"query","name":"host","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location_id","schema":{"type":"integer"}},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active_finding_count","-host","-id","-product","active_finding_count","host","id","product"]}},"description":"Ordering\n\n* `host` - Host\n* `-host` - Host (descending)\n* `product` - Product\n* `-product` - Product (descending)\n* `id` - Id\n* `-id` - Id (descending)\n* `active_finding_count` - Active Findings Count\n* `-active_finding_count` - Active Findings Count (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"path","schema":{"type":"string"}},{"in":"query","name":"port","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"protocol","schema":{"type":"string"}},{"in":"query","name":"query","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"userinfo","schema":{"type":"string"}}],"tags":["endpoints"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedV3EndpointCompatibleList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/endpoints/{id}/":{"get":{"operationId":"endpoints_retrieve","description":"Read-only ViewSet for LocationProductReferences that behaves similar to EndpointViewSet for reads.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - ProductReference.","required":true}],"tags":["endpoints"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V3EndpointCompatible"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/endpoints/{id}/generate_report/":{"post":{"operationId":"endpoints_generate_report_create","description":"Read-only ViewSet for LocationProductReferences that behaves similar to EndpointViewSet for reads.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - ProductReference.","required":true}],"tags":["endpoints"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagement_presets/":{"get":{"operationId":"engagement_presets_list","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["network_locations","product","test_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"title","schema":{"type":"string"}}],"tags":["engagement_presets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEngagementPresetsList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"engagement_presets_create","tags":["engagement_presets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementPresetsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EngagementPresetsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EngagementPresetsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementPresets"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagement_presets/{id}/":{"get":{"operationId":"engagement_presets_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement_ presets.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["network_locations","product","test_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["engagement_presets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementPresets"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"engagement_presets_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement_ presets.","required":true}],"tags":["engagement_presets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementPresetsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EngagementPresetsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EngagementPresetsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementPresets"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"engagement_presets_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement_ presets.","required":true}],"tags":["engagement_presets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedEngagementPresetsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedEngagementPresetsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedEngagementPresetsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementPresets"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"engagement_presets_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement_ presets.","required":true}],"tags":["engagement_presets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagement_presets/{id}/delete_preview/":{"get":{"operationId":"engagement_presets_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement_ presets.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["engagement_presets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/":{"get":{"operationId":"engagements_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"api_test","schema":{"type":"boolean"}},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"not_product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-lead","-name","-status","-target_end","-target_start","-updated","-version","created","lead","name","status","target_end","target_start","updated","version"]}},"description":"Ordering\n\n* `name` - Engagement Name\n* `-name` - Engagement Name (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `target_start` - Target start\n* `-target_start` - Target start (descending)\n* `target_end` - Target end\n* `-target_end` - Target end (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `lead` - Lead\n* `-lead` - Lead (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"pen_test","schema":{"type":"boolean"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["files","lead","notes","product","risk_acceptance"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"product__prod_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on Asset (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"product__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on Asset","explode":false,"style":"form"},{"in":"query","name":"report_type","schema":{"type":"integer"}},{"in":"query","name":"requester","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"ff79738e944f9d44","nullable":true,"enum":["Blocked","Cancelled","Completed","In Progress","Not Started","On Hold","Scheduled","Waiting for Resource"]},"description":"* `Not Started` - Not Started\n* `Blocked` - Blocked\n* `Cancelled` - Cancelled\n* `Completed` - Completed\n* `In Progress` - In Progress\n* `On Hold` - On Hold\n* `Scheduled` - Scheduled\n* `Waiting for Resource` - Waiting for Resource"},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"target_end","schema":{"type":"string","format":"date"}},{"in":"query","name":"target_start","schema":{"type":"string","format":"date"}},{"in":"query","name":"threat_model","schema":{"type":"boolean"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"version","schema":{"type":"string"}}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedEngagementList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"engagements_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["engagements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedEngagementRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedEngagementRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedEngagementRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedEngagement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/":{"get":{"operationId":"engagements_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["files","lead","notes","product","risk_acceptance"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedEngagement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"engagements_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedEngagementRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedEngagementRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedEngagementRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedEngagement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"engagements_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedEngagementRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedEngagementRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedEngagementRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedEngagement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"engagements_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/accept_risks/":{"post":{"operationId":"engagements_accept_risks_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AcceptedRiskRequest"}}},"application/x-www-form-urlencoded":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AcceptedRiskRequest"}}},"multipart/form-data":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AcceptedRiskRequest"}}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RiskAcceptance"}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/close/":{"post":{"operationId":"engagements_close_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/complete_checklist/":{"get":{"operationId":"engagements_complete_checklist_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedEngagement"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"engagements_complete_checklist_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementCheckListRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EngagementCheckListRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EngagementCheckListRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementCheckList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/delete_preview/":{"get":{"operationId":"engagements_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/files/":{"get":{"operationId":"engagements_files_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementToFiles"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"engagements_files_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AddNewFileOptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/files/{file_id}/":{"delete":{"operationId":"engagements_files_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"file_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/files/change_name/{file_id}/":{"patch":{"operationId":"engagements_files_change_name_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"file_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFileNameRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFileNameRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFileNameRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/files/download/{file_id}/":{"get":{"operationId":"engagements_files_download_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"file_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawFile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/finding_diff/{other_id}/":{"get":{"operationId":"engagements_finding_diff_retrieve","description":"Compares the findings associated with the two objects and returns\nadded, removed, equality, and improvement information.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true},{"in":"path","name":"other_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingDiff"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/generate_report/":{"post":{"operationId":"engagements_generate_report_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/history/":{"get":{"operationId":"engagements_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"api_test","schema":{"type":"boolean"}},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"not_product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-lead","-name","-status","-target_end","-target_start","-updated","-version","created","lead","name","status","target_end","target_start","updated","version"]}},"description":"Ordering\n\n* `name` - Engagement Name\n* `-name` - Engagement Name (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `target_start` - Target start\n* `-target_start` - Target start (descending)\n* `target_end` - Target end\n* `-target_end` - Target end (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `lead` - Lead\n* `-lead` - Lead (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"pen_test","schema":{"type":"boolean"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"product__prod_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on Asset (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"product__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on Asset","explode":false,"style":"form"},{"in":"query","name":"report_type","schema":{"type":"integer"}},{"in":"query","name":"requester","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"ff79738e944f9d44","nullable":true,"enum":["Blocked","Cancelled","Completed","In Progress","Not Started","On Hold","Scheduled","Waiting for Resource"]},"description":"* `Not Started` - Not Started\n* `Blocked` - Blocked\n* `Cancelled` - Cancelled\n* `Completed` - Completed\n* `In Progress` - In Progress\n* `On Hold` - On Hold\n* `Scheduled` - Scheduled\n* `Waiting for Resource` - Waiting for Resource"},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"target_end","schema":{"type":"string","format":"date"}},{"in":"query","name":"target_start","schema":{"type":"string","format":"date"}},{"in":"query","name":"threat_model","schema":{"type":"boolean"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"version","schema":{"type":"string"}}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/history/legacy/":{"get":{"operationId":"engagements_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"api_test","schema":{"type":"boolean"}},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"not_product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-lead","-name","-status","-target_end","-target_start","-updated","-version","created","lead","name","status","target_end","target_start","updated","version"]}},"description":"Ordering\n\n* `name` - Engagement Name\n* `-name` - Engagement Name (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `target_start` - Target start\n* `-target_start` - Target start (descending)\n* `target_end` - Target end\n* `-target_end` - Target end (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `lead` - Lead\n* `-lead` - Lead (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"pen_test","schema":{"type":"boolean"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"product__prod_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on Asset (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"product__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on Asset","explode":false,"style":"form"},{"in":"query","name":"report_type","schema":{"type":"integer"}},{"in":"query","name":"requester","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"ff79738e944f9d44","nullable":true,"enum":["Blocked","Cancelled","Completed","In Progress","Not Started","On Hold","Scheduled","Waiting for Resource"]},"description":"* `Not Started` - Not Started\n* `Blocked` - Blocked\n* `Cancelled` - Cancelled\n* `Completed` - Completed\n* `In Progress` - In Progress\n* `On Hold` - On Hold\n* `Scheduled` - Scheduled\n* `Waiting for Resource` - Waiting for Resource"},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"target_end","schema":{"type":"string","format":"date"}},{"in":"query","name":"target_start","schema":{"type":"string","format":"date"}},{"in":"query","name":"threat_model","schema":{"type":"boolean"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"version","schema":{"type":"string"}}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/history/legacy/count/":{"get":{"operationId":"engagements_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/notes/":{"get":{"operationId":"engagements_notes_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementToNotes"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"engagements_notes_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Note"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/reopen/":{"post":{"operationId":"engagements_reopen_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/engagements/{id}/update_jira_epic/":{"post":{"operationId":"engagements_update_jira_epic_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this engagement.","required":true}],"tags":["engagements"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementUpdateJiraEpicRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EngagementUpdateJiraEpicRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EngagementUpdateJiraEpicRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EngagementUpdateJiraEpic"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/evidence_pack_artifacts/":{"get":{"operationId":"evidence_pack_artifacts_list","parameters":[{"in":"query","name":"kind","schema":{"type":"string","x-spec-enum-id":"a9db498899fb8f3b","enum":["cyclonedx_sbom_json","eu_evidence_xlsx","oscal_ar_json"]},"description":"* `eu_evidence_xlsx` - EU evidence workbook (xlsx)\n* `oscal_ar_json` - OSCAL assessment results (json)\n* `cyclonedx_sbom_json` - Software bill of materials (CycloneDX json)"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"snapshot","schema":{"type":"integer"}}],"tags":["evidence_pack_artifacts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEvidencePackArtifactList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/evidence_pack_artifacts/{id}/":{"get":{"operationId":"evidence_pack_artifacts_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this evidence pack artifact.","required":true}],"tags":["evidence_pack_artifacts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvidencePackArtifact"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/evidence_pack_artifacts/{id}/download/":{"get":{"operationId":"evidence_pack_artifacts_download_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this evidence pack artifact.","required":true}],"tags":["evidence_pack_artifacts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvidencePackArtifact"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/evidence_pack_snapshots/":{"get":{"operationId":"evidence_pack_snapshots_list","parameters":[{"in":"query","name":"assessment","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"a8f61caf99619754","enum":["completed","failed","pending","processing"]},"description":"* `pending` - Pending\n* `processing` - Processing\n* `completed` - Completed\n* `failed` - Failed"}],"tags":["evidence_pack_snapshots"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEvidencePackSnapshotList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/evidence_pack_snapshots/{id}/":{"get":{"operationId":"evidence_pack_snapshots_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this evidence pack snapshot.","required":true}],"tags":["evidence_pack_snapshots"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvidencePackSnapshotDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"evidence_pack_snapshots_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this evidence pack snapshot.","required":true}],"tags":["evidence_pack_snapshots"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/evidence_pack_snapshots/generate/":{"post":{"operationId":"evidence_pack_snapshots_generate_create","tags":["evidence_pack_snapshots"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvidencePackSnapshot"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/executive_insights/active_age_by_risk/":{"get":{"operationId":"executive_insights_active_age_by_risk_retrieve","description":"the average age of active findings by risk","tags":["executive_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/executive_insights/active_age_by_severity/":{"get":{"operationId":"executive_insights_active_age_by_severity_retrieve","description":"the average age of active findings by severity","tags":["executive_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/executive_insights/average_time_to_remediation/":{"get":{"operationId":"executive_insights_average_time_to_remediation_retrieve","description":"the average time taken for a finding to go from open to mitigated by date","tags":["executive_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/executive_insights/epss_score_by_tool/":{"get":{"operationId":"executive_insights_epss_score_by_tool_retrieve","description":"the average epss score across all findings, grouped by test type name","tags":["executive_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/executive_insights/findings_fixed/":{"get":{"operationId":"executive_insights_findings_fixed_retrieve","description":"the total number of findings fixed (mitigated)","tags":["executive_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/executive_insights/mitigated_over_time/":{"get":{"operationId":"executive_insights_mitigated_over_time_retrieve","description":"total number of findings mitigated within sla, outside of sla, and mitigated by date","tags":["executive_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/executive_insights/products_tested/":{"get":{"operationId":"executive_insights_products_tested_retrieve","description":"the total number of products tested (findings were created)","tags":["executive_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/executive_insights/severity_over_time/":{"get":{"operationId":"executive_insights_severity_over_time_retrieve","description":"the running total of findings by severity by date","tags":["executive_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/executive_insights/status_over_time/":{"get":{"operationId":"executive_insights_status_over_time_retrieve","description":"the running total of findings of active and mitigated status by date","tags":["executive_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/executive_insights/summary/":{"get":{"operationId":"executive_insights_summary_retrieve","description":"the simple metrics (total, active, verified, etc.) for all objects, all product types, and all products","tags":["executive_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/executive_insights/tests_performed/":{"get":{"operationId":"executive_insights_tests_performed_retrieve","description":"the total number of tests performed","tags":["executive_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/export/manifest/":{"get":{"operationId":"export_manifest_retrieve","description":"Superuser only. Lists the product types and products with their counts, the reference data and the users that a product export refers to. The keys are documented at https://docs.defectdojo.com/automation/api/product_export/","parameters":[{"in":"query","name":"format","schema":{"type":"string","enum":["json","ndjson"]}},{"in":"query","name":"max_file_bytes","schema":{"type":"integer","minimum":0,"default":10485760},"description":"File size cap in bytes. The product export carries a file of this size or less inline as base64, and a larger file keeps its size with no data. The manifest counts larger files in files_over_cap."}],"tags":["export"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}},"application/x-ndjson":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/export/products/{id}/":{"get":{"operationId":"export_products_retrieve","description":"Superuser only. Streams one product with its engagements, tests, findings and risk acceptances as NDJSON, one JSON object per line. The line shapes are documented at https://docs.defectdojo.com/automation/api/product_export/","parameters":[{"in":"query","name":"format","schema":{"type":"string","enum":["json","ndjson"]}},{"in":"path","name":"id","schema":{"type":"integer"},"required":true},{"in":"query","name":"max_file_bytes","schema":{"type":"integer","minimum":0,"default":10485760},"description":"File size cap in bytes. The product export carries a file of this size or less inline as base64, and a larger file keeps its size with no data. The manifest counts larger files in files_over_cap."}],"tags":["export"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/x-ndjson":{"schema":{"type":"string"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/exposure/verdicts/":{"post":{"operationId":"exposure_verdicts_create","description":"Provider-facing exposure endpoints (token auth): external scanners and first-party\nanalysis submit exposure verdicts for an asset. The connectors-service variant lives on\nthe connector record viewset under ``/api/connectors/v1/``.","tags":["exposure"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductExposureBatchRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductExposureBatchRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductExposureBatchRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExposureIngestResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/fda_metrics/":{"get":{"operationId":"fda_metrics_list","description":"The three Section 524B lifecycle metrics for one product and window.\n\nRead-only and computed on request. The figures are deliberately not materialized: a sponsor\nreading them wants the answer for the data as it stands now, and a cached lifecycle metric\nthat disagreed with the evidence pack built from the same period would be worse than no\nmetric at all.","tags":["fda_metrics"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_control_maps/":{"get":{"operationId":"finding_control_maps_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"control","schema":{"type":"integer"}},{"in":"query","name":"finding","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"source","schema":{"type":"string","x-spec-enum-id":"2080f273f46fcb47","enum":["classifier","crosswalk","default_rule","manual","scanner"]},"description":"How this mapping was produced\n\n* `default_rule` - Default rule\n* `scanner` - Scanner-provided\n* `manual` - Manual\n* `crosswalk` - Crosswalk suggestion\n* `classifier` - Suggested"},{"in":"query","name":"suppressed","schema":{"type":"boolean"}}],"tags":["finding_control_maps"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedFindingControlMapList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"finding_control_maps_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["finding_control_maps"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingControlMapRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingControlMapRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingControlMapRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingControlMap"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_control_maps/{id}/":{"get":{"operationId":"finding_control_maps_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding control map.","required":true}],"tags":["finding_control_maps"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingControlMap"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"finding_control_maps_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding control map.","required":true}],"tags":["finding_control_maps"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingControlMapRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingControlMapRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingControlMapRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingControlMap"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"finding_control_maps_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding control map.","required":true}],"tags":["finding_control_maps"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFindingControlMapRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFindingControlMapRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFindingControlMapRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingControlMap"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"finding_control_maps_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding control map.","required":true}],"tags":["finding_control_maps"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_control_maps/{id}/confirm/":{"post":{"operationId":"finding_control_maps_confirm_create","description":"Confirm a classifier suggestion. It becomes a manual mapping attributed to the requesting user, and from\nthen on counts as evidence (the POA&M ledger, control coverage) like any other. Rejecting a suggestion is the\nordinary update that sets ``suppressed``, which also stops it from being suggested again.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding control map.","required":true}],"tags":["finding_control_maps"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingControlMap"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_control_maps/{id}/history/":{"get":{"operationId":"finding_control_maps_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"control","schema":{"type":"integer"}},{"in":"query","name":"finding","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding control map.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"source","schema":{"type":"string","x-spec-enum-id":"2080f273f46fcb47","enum":["classifier","crosswalk","default_rule","manual","scanner"]},"description":"How this mapping was produced\n\n* `default_rule` - Default rule\n* `scanner` - Scanner-provided\n* `manual` - Manual\n* `crosswalk` - Crosswalk suggestion\n* `classifier` - Suggested"},{"in":"query","name":"suppressed","schema":{"type":"boolean"}}],"tags":["finding_control_maps"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_control_maps/{id}/history/legacy/":{"get":{"operationId":"finding_control_maps_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"control","schema":{"type":"integer"}},{"in":"query","name":"finding","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding control map.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"source","schema":{"type":"string","x-spec-enum-id":"2080f273f46fcb47","enum":["classifier","crosswalk","default_rule","manual","scanner"]},"description":"How this mapping was produced\n\n* `default_rule` - Default rule\n* `scanner` - Scanner-provided\n* `manual` - Manual\n* `crosswalk` - Crosswalk suggestion\n* `classifier` - Suggested"},{"in":"query","name":"suppressed","schema":{"type":"boolean"}}],"tags":["finding_control_maps"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_control_maps/{id}/history/legacy/count/":{"get":{"operationId":"finding_control_maps_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding control map.","required":true}],"tags":["finding_control_maps"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_groups/":{"get":{"operationId":"finding_groups_list","parameters":[{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_is_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_is_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_is_during","schema":{"type":"string"}},{"in":"query","name":"created_is_on","schema":{"type":"string"}},{"in":"query","name":"created_is_past_days","schema":{"type":"number"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"creator","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"creator_not","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"findings_count_equals","schema":{"type":"number"}},{"in":"query","name":"findings_count_greater_than","schema":{"type":"number"}},{"in":"query","name":"findings_count_greater_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"findings_count_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"findings_count_less_than","schema":{"type":"number"}},{"in":"query","name":"findings_count_less_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"findings_count_not_equals","schema":{"type":"number"}},{"in":"query","name":"findings_count_not_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_age_equals","schema":{"type":"number"}},{"in":"query","name":"group_age_greater_than","schema":{"type":"number"}},{"in":"query","name":"group_age_greater_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"group_age_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_age_less_than","schema":{"type":"number"}},{"in":"query","name":"group_age_less_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"group_age_not_equals","schema":{"type":"number"}},{"in":"query","name":"group_age_not_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"has_connector","schema":{"type":"boolean"}},{"in":"query","name":"has_integrator","schema":{"type":"boolean"}},{"in":"query","name":"has_jira","schema":{"type":"boolean"}},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-creator","-creator__first_name","-creator__last_name","-findings_count","-group_age","-id","-name","-severity","-sla_days_remaining","-status","-test__title","-updated","created","creator","creator__first_name","creator__last_name","findings_count","group_age","id","name","severity","sla_days_remaining","status","test__title","updated"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `severity` - Severity\n* `-severity` - Severity (descending)\n* `test__title` - Test  title\n* `-test__title` - Test  title (descending)\n* `findings_count` - Findings count\n* `-findings_count` - Findings count (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `creator` - Creator\n* `-creator` - Creator (descending)\n* `creator__first_name` - Creator  first name\n* `-creator__first_name` - Creator  first name (descending)\n* `creator__last_name` - Creator  last name\n* `-creator__last_name` - Creator  last name (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `sla_days_remaining` - Sla days remaining\n* `-sla_days_remaining` - Sla days remaining (descending)\n* `group_age` - Group age\n* `-group_age` - Group age (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["creator","findings","test"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, test__title"},{"in":"query","name":"severity","schema":{"type":"array","items":{"type":"string","enum":["Critical","High","Info","Low","Medium"]}},"description":"* `Critical` - Critical\n* `High` - High\n* `Medium` - Medium\n* `Low` - Low\n* `Info` - Info","explode":true,"style":"form"},{"in":"query","name":"sla_days_remaining_equals","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_greater_than","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_greater_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"sla_days_remaining_less_than","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_less_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_not_equals","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_not_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"status","schema":{"type":"array","items":{"type":"string","enum":["Active","Inactive","Mitigated"]}},"description":"* `Active` - Active\n* `Inactive` - Inactive\n* `Mitigated` - Mitigated","explode":true,"style":"form"},{"in":"query","name":"status_all","schema":{"type":"string"}},{"in":"query","name":"status_any","schema":{"type":"string"}},{"in":"query","name":"test","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test_not","schema":{"type":"string"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["finding_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedFullFindingGroupList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"finding_groups_create","tags":["finding_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullFindingGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FullFindingGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FullFindingGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullFindingGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_groups/{id}/":{"get":{"operationId":"finding_groups_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ group.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["creator","findings","test"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["finding_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullFindingGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"finding_groups_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ group.","required":true}],"tags":["finding_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullFindingGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FullFindingGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FullFindingGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullFindingGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"finding_groups_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ group.","required":true}],"tags":["finding_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFullFindingGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFullFindingGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFullFindingGroupRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FullFindingGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"finding_groups_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ group.","required":true}],"tags":["finding_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_groups/{id}/delete_preview/":{"get":{"operationId":"finding_groups_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ group.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["finding_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_groups/{id}/history/":{"get":{"operationId":"finding_groups_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_is_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_is_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_is_during","schema":{"type":"string"}},{"in":"query","name":"created_is_on","schema":{"type":"string"}},{"in":"query","name":"created_is_past_days","schema":{"type":"number"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"creator","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"creator_not","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"findings_count_equals","schema":{"type":"number"}},{"in":"query","name":"findings_count_greater_than","schema":{"type":"number"}},{"in":"query","name":"findings_count_greater_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"findings_count_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"findings_count_less_than","schema":{"type":"number"}},{"in":"query","name":"findings_count_less_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"findings_count_not_equals","schema":{"type":"number"}},{"in":"query","name":"findings_count_not_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_age_equals","schema":{"type":"number"}},{"in":"query","name":"group_age_greater_than","schema":{"type":"number"}},{"in":"query","name":"group_age_greater_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"group_age_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_age_less_than","schema":{"type":"number"}},{"in":"query","name":"group_age_less_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"group_age_not_equals","schema":{"type":"number"}},{"in":"query","name":"group_age_not_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"has_connector","schema":{"type":"boolean"}},{"in":"query","name":"has_integrator","schema":{"type":"boolean"}},{"in":"query","name":"has_jira","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ group.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-creator","-creator__first_name","-creator__last_name","-findings_count","-group_age","-id","-name","-severity","-sla_days_remaining","-status","-test__title","-updated","created","creator","creator__first_name","creator__last_name","findings_count","group_age","id","name","severity","sla_days_remaining","status","test__title","updated"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `severity` - Severity\n* `-severity` - Severity (descending)\n* `test__title` - Test  title\n* `-test__title` - Test  title (descending)\n* `findings_count` - Findings count\n* `-findings_count` - Findings count (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `creator` - Creator\n* `-creator` - Creator (descending)\n* `creator__first_name` - Creator  first name\n* `-creator__first_name` - Creator  first name (descending)\n* `creator__last_name` - Creator  last name\n* `-creator__last_name` - Creator  last name (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `sla_days_remaining` - Sla days remaining\n* `-sla_days_remaining` - Sla days remaining (descending)\n* `group_age` - Group age\n* `-group_age` - Group age (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, test__title"},{"in":"query","name":"severity","schema":{"type":"array","items":{"type":"string","enum":["Critical","High","Info","Low","Medium"]}},"description":"* `Critical` - Critical\n* `High` - High\n* `Medium` - Medium\n* `Low` - Low\n* `Info` - Info","explode":true,"style":"form"},{"in":"query","name":"sla_days_remaining_equals","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_greater_than","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_greater_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"sla_days_remaining_less_than","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_less_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_not_equals","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_not_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"status","schema":{"type":"array","items":{"type":"string","enum":["Active","Inactive","Mitigated"]}},"description":"* `Active` - Active\n* `Inactive` - Inactive\n* `Mitigated` - Mitigated","explode":true,"style":"form"},{"in":"query","name":"status_all","schema":{"type":"string"}},{"in":"query","name":"status_any","schema":{"type":"string"}},{"in":"query","name":"test","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test_not","schema":{"type":"string"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["finding_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_groups/{id}/history/legacy/":{"get":{"operationId":"finding_groups_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_is_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_is_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_is_during","schema":{"type":"string"}},{"in":"query","name":"created_is_on","schema":{"type":"string"}},{"in":"query","name":"created_is_past_days","schema":{"type":"number"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"creator","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"creator_not","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"findings_count_equals","schema":{"type":"number"}},{"in":"query","name":"findings_count_greater_than","schema":{"type":"number"}},{"in":"query","name":"findings_count_greater_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"findings_count_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"findings_count_less_than","schema":{"type":"number"}},{"in":"query","name":"findings_count_less_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"findings_count_not_equals","schema":{"type":"number"}},{"in":"query","name":"findings_count_not_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_age_equals","schema":{"type":"number"}},{"in":"query","name":"group_age_greater_than","schema":{"type":"number"}},{"in":"query","name":"group_age_greater_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"group_age_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_age_less_than","schema":{"type":"number"}},{"in":"query","name":"group_age_less_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"group_age_not_equals","schema":{"type":"number"}},{"in":"query","name":"group_age_not_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"has_connector","schema":{"type":"boolean"}},{"in":"query","name":"has_integrator","schema":{"type":"boolean"}},{"in":"query","name":"has_jira","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ group.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-creator","-creator__first_name","-creator__last_name","-findings_count","-group_age","-id","-name","-severity","-sla_days_remaining","-status","-test__title","-updated","created","creator","creator__first_name","creator__last_name","findings_count","group_age","id","name","severity","sla_days_remaining","status","test__title","updated"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `severity` - Severity\n* `-severity` - Severity (descending)\n* `test__title` - Test  title\n* `-test__title` - Test  title (descending)\n* `findings_count` - Findings count\n* `-findings_count` - Findings count (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `creator` - Creator\n* `-creator` - Creator (descending)\n* `creator__first_name` - Creator  first name\n* `-creator__first_name` - Creator  first name (descending)\n* `creator__last_name` - Creator  last name\n* `-creator__last_name` - Creator  last name (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `sla_days_remaining` - Sla days remaining\n* `-sla_days_remaining` - Sla days remaining (descending)\n* `group_age` - Group age\n* `-group_age` - Group age (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, test__title"},{"in":"query","name":"severity","schema":{"type":"array","items":{"type":"string","enum":["Critical","High","Info","Low","Medium"]}},"description":"* `Critical` - Critical\n* `High` - High\n* `Medium` - Medium\n* `Low` - Low\n* `Info` - Info","explode":true,"style":"form"},{"in":"query","name":"sla_days_remaining_equals","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_greater_than","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_greater_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"sla_days_remaining_less_than","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_less_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_not_equals","schema":{"type":"number"}},{"in":"query","name":"sla_days_remaining_not_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"status","schema":{"type":"array","items":{"type":"string","enum":["Active","Inactive","Mitigated"]}},"description":"* `Active` - Active\n* `Inactive` - Inactive\n* `Mitigated` - Mitigated","explode":true,"style":"form"},{"in":"query","name":"status_all","schema":{"type":"string"}},{"in":"query","name":"status_any","schema":{"type":"string"}},{"in":"query","name":"test","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test_not","schema":{"type":"string"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["finding_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_groups/{id}/history/legacy/count/":{"get":{"operationId":"finding_groups_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ group.","required":true}],"tags":["finding_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_templates/":{"get":{"operationId":"finding_templates_list","parameters":[{"in":"query","name":"cwe","schema":{"type":"integer"}},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"mitigation","schema":{"type":"string"}},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-cwe","-title","cwe","title"]}},"description":"Ordering\n\n* `title` - Title\n* `-title` - Title (descending)\n* `cwe` - Cwe\n* `-cwe` - Cwe (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"severity","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"title","schema":{"type":"string"}}],"tags":["finding_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedFindingTemplateList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"finding_templates_create","tags":["finding_templates"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingTemplateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingTemplateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingTemplateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingTemplate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_templates/{id}/":{"get":{"operationId":"finding_templates_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ template.","required":true}],"tags":["finding_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingTemplate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"finding_templates_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ template.","required":true}],"tags":["finding_templates"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingTemplateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingTemplateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingTemplateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingTemplate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"finding_templates_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ template.","required":true}],"tags":["finding_templates"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFindingTemplateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFindingTemplateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFindingTemplateRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingTemplate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"finding_templates_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ template.","required":true}],"tags":["finding_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_templates/{id}/delete_preview/":{"get":{"operationId":"finding_templates_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ template.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["finding_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_templates/{id}/history/":{"get":{"operationId":"finding_templates_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"cwe","schema":{"type":"integer"}},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ template.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"mitigation","schema":{"type":"string"}},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-cwe","-title","cwe","title"]}},"description":"Ordering\n\n* `title` - Title\n* `-title` - Title (descending)\n* `cwe` - Cwe\n* `-cwe` - Cwe (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"severity","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"title","schema":{"type":"string"}}],"tags":["finding_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_templates/{id}/history/legacy/":{"get":{"operationId":"finding_templates_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"cwe","schema":{"type":"integer"}},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ template.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"mitigation","schema":{"type":"string"}},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-cwe","-title","cwe","title"]}},"description":"Ordering\n\n* `title` - Title\n* `-title` - Title (descending)\n* `cwe` - Cwe\n* `-cwe` - Cwe (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"severity","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"title","schema":{"type":"string"}}],"tags":["finding_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_templates/{id}/history/legacy/count/":{"get":{"operationId":"finding_templates_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding_ template.","required":true}],"tags":["finding_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_version_affects/":{"get":{"operationId":"finding_version_affects_list","description":"found_in / fixed_in claims per (finding, version).\n\nReads cover every origin so a UI can distinguish what an import asserted from what an\nanalyst recorded; writes mint USER claims only, leaving import-written rows to the\nimporter. No update action -- a claim is stated or withdrawn, never edited into a\ndifferent claim.","parameters":[{"in":"query","name":"asset_version","schema":{"type":"integer"}},{"in":"query","name":"finding","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"origin","schema":{"type":"string","x-spec-enum-id":"9aa4308b3b3f63d8","enum":["import","user"]},"description":"Who recorded the claim: a user, or an import bound to a version. Machinery only reconciles rows of its own origin.\n\n* `user` - User\n* `import` - Import"},{"in":"query","name":"product","schema":{"type":"string"}},{"in":"query","name":"relation","schema":{"type":"string","x-spec-enum-id":"7e7ed778a95ef6b3","enum":["fixed_in","found_in"]},"description":"Whether the finding was observed in this version or fixed as of it.\n\n* `found_in` - Found In\n* `fixed_in` - Fixed In"},{"in":"query","name":"version_name","schema":{"type":"string"}}],"tags":["finding_version_affects"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedFindingVersionAffectList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"finding_version_affects_create","description":"found_in / fixed_in claims per (finding, version).\n\nReads cover every origin so a UI can distinguish what an import asserted from what an\nanalyst recorded; writes mint USER claims only, leaving import-written rows to the\nimporter. No update action -- a claim is stated or withdrawn, never edited into a\ndifferent claim.","tags":["finding_version_affects"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingVersionAffectRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingVersionAffectRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingVersionAffectRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingVersionAffect"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/finding_version_affects/{id}/":{"get":{"operationId":"finding_version_affects_retrieve","description":"found_in / fixed_in claims per (finding, version).\n\nReads cover every origin so a UI can distinguish what an import asserted from what an\nanalyst recorded; writes mint USER claims only, leaving import-written rows to the\nimporter. No update action -- a claim is stated or withdrawn, never edited into a\ndifferent claim.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding version affect.","required":true}],"tags":["finding_version_affects"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingVersionAffect"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"finding_version_affects_destroy","description":"found_in / fixed_in claims per (finding, version).\n\nReads cover every origin so a UI can distinguish what an import asserted from what an\nanalyst recorded; writes mint USER claims only, leaving import-written rows to the\nimporter. No update action -- a claim is stated or withdrawn, never edited into a\ndifferent claim.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding version affect.","required":true}],"tags":["finding_version_affects"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/":{"get":{"operationId":"findings_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"assignee","schema":{"type":"array","items":{"type":"number"}},"description":"Findings assigned to any of these users (user ids, comma-separated)","explode":false,"style":"form"},{"in":"query","name":"component_name","schema":{"type":"string"}},{"in":"query","name":"component_version","schema":{"type":"string"}},{"in":"query","name":"created","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was initially created, and saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"cvssv3","schema":{"type":"string"}},{"in":"query","name":"cvssv3_score","schema":{"type":"number","format":"float"}},{"in":"query","name":"cvssv4","schema":{"type":"string"}},{"in":"query","name":"cvssv4_score","schema":{"type":"number","format":"float"}},{"in":"query","name":"cwe","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"date","schema":{"type":"string","format":"date","enum":[1,2,3,4,5,6,7,null]},"description":"The date the flaw was discovered.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"defect_review_requested_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"discovered_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"discovered_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"discovered_on","schema":{"type":"string","format":"date"}},{"in":"query","name":"duplicate","schema":{"type":"boolean"}},{"in":"query","name":"duplicate_finding","schema":{"type":"integer"}},{"in":"query","name":"dynamic_finding","schema":{"type":"boolean"}},{"in":"query","name":"effort_for_fixing","schema":{"type":"string"}},{"in":"query","name":"endpoints","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"epss_percentile_max","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS percentiles to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_percentile_min","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS percentiles to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_score_max","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS score percentages to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_score_min","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS score percentages to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"exact_title","schema":{"type":"string"},"description":"Finding title exact match (case-insensitive)"},{"in":"query","name":"false_p","schema":{"type":"boolean"}},{"in":"query","name":"file_path","schema":{"type":"string"}},{"in":"query","name":"finding_group","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"fix_available","schema":{"type":"boolean"}},{"in":"query","name":"fix_version","schema":{"type":"string"}},{"in":"query","name":"found_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"has_jira","schema":{"type":"boolean"}},{"in":"query","name":"has_pending_exception","schema":{"type":"boolean"},"description":"Findings that are part of a risk acceptance nobody has decided yet. These are still active and still counted -- this is what a security-exception queue filters on."},{"in":"query","name":"has_sla","schema":{"type":"boolean"},"description":"true: findings with an SLA expiration date; false: findings with no SLA"},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"query","name":"hash_code","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"impact","schema":{"type":"string"}},{"in":"query","name":"inherited_tags","schema":{"type":"array","items":{"type":"array","items":{"type":"integer"}}},"description":"Internal use tags sepcifically for maintaining parity with product. This field will be present as a subset in the tags field","explode":true,"style":"form"},{"in":"query","name":"is_assigned","schema":{"type":"boolean"},"description":"true: findings somebody is assigned to; false: findings nobody has picked up"},{"in":"query","name":"is_mitigated","schema":{"type":"boolean"}},{"in":"query","name":"jira_change","schema":{"type":"string","format":"date-time","nullable":true,"title":"Jira last update","enum":[1,2,3,4,5,6,7,null]},"description":"The date the linked Jira issue was last modified.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"jira_creation","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"The date a Jira issue was created from this finding.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"kev_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"known_exploited","schema":{"type":"boolean"}},{"in":"query","name":"last_reviewed","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Provides the date the flaw was last 'touched' by a tester.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"last_reviewed_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"last_status_update","schema":{"type":"string","format":"date-time"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"mitigated","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Denotes if this flaw has been fixed by storing the date it was fixed.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"mitigated_after","schema":{"type":"string","format":"date-time"},"description":"Mitigated After"},{"in":"query","name":"mitigated_before","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"mitigated_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"mitigated_on","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"mitigation","schema":{"type":"string"}},{"in":"query","name":"mitigation_available","schema":{"type":"boolean"},"description":"Mitigation Available"},{"in":"query","name":"mitigation_policy","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"nb_occurences","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"not_test__engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"not_test__engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on engagement","explode":false,"style":"form"},{"in":"query","name":"not_test__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on test","explode":false,"style":"form"},{"in":"query","name":"numerical_severity","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active","-component_name","-component_version","-created","-cwe","-date","-duplicate","-dynamic_finding","-false_p","-found_by","-id","-is_mitigated","-last_reviewed","-last_status_update","-numerical_severity","-out_of_scope","-planned_remediation_date","-priority","-reviewers","-severity","-sla_expiration_date","-static_finding","-test__engagement__product__name","-title","-under_defect_review","-under_review","-verified","active","component_name","component_version","created","cwe","date","duplicate","dynamic_finding","false_p","found_by","id","is_mitigated","last_reviewed","last_status_update","numerical_severity","out_of_scope","planned_remediation_date","priority","reviewers","severity","sla_expiration_date","static_finding","test__engagement__product__name","title","under_defect_review","under_review","verified"]}},"description":"Ordering\n\n* `active` - Active\n* `-active` - Active (descending)\n* `component_name` - Component name\n* `-component_name` - Component name (descending)\n* `component_version` - Component version\n* `-component_version` - Component version (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `last_status_update` - Last status update\n* `-last_status_update` - Last status update (descending)\n* `last_reviewed` - Last reviewed\n* `-last_reviewed` - Last reviewed (descending)\n* `cwe` - Cwe\n* `-cwe` - Cwe (descending)\n* `date` - Date\n* `-date` - Date (descending)\n* `duplicate` - Duplicate\n* `-duplicate` - Duplicate (descending)\n* `dynamic_finding` - Dynamic finding\n* `-dynamic_finding` - Dynamic finding (descending)\n* `false_p` - False p\n* `-false_p` - False p (descending)\n* `found_by` - Found by\n* `-found_by` - Found by (descending)\n* `id` - Id\n* `-id` - Id (descending)\n* `is_mitigated` - Is mitigated\n* `-is_mitigated` - Is mitigated (descending)\n* `numerical_severity` - Numerical severity\n* `-numerical_severity` - Numerical severity (descending)\n* `out_of_scope` - Out of scope\n* `-out_of_scope` - Out of scope (descending)\n* `planned_remediation_date` - Planned remediation date\n* `-planned_remediation_date` - Planned remediation date (descending)\n* `severity` - Severity\n* `-severity` - Severity (descending)\n* `sla_expiration_date` - Sla expiration date\n* `-sla_expiration_date` - Sla expiration date (descending)\n* `reviewers` - Reviewers\n* `-reviewers` - Reviewers (descending)\n* `static_finding` - Static finding\n* `-static_finding` - Static finding (descending)\n* `test__engagement__product__name` - Test  engagement  product  name\n* `-test__engagement__product__name` - Test  engagement  product  name (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `under_defect_review` - Under defect review\n* `-under_defect_review` - Under defect review (descending)\n* `under_review` - Under review\n* `-under_review` - Under review (descending)\n* `verified` - Verified\n* `-verified` - Verified (descending)\n* `priority` - Priority\n* `-priority` - Priority (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"out_of_scope","schema":{"type":"boolean"}},{"in":"query","name":"outside_of_sla","schema":{"type":"number"}},{"in":"query","name":"owners","schema":{"type":"array","items":{"type":"number"}},"description":"Findings owned by any of these groups (Dojo_Group ids, comma-separated)","explode":false,"style":"form"},{"in":"query","name":"owners_email","schema":{"type":"string"},"description":"owners_email"},{"in":"query","name":"owners_email_contains","schema":{"type":"string"},"description":"owners_email_contains"},{"in":"query","name":"param","schema":{"type":"string"}},{"in":"query","name":"payload","schema":{"type":"string"}},{"in":"query","name":"planned_remediation_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"planned_remediation_version","schema":{"type":"string"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["auth_issues","author_issues","config_issues","crypto_issues","data_issues","defect_review_requested_by","duplicate_finding","endpoint_set","endpoints","files","finding_group_set","found_by","last_reviewed_by","mitigated_by","notes","other_issues","reporter","review_requested_by","reviewers","risk_acceptance_set","sensitive_issues","session_issues","sonarqube_issue","test","locations"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"priority_max","schema":{"type":"number"},"description":"Return findings with a priority value less than the supplied value"},{"in":"query","name":"priority_min","schema":{"type":"number"},"description":"Return findings with a priority value greater than the supplied value"},{"in":"query","name":"product_lifecycle","schema":{"type":"string"},"description":"Comma separated list of exact Asset lifecycles"},{"in":"query","name":"product_name","schema":{"type":"string"},"description":"Exact Asset Name"},{"in":"query","name":"product_name_contains","schema":{"type":"string"},"description":"Asset Name Contains"},{"in":"query","name":"publish_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"ransomware_used","schema":{"type":"boolean"}},{"in":"query","name":"references","schema":{"type":"string"}},{"in":"query","name":"related_fields","schema":{"type":"boolean"},"description":"Expand finding external relations (engagement, environment, product, product_type, test, test_type)"},{"in":"query","name":"reporter","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"review_requested_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"reviewers","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"risk","schema":{"type":"string","enum":["Low","Medium","Needs Action","Urgent"]},"description":"The risk score in which a finding poses to the system it was discovered on\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},{"in":"query","name":"risk_acceptance","schema":{"type":"number"}},{"in":"query","name":"risk_accepted","schema":{"type":"boolean"}},{"in":"query","name":"sast_sink_object","schema":{"type":"string"}},{"in":"query","name":"sast_source_file_path","schema":{"type":"string"}},{"in":"query","name":"sast_source_line","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"sast_source_object","schema":{"type":"string"}},{"in":"query","name":"scanner_confidence","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"service","schema":{"type":"string"}},{"in":"query","name":"severity","schema":{"type":"string"}},{"in":"query","name":"severity_justification","schema":{"type":"string"}},{"in":"query","name":"sla_expiration_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"sla_start_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"sonarqube_issue","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"static_finding","schema":{"type":"boolean"}},{"in":"query","name":"steps_to_reproduce","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"test","schema":{"type":"integer"}},{"in":"query","name":"test__engagement","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__prod_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on Asset (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on Asset","explode":false,"style":"form"},{"in":"query","name":"test__engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on engagement (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__engagement__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on engagement","explode":false,"style":"form"},{"in":"query","name":"test__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on test (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on test","explode":false,"style":"form"},{"in":"query","name":"test__test_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title","schema":{"type":"string"}},{"in":"query","name":"under_defect_review","schema":{"type":"boolean"}},{"in":"query","name":"under_review","schema":{"type":"boolean"}},{"in":"query","name":"unique_id_from_tool","schema":{"type":"string"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"verified","schema":{"type":"boolean"}},{"in":"query","name":"vuln_id_from_tool","schema":{"type":"string"}},{"in":"query","name":"vulnerability_id","schema":{"type":"string"}}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedFindingsList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"findings_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingCreateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingCreate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/":{"get":{"operationId":"findings_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["auth_issues","author_issues","config_issues","crypto_issues","data_issues","defect_review_requested_by","duplicate_finding","endpoint_set","endpoints","files","finding_group_set","found_by","last_reviewed_by","mitigated_by","notes","other_issues","reporter","review_requested_by","reviewers","risk_acceptance_set","sensitive_issues","session_issues","sonarqube_issue","test","locations"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"related_fields","schema":{"type":"boolean"},"description":"Expand finding external relations (engagement, environment, product, product_type, test, test_type)"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Findings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"findings_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Findings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"findings_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFindingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFindingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFindingsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Findings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"findings_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/acceptance_history/":{"get":{"operationId":"findings_acceptance_history_list","description":"Every risk acceptance this finding has been part of, including the ones it has left.\n\nThe question this answers is the one asked months later: was this finding ever accepted,\nby whom, and why -- about acceptances whose membership was severed by an expiry or a\nre-import long ago, which is exactly when the live membership has nothing to say.\n\nScoped to acceptances the user may see in their own right. Risk acceptance visibility is a\nseparate grant from finding visibility, so listing them here for anyone who can read the\nfinding would leak both their existence and their reasoning.","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"assignee","schema":{"type":"array","items":{"type":"number"}},"description":"Findings assigned to any of these users (user ids, comma-separated)","explode":false,"style":"form"},{"in":"query","name":"component_name","schema":{"type":"string"}},{"in":"query","name":"component_version","schema":{"type":"string"}},{"in":"query","name":"created","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was initially created, and saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"cvssv3","schema":{"type":"string"}},{"in":"query","name":"cvssv3_score","schema":{"type":"number","format":"float"}},{"in":"query","name":"cvssv4","schema":{"type":"string"}},{"in":"query","name":"cvssv4_score","schema":{"type":"number","format":"float"}},{"in":"query","name":"cwe","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"date","schema":{"type":"string","format":"date","enum":[1,2,3,4,5,6,7,null]},"description":"The date the flaw was discovered.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"defect_review_requested_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"discovered_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"discovered_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"discovered_on","schema":{"type":"string","format":"date"}},{"in":"query","name":"duplicate","schema":{"type":"boolean"}},{"in":"query","name":"duplicate_finding","schema":{"type":"integer"}},{"in":"query","name":"dynamic_finding","schema":{"type":"boolean"}},{"in":"query","name":"effort_for_fixing","schema":{"type":"string"}},{"in":"query","name":"endpoints","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"epss_percentile_max","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS percentiles to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_percentile_min","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS percentiles to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_score_max","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS score percentages to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_score_min","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS score percentages to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"exact_title","schema":{"type":"string"},"description":"Finding title exact match (case-insensitive)"},{"in":"query","name":"false_p","schema":{"type":"boolean"}},{"in":"query","name":"file_path","schema":{"type":"string"}},{"in":"query","name":"finding_group","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"fix_available","schema":{"type":"boolean"}},{"in":"query","name":"fix_version","schema":{"type":"string"}},{"in":"query","name":"found_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"has_jira","schema":{"type":"boolean"}},{"in":"query","name":"has_pending_exception","schema":{"type":"boolean"},"description":"Findings that are part of a risk acceptance nobody has decided yet. These are still active and still counted -- this is what a security-exception queue filters on."},{"in":"query","name":"has_sla","schema":{"type":"boolean"},"description":"true: findings with an SLA expiration date; false: findings with no SLA"},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"query","name":"hash_code","schema":{"type":"string"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"impact","schema":{"type":"string"}},{"in":"query","name":"inherited_tags","schema":{"type":"array","items":{"type":"array","items":{"type":"integer"}}},"description":"Internal use tags sepcifically for maintaining parity with product. This field will be present as a subset in the tags field","explode":true,"style":"form"},{"in":"query","name":"is_assigned","schema":{"type":"boolean"},"description":"true: findings somebody is assigned to; false: findings nobody has picked up"},{"in":"query","name":"is_mitigated","schema":{"type":"boolean"}},{"in":"query","name":"jira_change","schema":{"type":"string","format":"date-time","nullable":true,"title":"Jira last update","enum":[1,2,3,4,5,6,7,null]},"description":"The date the linked Jira issue was last modified.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"jira_creation","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"The date a Jira issue was created from this finding.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"kev_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"known_exploited","schema":{"type":"boolean"}},{"in":"query","name":"last_reviewed","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Provides the date the flaw was last 'touched' by a tester.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"last_reviewed_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"last_status_update","schema":{"type":"string","format":"date-time"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"mitigated","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Denotes if this flaw has been fixed by storing the date it was fixed.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"mitigated_after","schema":{"type":"string","format":"date-time"},"description":"Mitigated After"},{"in":"query","name":"mitigated_before","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"mitigated_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"mitigated_on","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"mitigation","schema":{"type":"string"}},{"in":"query","name":"mitigation_available","schema":{"type":"boolean"},"description":"Mitigation Available"},{"in":"query","name":"mitigation_policy","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"nb_occurences","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"not_test__engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"not_test__engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on engagement","explode":false,"style":"form"},{"in":"query","name":"not_test__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on test","explode":false,"style":"form"},{"in":"query","name":"numerical_severity","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active","-component_name","-component_version","-created","-cwe","-date","-duplicate","-dynamic_finding","-false_p","-found_by","-id","-is_mitigated","-last_reviewed","-last_status_update","-numerical_severity","-out_of_scope","-planned_remediation_date","-priority","-reviewers","-severity","-sla_expiration_date","-static_finding","-test__engagement__product__name","-title","-under_defect_review","-under_review","-verified","active","component_name","component_version","created","cwe","date","duplicate","dynamic_finding","false_p","found_by","id","is_mitigated","last_reviewed","last_status_update","numerical_severity","out_of_scope","planned_remediation_date","priority","reviewers","severity","sla_expiration_date","static_finding","test__engagement__product__name","title","under_defect_review","under_review","verified"]}},"description":"Ordering\n\n* `active` - Active\n* `-active` - Active (descending)\n* `component_name` - Component name\n* `-component_name` - Component name (descending)\n* `component_version` - Component version\n* `-component_version` - Component version (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `last_status_update` - Last status update\n* `-last_status_update` - Last status update (descending)\n* `last_reviewed` - Last reviewed\n* `-last_reviewed` - Last reviewed (descending)\n* `cwe` - Cwe\n* `-cwe` - Cwe (descending)\n* `date` - Date\n* `-date` - Date (descending)\n* `duplicate` - Duplicate\n* `-duplicate` - Duplicate (descending)\n* `dynamic_finding` - Dynamic finding\n* `-dynamic_finding` - Dynamic finding (descending)\n* `false_p` - False p\n* `-false_p` - False p (descending)\n* `found_by` - Found by\n* `-found_by` - Found by (descending)\n* `id` - Id\n* `-id` - Id (descending)\n* `is_mitigated` - Is mitigated\n* `-is_mitigated` - Is mitigated (descending)\n* `numerical_severity` - Numerical severity\n* `-numerical_severity` - Numerical severity (descending)\n* `out_of_scope` - Out of scope\n* `-out_of_scope` - Out of scope (descending)\n* `planned_remediation_date` - Planned remediation date\n* `-planned_remediation_date` - Planned remediation date (descending)\n* `severity` - Severity\n* `-severity` - Severity (descending)\n* `sla_expiration_date` - Sla expiration date\n* `-sla_expiration_date` - Sla expiration date (descending)\n* `reviewers` - Reviewers\n* `-reviewers` - Reviewers (descending)\n* `static_finding` - Static finding\n* `-static_finding` - Static finding (descending)\n* `test__engagement__product__name` - Test  engagement  product  name\n* `-test__engagement__product__name` - Test  engagement  product  name (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `under_defect_review` - Under defect review\n* `-under_defect_review` - Under defect review (descending)\n* `under_review` - Under review\n* `-under_review` - Under review (descending)\n* `verified` - Verified\n* `-verified` - Verified (descending)\n* `priority` - Priority\n* `-priority` - Priority (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"out_of_scope","schema":{"type":"boolean"}},{"in":"query","name":"outside_of_sla","schema":{"type":"number"}},{"in":"query","name":"owners","schema":{"type":"array","items":{"type":"number"}},"description":"Findings owned by any of these groups (Dojo_Group ids, comma-separated)","explode":false,"style":"form"},{"in":"query","name":"owners_email","schema":{"type":"string"},"description":"owners_email"},{"in":"query","name":"owners_email_contains","schema":{"type":"string"},"description":"owners_email_contains"},{"in":"query","name":"param","schema":{"type":"string"}},{"in":"query","name":"payload","schema":{"type":"string"}},{"in":"query","name":"planned_remediation_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"planned_remediation_version","schema":{"type":"string"}},{"in":"query","name":"priority_max","schema":{"type":"number"},"description":"Return findings with a priority value less than the supplied value"},{"in":"query","name":"priority_min","schema":{"type":"number"},"description":"Return findings with a priority value greater than the supplied value"},{"in":"query","name":"product_lifecycle","schema":{"type":"string"},"description":"Comma separated list of exact Asset lifecycles"},{"in":"query","name":"product_name","schema":{"type":"string"},"description":"Exact Asset Name"},{"in":"query","name":"product_name_contains","schema":{"type":"string"},"description":"Asset Name Contains"},{"in":"query","name":"publish_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"ransomware_used","schema":{"type":"boolean"}},{"in":"query","name":"references","schema":{"type":"string"}},{"in":"query","name":"reporter","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"review_requested_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"reviewers","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"risk","schema":{"type":"string","enum":["Low","Medium","Needs Action","Urgent"]},"description":"The risk score in which a finding poses to the system it was discovered on\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},{"in":"query","name":"risk_acceptance","schema":{"type":"number"}},{"in":"query","name":"risk_accepted","schema":{"type":"boolean"}},{"in":"query","name":"sast_sink_object","schema":{"type":"string"}},{"in":"query","name":"sast_source_file_path","schema":{"type":"string"}},{"in":"query","name":"sast_source_line","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"sast_source_object","schema":{"type":"string"}},{"in":"query","name":"scanner_confidence","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"service","schema":{"type":"string"}},{"in":"query","name":"severity","schema":{"type":"string"}},{"in":"query","name":"severity_justification","schema":{"type":"string"}},{"in":"query","name":"sla_expiration_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"sla_start_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"sonarqube_issue","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"static_finding","schema":{"type":"boolean"}},{"in":"query","name":"steps_to_reproduce","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"test","schema":{"type":"integer"}},{"in":"query","name":"test__engagement","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__prod_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on Asset (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on Asset","explode":false,"style":"form"},{"in":"query","name":"test__engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on engagement (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__engagement__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on engagement","explode":false,"style":"form"},{"in":"query","name":"test__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on test (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on test","explode":false,"style":"form"},{"in":"query","name":"test__test_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title","schema":{"type":"string"}},{"in":"query","name":"under_defect_review","schema":{"type":"boolean"}},{"in":"query","name":"under_review","schema":{"type":"boolean"}},{"in":"query","name":"unique_id_from_tool","schema":{"type":"string"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"verified","schema":{"type":"boolean"}},{"in":"query","name":"vuln_id_from_tool","schema":{"type":"string"}},{"in":"query","name":"vulnerability_id","schema":{"type":"string"}}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRiskAcceptanceFindingRecordList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/close/":{"post":{"operationId":"findings_close_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingCloseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingCloseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingCloseRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingClose"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/copy/":{"post":{"operationId":"findings_copy_create","description":"Copy this finding to another test: in the same engagement, another engagement, or another product. Needs view on the finding and permission to add findings to the destination test. The copy carries notes, files, endpoints, tags and vulnerability ids, but not the JIRA link or finding group. It is deduplicated like any new finding, so with deduplication on, a copy in the same product is a duplicate of the original; to consolidate findings into one test, move them instead.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingRelocationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingRelocationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingRelocationRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingRelocationResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/delete_preview/":{"get":{"operationId":"findings_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/duplicate/":{"get":{"operationId":"findings_duplicate_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Finding"}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/duplicate/reset/":{"post":{"operationId":"findings_duplicate_reset_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/files/":{"get":{"operationId":"findings_files_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingToFiles"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"findings_files_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AddNewFileOptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/files/{file_id}/":{"delete":{"operationId":"findings_files_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"file_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/files/change_name/{file_id}/":{"patch":{"operationId":"findings_files_change_name_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"file_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFileNameRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFileNameRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFileNameRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/files/download/{file_id}/":{"get":{"operationId":"findings_files_download_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"file_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawFile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/history/":{"get":{"operationId":"findings_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"assignee","schema":{"type":"array","items":{"type":"number"}},"description":"Findings assigned to any of these users (user ids, comma-separated)","explode":false,"style":"form"},{"in":"query","name":"component_name","schema":{"type":"string"}},{"in":"query","name":"component_version","schema":{"type":"string"}},{"in":"query","name":"created","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was initially created, and saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"cvssv3","schema":{"type":"string"}},{"in":"query","name":"cvssv3_score","schema":{"type":"number","format":"float"}},{"in":"query","name":"cvssv4","schema":{"type":"string"}},{"in":"query","name":"cvssv4_score","schema":{"type":"number","format":"float"}},{"in":"query","name":"cwe","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"date","schema":{"type":"string","format":"date","enum":[1,2,3,4,5,6,7,null]},"description":"The date the flaw was discovered.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"defect_review_requested_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"discovered_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"discovered_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"discovered_on","schema":{"type":"string","format":"date"}},{"in":"query","name":"duplicate","schema":{"type":"boolean"}},{"in":"query","name":"duplicate_finding","schema":{"type":"integer"}},{"in":"query","name":"dynamic_finding","schema":{"type":"boolean"}},{"in":"query","name":"effort_for_fixing","schema":{"type":"string"}},{"in":"query","name":"endpoints","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"epss_percentile_max","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS percentiles to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_percentile_min","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS percentiles to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_score_max","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS score percentages to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_score_min","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS score percentages to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"exact_title","schema":{"type":"string"},"description":"Finding title exact match (case-insensitive)"},{"in":"query","name":"false_p","schema":{"type":"boolean"}},{"in":"query","name":"file_path","schema":{"type":"string"}},{"in":"query","name":"finding_group","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"fix_available","schema":{"type":"boolean"}},{"in":"query","name":"fix_version","schema":{"type":"string"}},{"in":"query","name":"found_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"has_jira","schema":{"type":"boolean"}},{"in":"query","name":"has_pending_exception","schema":{"type":"boolean"},"description":"Findings that are part of a risk acceptance nobody has decided yet. These are still active and still counted -- this is what a security-exception queue filters on."},{"in":"query","name":"has_sla","schema":{"type":"boolean"},"description":"true: findings with an SLA expiration date; false: findings with no SLA"},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"query","name":"hash_code","schema":{"type":"string"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"impact","schema":{"type":"string"}},{"in":"query","name":"inherited_tags","schema":{"type":"array","items":{"type":"array","items":{"type":"integer"}}},"description":"Internal use tags sepcifically for maintaining parity with product. This field will be present as a subset in the tags field","explode":true,"style":"form"},{"in":"query","name":"is_assigned","schema":{"type":"boolean"},"description":"true: findings somebody is assigned to; false: findings nobody has picked up"},{"in":"query","name":"is_mitigated","schema":{"type":"boolean"}},{"in":"query","name":"jira_change","schema":{"type":"string","format":"date-time","nullable":true,"title":"Jira last update","enum":[1,2,3,4,5,6,7,null]},"description":"The date the linked Jira issue was last modified.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"jira_creation","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"The date a Jira issue was created from this finding.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"kev_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"known_exploited","schema":{"type":"boolean"}},{"in":"query","name":"last_reviewed","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Provides the date the flaw was last 'touched' by a tester.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"last_reviewed_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"last_status_update","schema":{"type":"string","format":"date-time"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"mitigated","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Denotes if this flaw has been fixed by storing the date it was fixed.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"mitigated_after","schema":{"type":"string","format":"date-time"},"description":"Mitigated After"},{"in":"query","name":"mitigated_before","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"mitigated_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"mitigated_on","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"mitigation","schema":{"type":"string"}},{"in":"query","name":"mitigation_available","schema":{"type":"boolean"},"description":"Mitigation Available"},{"in":"query","name":"mitigation_policy","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"nb_occurences","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"not_test__engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"not_test__engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on engagement","explode":false,"style":"form"},{"in":"query","name":"not_test__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on test","explode":false,"style":"form"},{"in":"query","name":"numerical_severity","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active","-component_name","-component_version","-created","-cwe","-date","-duplicate","-dynamic_finding","-false_p","-found_by","-id","-is_mitigated","-last_reviewed","-last_status_update","-numerical_severity","-out_of_scope","-planned_remediation_date","-priority","-reviewers","-severity","-sla_expiration_date","-static_finding","-test__engagement__product__name","-title","-under_defect_review","-under_review","-verified","active","component_name","component_version","created","cwe","date","duplicate","dynamic_finding","false_p","found_by","id","is_mitigated","last_reviewed","last_status_update","numerical_severity","out_of_scope","planned_remediation_date","priority","reviewers","severity","sla_expiration_date","static_finding","test__engagement__product__name","title","under_defect_review","under_review","verified"]}},"description":"Ordering\n\n* `active` - Active\n* `-active` - Active (descending)\n* `component_name` - Component name\n* `-component_name` - Component name (descending)\n* `component_version` - Component version\n* `-component_version` - Component version (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `last_status_update` - Last status update\n* `-last_status_update` - Last status update (descending)\n* `last_reviewed` - Last reviewed\n* `-last_reviewed` - Last reviewed (descending)\n* `cwe` - Cwe\n* `-cwe` - Cwe (descending)\n* `date` - Date\n* `-date` - Date (descending)\n* `duplicate` - Duplicate\n* `-duplicate` - Duplicate (descending)\n* `dynamic_finding` - Dynamic finding\n* `-dynamic_finding` - Dynamic finding (descending)\n* `false_p` - False p\n* `-false_p` - False p (descending)\n* `found_by` - Found by\n* `-found_by` - Found by (descending)\n* `id` - Id\n* `-id` - Id (descending)\n* `is_mitigated` - Is mitigated\n* `-is_mitigated` - Is mitigated (descending)\n* `numerical_severity` - Numerical severity\n* `-numerical_severity` - Numerical severity (descending)\n* `out_of_scope` - Out of scope\n* `-out_of_scope` - Out of scope (descending)\n* `planned_remediation_date` - Planned remediation date\n* `-planned_remediation_date` - Planned remediation date (descending)\n* `severity` - Severity\n* `-severity` - Severity (descending)\n* `sla_expiration_date` - Sla expiration date\n* `-sla_expiration_date` - Sla expiration date (descending)\n* `reviewers` - Reviewers\n* `-reviewers` - Reviewers (descending)\n* `static_finding` - Static finding\n* `-static_finding` - Static finding (descending)\n* `test__engagement__product__name` - Test  engagement  product  name\n* `-test__engagement__product__name` - Test  engagement  product  name (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `under_defect_review` - Under defect review\n* `-under_defect_review` - Under defect review (descending)\n* `under_review` - Under review\n* `-under_review` - Under review (descending)\n* `verified` - Verified\n* `-verified` - Verified (descending)\n* `priority` - Priority\n* `-priority` - Priority (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"out_of_scope","schema":{"type":"boolean"}},{"in":"query","name":"outside_of_sla","schema":{"type":"number"}},{"in":"query","name":"owners","schema":{"type":"array","items":{"type":"number"}},"description":"Findings owned by any of these groups (Dojo_Group ids, comma-separated)","explode":false,"style":"form"},{"in":"query","name":"owners_email","schema":{"type":"string"},"description":"owners_email"},{"in":"query","name":"owners_email_contains","schema":{"type":"string"},"description":"owners_email_contains"},{"in":"query","name":"param","schema":{"type":"string"}},{"in":"query","name":"payload","schema":{"type":"string"}},{"in":"query","name":"planned_remediation_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"planned_remediation_version","schema":{"type":"string"}},{"in":"query","name":"priority_max","schema":{"type":"number"},"description":"Return findings with a priority value less than the supplied value"},{"in":"query","name":"priority_min","schema":{"type":"number"},"description":"Return findings with a priority value greater than the supplied value"},{"in":"query","name":"product_lifecycle","schema":{"type":"string"},"description":"Comma separated list of exact Asset lifecycles"},{"in":"query","name":"product_name","schema":{"type":"string"},"description":"Exact Asset Name"},{"in":"query","name":"product_name_contains","schema":{"type":"string"},"description":"Asset Name Contains"},{"in":"query","name":"publish_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"ransomware_used","schema":{"type":"boolean"}},{"in":"query","name":"references","schema":{"type":"string"}},{"in":"query","name":"reporter","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"review_requested_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"reviewers","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"risk","schema":{"type":"string","enum":["Low","Medium","Needs Action","Urgent"]},"description":"The risk score in which a finding poses to the system it was discovered on\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},{"in":"query","name":"risk_acceptance","schema":{"type":"number"}},{"in":"query","name":"risk_accepted","schema":{"type":"boolean"}},{"in":"query","name":"sast_sink_object","schema":{"type":"string"}},{"in":"query","name":"sast_source_file_path","schema":{"type":"string"}},{"in":"query","name":"sast_source_line","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"sast_source_object","schema":{"type":"string"}},{"in":"query","name":"scanner_confidence","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"service","schema":{"type":"string"}},{"in":"query","name":"severity","schema":{"type":"string"}},{"in":"query","name":"severity_justification","schema":{"type":"string"}},{"in":"query","name":"sla_expiration_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"sla_start_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"sonarqube_issue","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"static_finding","schema":{"type":"boolean"}},{"in":"query","name":"steps_to_reproduce","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"test","schema":{"type":"integer"}},{"in":"query","name":"test__engagement","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__prod_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on Asset (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on Asset","explode":false,"style":"form"},{"in":"query","name":"test__engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on engagement (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__engagement__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on engagement","explode":false,"style":"form"},{"in":"query","name":"test__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on test (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on test","explode":false,"style":"form"},{"in":"query","name":"test__test_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title","schema":{"type":"string"}},{"in":"query","name":"under_defect_review","schema":{"type":"boolean"}},{"in":"query","name":"under_review","schema":{"type":"boolean"}},{"in":"query","name":"unique_id_from_tool","schema":{"type":"string"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"verified","schema":{"type":"boolean"}},{"in":"query","name":"vuln_id_from_tool","schema":{"type":"string"}},{"in":"query","name":"vulnerability_id","schema":{"type":"string"}}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/history/legacy/":{"get":{"operationId":"findings_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"assignee","schema":{"type":"array","items":{"type":"number"}},"description":"Findings assigned to any of these users (user ids, comma-separated)","explode":false,"style":"form"},{"in":"query","name":"component_name","schema":{"type":"string"}},{"in":"query","name":"component_version","schema":{"type":"string"}},{"in":"query","name":"created","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was initially created, and saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"cvssv3","schema":{"type":"string"}},{"in":"query","name":"cvssv3_score","schema":{"type":"number","format":"float"}},{"in":"query","name":"cvssv4","schema":{"type":"string"}},{"in":"query","name":"cvssv4_score","schema":{"type":"number","format":"float"}},{"in":"query","name":"cwe","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"date","schema":{"type":"string","format":"date","enum":[1,2,3,4,5,6,7,null]},"description":"The date the flaw was discovered.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"defect_review_requested_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"discovered_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"discovered_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"discovered_on","schema":{"type":"string","format":"date"}},{"in":"query","name":"duplicate","schema":{"type":"boolean"}},{"in":"query","name":"duplicate_finding","schema":{"type":"integer"}},{"in":"query","name":"dynamic_finding","schema":{"type":"boolean"}},{"in":"query","name":"effort_for_fixing","schema":{"type":"string"}},{"in":"query","name":"endpoints","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"epss_percentile_max","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS percentiles to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_percentile_min","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS percentiles to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_score_max","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS score percentages to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_score_min","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS score percentages to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"exact_title","schema":{"type":"string"},"description":"Finding title exact match (case-insensitive)"},{"in":"query","name":"false_p","schema":{"type":"boolean"}},{"in":"query","name":"file_path","schema":{"type":"string"}},{"in":"query","name":"finding_group","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"fix_available","schema":{"type":"boolean"}},{"in":"query","name":"fix_version","schema":{"type":"string"}},{"in":"query","name":"found_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"has_jira","schema":{"type":"boolean"}},{"in":"query","name":"has_pending_exception","schema":{"type":"boolean"},"description":"Findings that are part of a risk acceptance nobody has decided yet. These are still active and still counted -- this is what a security-exception queue filters on."},{"in":"query","name":"has_sla","schema":{"type":"boolean"},"description":"true: findings with an SLA expiration date; false: findings with no SLA"},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"query","name":"hash_code","schema":{"type":"string"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"impact","schema":{"type":"string"}},{"in":"query","name":"inherited_tags","schema":{"type":"array","items":{"type":"array","items":{"type":"integer"}}},"description":"Internal use tags sepcifically for maintaining parity with product. This field will be present as a subset in the tags field","explode":true,"style":"form"},{"in":"query","name":"is_assigned","schema":{"type":"boolean"},"description":"true: findings somebody is assigned to; false: findings nobody has picked up"},{"in":"query","name":"is_mitigated","schema":{"type":"boolean"}},{"in":"query","name":"jira_change","schema":{"type":"string","format":"date-time","nullable":true,"title":"Jira last update","enum":[1,2,3,4,5,6,7,null]},"description":"The date the linked Jira issue was last modified.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"jira_creation","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"The date a Jira issue was created from this finding.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"kev_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"known_exploited","schema":{"type":"boolean"}},{"in":"query","name":"last_reviewed","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Provides the date the flaw was last 'touched' by a tester.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"last_reviewed_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"last_status_update","schema":{"type":"string","format":"date-time"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"mitigated","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Denotes if this flaw has been fixed by storing the date it was fixed.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"mitigated_after","schema":{"type":"string","format":"date-time"},"description":"Mitigated After"},{"in":"query","name":"mitigated_before","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"mitigated_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"mitigated_on","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"mitigation","schema":{"type":"string"}},{"in":"query","name":"mitigation_available","schema":{"type":"boolean"},"description":"Mitigation Available"},{"in":"query","name":"mitigation_policy","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"nb_occurences","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"not_test__engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"not_test__engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on engagement","explode":false,"style":"form"},{"in":"query","name":"not_test__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on test","explode":false,"style":"form"},{"in":"query","name":"numerical_severity","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active","-component_name","-component_version","-created","-cwe","-date","-duplicate","-dynamic_finding","-false_p","-found_by","-id","-is_mitigated","-last_reviewed","-last_status_update","-numerical_severity","-out_of_scope","-planned_remediation_date","-priority","-reviewers","-severity","-sla_expiration_date","-static_finding","-test__engagement__product__name","-title","-under_defect_review","-under_review","-verified","active","component_name","component_version","created","cwe","date","duplicate","dynamic_finding","false_p","found_by","id","is_mitigated","last_reviewed","last_status_update","numerical_severity","out_of_scope","planned_remediation_date","priority","reviewers","severity","sla_expiration_date","static_finding","test__engagement__product__name","title","under_defect_review","under_review","verified"]}},"description":"Ordering\n\n* `active` - Active\n* `-active` - Active (descending)\n* `component_name` - Component name\n* `-component_name` - Component name (descending)\n* `component_version` - Component version\n* `-component_version` - Component version (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `last_status_update` - Last status update\n* `-last_status_update` - Last status update (descending)\n* `last_reviewed` - Last reviewed\n* `-last_reviewed` - Last reviewed (descending)\n* `cwe` - Cwe\n* `-cwe` - Cwe (descending)\n* `date` - Date\n* `-date` - Date (descending)\n* `duplicate` - Duplicate\n* `-duplicate` - Duplicate (descending)\n* `dynamic_finding` - Dynamic finding\n* `-dynamic_finding` - Dynamic finding (descending)\n* `false_p` - False p\n* `-false_p` - False p (descending)\n* `found_by` - Found by\n* `-found_by` - Found by (descending)\n* `id` - Id\n* `-id` - Id (descending)\n* `is_mitigated` - Is mitigated\n* `-is_mitigated` - Is mitigated (descending)\n* `numerical_severity` - Numerical severity\n* `-numerical_severity` - Numerical severity (descending)\n* `out_of_scope` - Out of scope\n* `-out_of_scope` - Out of scope (descending)\n* `planned_remediation_date` - Planned remediation date\n* `-planned_remediation_date` - Planned remediation date (descending)\n* `severity` - Severity\n* `-severity` - Severity (descending)\n* `sla_expiration_date` - Sla expiration date\n* `-sla_expiration_date` - Sla expiration date (descending)\n* `reviewers` - Reviewers\n* `-reviewers` - Reviewers (descending)\n* `static_finding` - Static finding\n* `-static_finding` - Static finding (descending)\n* `test__engagement__product__name` - Test  engagement  product  name\n* `-test__engagement__product__name` - Test  engagement  product  name (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `under_defect_review` - Under defect review\n* `-under_defect_review` - Under defect review (descending)\n* `under_review` - Under review\n* `-under_review` - Under review (descending)\n* `verified` - Verified\n* `-verified` - Verified (descending)\n* `priority` - Priority\n* `-priority` - Priority (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"out_of_scope","schema":{"type":"boolean"}},{"in":"query","name":"outside_of_sla","schema":{"type":"number"}},{"in":"query","name":"owners","schema":{"type":"array","items":{"type":"number"}},"description":"Findings owned by any of these groups (Dojo_Group ids, comma-separated)","explode":false,"style":"form"},{"in":"query","name":"owners_email","schema":{"type":"string"},"description":"owners_email"},{"in":"query","name":"owners_email_contains","schema":{"type":"string"},"description":"owners_email_contains"},{"in":"query","name":"param","schema":{"type":"string"}},{"in":"query","name":"payload","schema":{"type":"string"}},{"in":"query","name":"planned_remediation_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"planned_remediation_version","schema":{"type":"string"}},{"in":"query","name":"priority_max","schema":{"type":"number"},"description":"Return findings with a priority value less than the supplied value"},{"in":"query","name":"priority_min","schema":{"type":"number"},"description":"Return findings with a priority value greater than the supplied value"},{"in":"query","name":"product_lifecycle","schema":{"type":"string"},"description":"Comma separated list of exact Asset lifecycles"},{"in":"query","name":"product_name","schema":{"type":"string"},"description":"Exact Asset Name"},{"in":"query","name":"product_name_contains","schema":{"type":"string"},"description":"Asset Name Contains"},{"in":"query","name":"publish_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"ransomware_used","schema":{"type":"boolean"}},{"in":"query","name":"references","schema":{"type":"string"}},{"in":"query","name":"reporter","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"review_requested_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"reviewers","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"risk","schema":{"type":"string","enum":["Low","Medium","Needs Action","Urgent"]},"description":"The risk score in which a finding poses to the system it was discovered on\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},{"in":"query","name":"risk_acceptance","schema":{"type":"number"}},{"in":"query","name":"risk_accepted","schema":{"type":"boolean"}},{"in":"query","name":"sast_sink_object","schema":{"type":"string"}},{"in":"query","name":"sast_source_file_path","schema":{"type":"string"}},{"in":"query","name":"sast_source_line","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"sast_source_object","schema":{"type":"string"}},{"in":"query","name":"scanner_confidence","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"service","schema":{"type":"string"}},{"in":"query","name":"severity","schema":{"type":"string"}},{"in":"query","name":"severity_justification","schema":{"type":"string"}},{"in":"query","name":"sla_expiration_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"sla_start_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"sonarqube_issue","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"static_finding","schema":{"type":"boolean"}},{"in":"query","name":"steps_to_reproduce","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"test","schema":{"type":"integer"}},{"in":"query","name":"test__engagement","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__prod_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on Asset (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on Asset","explode":false,"style":"form"},{"in":"query","name":"test__engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on engagement (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__engagement__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on engagement","explode":false,"style":"form"},{"in":"query","name":"test__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on test (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on test","explode":false,"style":"form"},{"in":"query","name":"test__test_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title","schema":{"type":"string"}},{"in":"query","name":"under_defect_review","schema":{"type":"boolean"}},{"in":"query","name":"under_review","schema":{"type":"boolean"}},{"in":"query","name":"unique_id_from_tool","schema":{"type":"string"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"verified","schema":{"type":"boolean"}},{"in":"query","name":"vuln_id_from_tool","schema":{"type":"string"}},{"in":"query","name":"vulnerability_id","schema":{"type":"string"}}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/history/legacy/count/":{"get":{"operationId":"findings_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/metadata/":{"get":{"operationId":"findings_metadata_retrieve","description":"Finding metadata endpoint.\n\nFlag off: the OSS DojoMeta-backed action, unchanged. Flag on: finding metadata is replaced\nby the typed Custom Fields subsystem, so this 404s (read and write custom fields through\n``/api/vue/custom_field_values/`` instead).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Findings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"findings_metadata_create","description":"Finding metadata endpoint.\n\nFlag off: the OSS DojoMeta-backed action, unchanged. Flag on: finding metadata is replaced\nby the typed Custom Fields subsystem, so this 404s (read and write custom fields through\n``/api/vue/custom_field_values/`` instead).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingCreateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingCreate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"findings_metadata_update","description":"Finding metadata endpoint.\n\nFlag off: the OSS DojoMeta-backed action, unchanged. Flag on: finding metadata is replaced\nby the typed Custom Fields subsystem, so this 404s (read and write custom fields through\n``/api/vue/custom_field_values/`` instead).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Findings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"findings_metadata_partial_update","description":"Finding metadata endpoint.\n\nFlag off: the OSS DojoMeta-backed action, unchanged. Flag on: finding metadata is replaced\nby the typed Custom Fields subsystem, so this 404s (read and write custom fields through\n``/api/vue/custom_field_values/`` instead).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFindingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFindingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFindingsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Findings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"findings_metadata_destroy","description":"Finding metadata endpoint.\n\nFlag off: the OSS DojoMeta-backed action, unchanged. Flag on: finding metadata is replaced\nby the typed Custom Fields subsystem, so this 404s (read and write custom fields through\n``/api/vue/custom_field_values/`` instead).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/move/":{"post":{"operationId":"findings_move_create","description":"Move this finding to another test: in the same engagement, another engagement, or another product. Needs edit on the finding and permission to add findings to the destination test. Endpoints move with the finding; finding-group membership is dropped, and risk acceptances are dropped when the engagement changes.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingRelocationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingRelocationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingRelocationRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingRelocationResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/notes/":{"get":{"operationId":"findings_notes_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingToNotes"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"findings_notes_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Note"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/original/{new_fid}/":{"post":{"operationId":"findings_original_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true},{"in":"path","name":"new_fid","schema":{"type":"integer"},"required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/remove_note/":{"patch":{"operationId":"findings_remove_note_partial_update","description":"Remove Note From Finding Note","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFindingNoteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFindingNoteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFindingNoteRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/remove_tags/":{"put":{"operationId":"findings_remove_tags_update","description":"Standalone finding-tag REMOVE (the OSS ``remove_tags`` @action): subtract the submitted tags.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Findings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"findings_remove_tags_partial_update","description":"Standalone finding-tag REMOVE (the OSS ``remove_tags`` @action): subtract the submitted tags.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFindingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFindingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFindingsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Findings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/request_response/":{"get":{"operationId":"findings_request_response_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"findings_request_response_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/tags/":{"get":{"operationId":"findings_tags_retrieve","description":"Standalone finding-tag endpoint (the OSS ``tags`` @action): GET returns the tag set, POST\nunion-adds the submitted tags.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Findings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"findings_tags_create","description":"Standalone finding-tag endpoint (the OSS ``tags`` @action): GET returns the tag set, POST\nunion-adds the submitted tags.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingCreateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingCreate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/{id}/verify/":{"post":{"operationId":"findings_verify_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this finding.","required":true}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingVerifyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingVerifyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingVerifyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Finding"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/accept_risks/":{"post":{"operationId":"findings_accept_risks_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"assignee","schema":{"type":"array","items":{"type":"number"}},"description":"Findings assigned to any of these users (user ids, comma-separated)","explode":false,"style":"form"},{"in":"query","name":"component_name","schema":{"type":"string"}},{"in":"query","name":"component_version","schema":{"type":"string"}},{"in":"query","name":"created","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was initially created, and saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"cvssv3","schema":{"type":"string"}},{"in":"query","name":"cvssv3_score","schema":{"type":"number","format":"float"}},{"in":"query","name":"cvssv4","schema":{"type":"string"}},{"in":"query","name":"cvssv4_score","schema":{"type":"number","format":"float"}},{"in":"query","name":"cwe","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"date","schema":{"type":"string","format":"date","enum":[1,2,3,4,5,6,7,null]},"description":"The date the flaw was discovered.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"defect_review_requested_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"discovered_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"discovered_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"discovered_on","schema":{"type":"string","format":"date"}},{"in":"query","name":"duplicate","schema":{"type":"boolean"}},{"in":"query","name":"duplicate_finding","schema":{"type":"integer"}},{"in":"query","name":"dynamic_finding","schema":{"type":"boolean"}},{"in":"query","name":"effort_for_fixing","schema":{"type":"string"}},{"in":"query","name":"endpoints","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"epss_percentile_max","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS percentiles to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_percentile_min","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS percentiles to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_score_max","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS score percentages to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"epss_score_min","schema":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true},"description":"The range of EPSS score percentages to filter on; the min input is a lower bound, the max is an upper bound. Leaving one empty will skip that bound (e.g., leaving the min bound input empty will filter only on the max bound -- filtering on \"less than or equal\"). Leading 0 required."},{"in":"query","name":"exact_title","schema":{"type":"string"},"description":"Finding title exact match (case-insensitive)"},{"in":"query","name":"false_p","schema":{"type":"boolean"}},{"in":"query","name":"file_path","schema":{"type":"string"}},{"in":"query","name":"finding_group","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"fix_available","schema":{"type":"boolean"}},{"in":"query","name":"fix_version","schema":{"type":"string"}},{"in":"query","name":"found_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"has_jira","schema":{"type":"boolean"}},{"in":"query","name":"has_pending_exception","schema":{"type":"boolean"},"description":"Findings that are part of a risk acceptance nobody has decided yet. These are still active and still counted -- this is what a security-exception queue filters on."},{"in":"query","name":"has_sla","schema":{"type":"boolean"},"description":"true: findings with an SLA expiration date; false: findings with no SLA"},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"query","name":"hash_code","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"impact","schema":{"type":"string"}},{"in":"query","name":"inherited_tags","schema":{"type":"array","items":{"type":"array","items":{"type":"integer"}}},"description":"Internal use tags sepcifically for maintaining parity with product. This field will be present as a subset in the tags field","explode":true,"style":"form"},{"in":"query","name":"is_assigned","schema":{"type":"boolean"},"description":"true: findings somebody is assigned to; false: findings nobody has picked up"},{"in":"query","name":"is_mitigated","schema":{"type":"boolean"}},{"in":"query","name":"jira_change","schema":{"type":"string","format":"date-time","nullable":true,"title":"Jira last update","enum":[1,2,3,4,5,6,7,null]},"description":"The date the linked Jira issue was last modified.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"jira_creation","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"The date a Jira issue was created from this finding.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"kev_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"known_exploited","schema":{"type":"boolean"}},{"in":"query","name":"last_reviewed","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Provides the date the flaw was last 'touched' by a tester.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"last_reviewed_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"last_status_update","schema":{"type":"string","format":"date-time"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"mitigated","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Denotes if this flaw has been fixed by storing the date it was fixed.\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"mitigated_after","schema":{"type":"string","format":"date-time"},"description":"Mitigated After"},{"in":"query","name":"mitigated_before","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"mitigated_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"mitigated_on","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"mitigation","schema":{"type":"string"}},{"in":"query","name":"mitigation_available","schema":{"type":"boolean"},"description":"Mitigation Available"},{"in":"query","name":"mitigation_policy","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"nb_occurences","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"not_test__engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"not_test__engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on engagement","explode":false,"style":"form"},{"in":"query","name":"not_test__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on test","explode":false,"style":"form"},{"in":"query","name":"numerical_severity","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active","-component_name","-component_version","-created","-cwe","-date","-duplicate","-dynamic_finding","-false_p","-found_by","-id","-is_mitigated","-last_reviewed","-last_status_update","-numerical_severity","-out_of_scope","-planned_remediation_date","-priority","-reviewers","-severity","-sla_expiration_date","-static_finding","-test__engagement__product__name","-title","-under_defect_review","-under_review","-verified","active","component_name","component_version","created","cwe","date","duplicate","dynamic_finding","false_p","found_by","id","is_mitigated","last_reviewed","last_status_update","numerical_severity","out_of_scope","planned_remediation_date","priority","reviewers","severity","sla_expiration_date","static_finding","test__engagement__product__name","title","under_defect_review","under_review","verified"]}},"description":"Ordering\n\n* `active` - Active\n* `-active` - Active (descending)\n* `component_name` - Component name\n* `-component_name` - Component name (descending)\n* `component_version` - Component version\n* `-component_version` - Component version (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `last_status_update` - Last status update\n* `-last_status_update` - Last status update (descending)\n* `last_reviewed` - Last reviewed\n* `-last_reviewed` - Last reviewed (descending)\n* `cwe` - Cwe\n* `-cwe` - Cwe (descending)\n* `date` - Date\n* `-date` - Date (descending)\n* `duplicate` - Duplicate\n* `-duplicate` - Duplicate (descending)\n* `dynamic_finding` - Dynamic finding\n* `-dynamic_finding` - Dynamic finding (descending)\n* `false_p` - False p\n* `-false_p` - False p (descending)\n* `found_by` - Found by\n* `-found_by` - Found by (descending)\n* `id` - Id\n* `-id` - Id (descending)\n* `is_mitigated` - Is mitigated\n* `-is_mitigated` - Is mitigated (descending)\n* `numerical_severity` - Numerical severity\n* `-numerical_severity` - Numerical severity (descending)\n* `out_of_scope` - Out of scope\n* `-out_of_scope` - Out of scope (descending)\n* `planned_remediation_date` - Planned remediation date\n* `-planned_remediation_date` - Planned remediation date (descending)\n* `severity` - Severity\n* `-severity` - Severity (descending)\n* `sla_expiration_date` - Sla expiration date\n* `-sla_expiration_date` - Sla expiration date (descending)\n* `reviewers` - Reviewers\n* `-reviewers` - Reviewers (descending)\n* `static_finding` - Static finding\n* `-static_finding` - Static finding (descending)\n* `test__engagement__product__name` - Test  engagement  product  name\n* `-test__engagement__product__name` - Test  engagement  product  name (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `under_defect_review` - Under defect review\n* `-under_defect_review` - Under defect review (descending)\n* `under_review` - Under review\n* `-under_review` - Under review (descending)\n* `verified` - Verified\n* `-verified` - Verified (descending)\n* `priority` - Priority\n* `-priority` - Priority (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"out_of_scope","schema":{"type":"boolean"}},{"in":"query","name":"outside_of_sla","schema":{"type":"number"}},{"in":"query","name":"owners","schema":{"type":"array","items":{"type":"number"}},"description":"Findings owned by any of these groups (Dojo_Group ids, comma-separated)","explode":false,"style":"form"},{"in":"query","name":"owners_email","schema":{"type":"string"},"description":"owners_email"},{"in":"query","name":"owners_email_contains","schema":{"type":"string"},"description":"owners_email_contains"},{"in":"query","name":"param","schema":{"type":"string"}},{"in":"query","name":"payload","schema":{"type":"string"}},{"in":"query","name":"planned_remediation_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"planned_remediation_version","schema":{"type":"string"}},{"in":"query","name":"priority_max","schema":{"type":"number"},"description":"Return findings with a priority value less than the supplied value"},{"in":"query","name":"priority_min","schema":{"type":"number"},"description":"Return findings with a priority value greater than the supplied value"},{"in":"query","name":"product_lifecycle","schema":{"type":"string"},"description":"Comma separated list of exact Asset lifecycles"},{"in":"query","name":"product_name","schema":{"type":"string"},"description":"Exact Asset Name"},{"in":"query","name":"product_name_contains","schema":{"type":"string"},"description":"Asset Name Contains"},{"in":"query","name":"publish_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"ransomware_used","schema":{"type":"boolean"}},{"in":"query","name":"references","schema":{"type":"string"}},{"in":"query","name":"reporter","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"review_requested_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"reviewers","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"risk","schema":{"type":"string","enum":["Low","Medium","Needs Action","Urgent"]},"description":"The risk score in which a finding poses to the system it was discovered on\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},{"in":"query","name":"risk_acceptance","schema":{"type":"number"}},{"in":"query","name":"risk_accepted","schema":{"type":"boolean"}},{"in":"query","name":"sast_sink_object","schema":{"type":"string"}},{"in":"query","name":"sast_source_file_path","schema":{"type":"string"}},{"in":"query","name":"sast_source_line","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"sast_source_object","schema":{"type":"string"}},{"in":"query","name":"scanner_confidence","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"service","schema":{"type":"string"}},{"in":"query","name":"severity","schema":{"type":"string"}},{"in":"query","name":"severity_justification","schema":{"type":"string"}},{"in":"query","name":"sla_expiration_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"sla_start_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"sonarqube_issue","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"static_finding","schema":{"type":"boolean"}},{"in":"query","name":"steps_to_reproduce","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"test","schema":{"type":"integer"}},{"in":"query","name":"test__engagement","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__prod_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on Asset (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__engagement__product__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on Asset","explode":false,"style":"form"},{"in":"query","name":"test__engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on engagement (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__engagement__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on engagement","explode":false,"style":"form"},{"in":"query","name":"test__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on test (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"test__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on test","explode":false,"style":"form"},{"in":"query","name":"test__test_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title","schema":{"type":"string"}},{"in":"query","name":"under_defect_review","schema":{"type":"boolean"}},{"in":"query","name":"under_review","schema":{"type":"boolean"}},{"in":"query","name":"unique_id_from_tool","schema":{"type":"string"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"verified","schema":{"type":"boolean"}},{"in":"query","name":"vuln_id_from_tool","schema":{"type":"string"}},{"in":"query","name":"vulnerability_id","schema":{"type":"string"}}],"tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AcceptedRiskRequest"}}},"application/x-www-form-urlencoded":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AcceptedRiskRequest"}}},"multipart/form-data":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AcceptedRiskRequest"}}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRiskAcceptanceList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/bulk_copy/":{"post":{"operationId":"findings_bulk_copy_create","description":"Queue a copy of up to 1000 findings to another test. The findings are copied by a background task, so the response reports what was queued, not the outcome. Findings that do not exist or that the caller may not view are skipped and reported, and the destination is authorized before anything is queued.","tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkFindingRelocationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BulkFindingRelocationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BulkFindingRelocationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingRelocationQueued"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/bulk_move/":{"post":{"operationId":"findings_bulk_move_create","description":"Queue a move of up to 1000 findings to another test. The findings are moved by a background task, so the response reports what was queued, not the outcome. Findings that do not exist or that the caller may not edit are skipped and reported, and the destination is authorized before anything is queued.","tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkFindingRelocationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BulkFindingRelocationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BulkFindingRelocationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingRelocationQueued"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/generate_report/":{"post":{"operationId":"findings_generate_report_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/findings/merge/":{"post":{"operationId":"findings_merge_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingMergeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingMergeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingMergeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingMerge"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/framework_presets/":{"get":{"operationId":"framework_presets_list","description":"Framework presets: bundled ones are read-only, custom ones are writable.\n\n``plan`` records what applying the preset would do without writing a setting; ``apply`` executes\na plan the caller has seen; ``checks`` answers the preset's named checks for a scope; ``export``\nhands out the portable envelope that ``import`` accepts on another instance. Every write here\nneeds the SLA configuration add and change permissions, because a preset writes SLA\nconfigurations; reads need the view permission.","parameters":[{"in":"query","name":"bundled","schema":{"type":"boolean"}},{"in":"query","name":"framework","schema":{"type":"string"}},{"in":"query","name":"framework__icontains","schema":{"type":"string"}},{"in":"query","name":"key","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"superseded","schema":{"type":"boolean"},"description":"true: only presets a newer version has replaced; false: only current presets."}],"tags":["framework_presets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedFrameworkPresetList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"framework_presets_create","description":"Framework presets: bundled ones are read-only, custom ones are writable.\n\n``plan`` records what applying the preset would do without writing a setting; ``apply`` executes\na plan the caller has seen; ``checks`` answers the preset's named checks for a scope; ``export``\nhands out the portable envelope that ``import`` accepts on another instance. Every write here\nneeds the SLA configuration add and change permissions, because a preset writes SLA\nconfigurations; reads need the view permission.","tags":["framework_presets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameworkPresetRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FrameworkPresetRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FrameworkPresetRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameworkPreset"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/framework_presets/{id}/":{"get":{"operationId":"framework_presets_retrieve","description":"Framework presets: bundled ones are read-only, custom ones are writable.\n\n``plan`` records what applying the preset would do without writing a setting; ``apply`` executes\na plan the caller has seen; ``checks`` answers the preset's named checks for a scope; ``export``\nhands out the portable envelope that ``import`` accepts on another instance. Every write here\nneeds the SLA configuration add and change permissions, because a preset writes SLA\nconfigurations; reads need the view permission.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this framework preset.","required":true}],"tags":["framework_presets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameworkPreset"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"framework_presets_update","description":"Framework presets: bundled ones are read-only, custom ones are writable.\n\n``plan`` records what applying the preset would do without writing a setting; ``apply`` executes\na plan the caller has seen; ``checks`` answers the preset's named checks for a scope; ``export``\nhands out the portable envelope that ``import`` accepts on another instance. Every write here\nneeds the SLA configuration add and change permissions, because a preset writes SLA\nconfigurations; reads need the view permission.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this framework preset.","required":true}],"tags":["framework_presets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameworkPresetRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FrameworkPresetRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FrameworkPresetRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameworkPreset"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"framework_presets_partial_update","description":"Framework presets: bundled ones are read-only, custom ones are writable.\n\n``plan`` records what applying the preset would do without writing a setting; ``apply`` executes\na plan the caller has seen; ``checks`` answers the preset's named checks for a scope; ``export``\nhands out the portable envelope that ``import`` accepts on another instance. Every write here\nneeds the SLA configuration add and change permissions, because a preset writes SLA\nconfigurations; reads need the view permission.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this framework preset.","required":true}],"tags":["framework_presets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFrameworkPresetRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFrameworkPresetRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFrameworkPresetRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameworkPreset"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"framework_presets_destroy","description":"Framework presets: bundled ones are read-only, custom ones are writable.\n\n``plan`` records what applying the preset would do without writing a setting; ``apply`` executes\na plan the caller has seen; ``checks`` answers the preset's named checks for a scope; ``export``\nhands out the portable envelope that ``import`` accepts on another instance. Every write here\nneeds the SLA configuration add and change permissions, because a preset writes SLA\nconfigurations; reads need the view permission.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this framework preset.","required":true}],"tags":["framework_presets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/framework_presets/{id}/apply/":{"post":{"operationId":"framework_presets_apply_create","description":"Framework presets: bundled ones are read-only, custom ones are writable.\n\n``plan`` records what applying the preset would do without writing a setting; ``apply`` executes\na plan the caller has seen; ``checks`` answers the preset's named checks for a scope; ``export``\nhands out the portable envelope that ``import`` accepts on another instance. Every write here\nneeds the SLA configuration add and change permissions, because a preset writes SLA\nconfigurations; reads need the view permission.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this framework preset.","required":true}],"tags":["framework_presets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresetApplyRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PresetApplyRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PresetApplyRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresetApplication"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/framework_presets/{id}/checks/":{"get":{"operationId":"framework_presets_checks_list","description":"Framework presets: bundled ones are read-only, custom ones are writable.\n\n``plan`` records what applying the preset would do without writing a setting; ``apply`` executes\na plan the caller has seen; ``checks`` answers the preset's named checks for a scope; ``export``\nhands out the portable envelope that ``import`` accepts on another instance. Every write here\nneeds the SLA configuration add and change permissions, because a preset writes SLA\nconfigurations; reads need the view permission.","parameters":[{"in":"query","name":"bundled","schema":{"type":"boolean"}},{"in":"query","name":"framework","schema":{"type":"string"}},{"in":"query","name":"framework__icontains","schema":{"type":"string"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this framework preset.","required":true},{"in":"query","name":"key","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"scope_product","schema":{"type":"integer","nullable":true}},{"in":"query","name":"scope_product_type","schema":{"type":"integer","nullable":true}},{"in":"query","name":"scope_type","schema":{"enum":["instance","product_type","product"],"type":"string","x-spec-enum-id":"244477cf639989fa","default":"instance","minLength":1},"description":"* `instance` - Whole instance\n* `product_type` - One product type\n* `product` - One product"},{"in":"query","name":"superseded","schema":{"type":"boolean"},"description":"true: only presets a newer version has replaced; false: only current presets."},{"in":"query","name":"variant","schema":{"type":"string","default":""}}],"tags":["framework_presets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPresetCheckAnswerList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/framework_presets/{id}/export/":{"get":{"operationId":"framework_presets_export_retrieve","description":"Framework presets: bundled ones are read-only, custom ones are writable.\n\n``plan`` records what applying the preset would do without writing a setting; ``apply`` executes\na plan the caller has seen; ``checks`` answers the preset's named checks for a scope; ``export``\nhands out the portable envelope that ``import`` accepts on another instance. Every write here\nneeds the SLA configuration add and change permissions, because a preset writes SLA\nconfigurations; reads need the view permission.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this framework preset.","required":true}],"tags":["framework_presets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/framework_presets/{id}/plan/":{"post":{"operationId":"framework_presets_plan_create","description":"Framework presets: bundled ones are read-only, custom ones are writable.\n\n``plan`` records what applying the preset would do without writing a setting; ``apply`` executes\na plan the caller has seen; ``checks`` answers the preset's named checks for a scope; ``export``\nhands out the portable envelope that ``import`` accepts on another instance. Every write here\nneeds the SLA configuration add and change permissions, because a preset writes SLA\nconfigurations; reads need the view permission.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this framework preset.","required":true}],"tags":["framework_presets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresetPlanRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PresetPlanRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PresetPlanRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresetApplication"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/framework_presets/import/":{"post":{"operationId":"framework_presets_import_create","description":"Framework presets: bundled ones are read-only, custom ones are writable.\n\n``plan`` records what applying the preset would do without writing a setting; ``apply`` executes\na plan the caller has seen; ``checks`` answers the preset's named checks for a scope; ``export``\nhands out the portable envelope that ``import`` accepts on another instance. Every write here\nneeds the SLA configuration add and change permissions, because a preset writes SLA\nconfigurations; reads need the view permission.","tags":["framework_presets"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresetImportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PresetImportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PresetImportRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrameworkPreset"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/framework_presets/schema/":{"get":{"operationId":"framework_presets_schema_retrieve","description":"The vendored JSON schema a definition is validated against, so a file can be checked before upload.","tags":["framework_presets"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/generated_reports/":{"get":{"operationId":"generated_reports_list","parameters":[{"in":"query","name":"completed_at","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"completed_at_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"completed_at_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"completed_at_during","schema":{"type":"string"}},{"in":"query","name":"completed_at_on","schema":{"type":"string"}},{"in":"query","name":"completed_at_past_days","schema":{"type":"number"}},{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"error_message","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"file_format","schema":{"type":"string"}},{"in":"query","name":"file_format_not","schema":{"type":"string"}},{"in":"query","name":"file_path","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-completed_at","-created","-id","-name","-requested_at","-requested_by","-template_description","-template_name","-updated","completed_at","created","id","name","requested_at","requested_by","template_description","template_name","updated"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `template_name` - Template name\n* `-template_name` - Template name (descending)\n* `template_description` - Template description\n* `-template_description` - Template description (descending)\n* `requested_at` - Requested at\n* `-requested_at` - Requested at (descending)\n* `completed_at` - Completed at\n* `-completed_at` - Completed at (descending)\n* `requested_by` - Requested by\n* `-requested_by` - Requested by (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"processing_deadline","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"requested_at","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"requested_at_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"requested_at_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"requested_at_during","schema":{"type":"string"}},{"in":"query","name":"requested_at_on","schema":{"type":"string"}},{"in":"query","name":"requested_at_past_days","schema":{"type":"number"}},{"in":"query","name":"requested_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"requested_by_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, template__name"},{"in":"query","name":"status","schema":{"type":"string"}},{"in":"query","name":"status_not","schema":{"type":"string"}},{"in":"query","name":"template","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"template_created_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"template_created_by_not","schema":{"type":"string"}},{"in":"query","name":"template_description_contains","schema":{"type":"string"}},{"in":"query","name":"template_description_ends_with","schema":{"type":"string"}},{"in":"query","name":"template_description_exact","schema":{"type":"string"}},{"in":"query","name":"template_description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"template_description_not_contains","schema":{"type":"string"}},{"in":"query","name":"template_description_not_exact","schema":{"type":"string"}},{"in":"query","name":"template_description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"template_description_not_regex","schema":{"type":"string"}},{"in":"query","name":"template_description_regex","schema":{"type":"string"}},{"in":"query","name":"template_description_starts_with","schema":{"type":"string"}},{"in":"query","name":"template_name_contains","schema":{"type":"string"}},{"in":"query","name":"template_name_ends_with","schema":{"type":"string"}},{"in":"query","name":"template_name_exact","schema":{"type":"string"}},{"in":"query","name":"template_name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"template_name_not_contains","schema":{"type":"string"}},{"in":"query","name":"template_name_not_exact","schema":{"type":"string"}},{"in":"query","name":"template_name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"template_name_not_regex","schema":{"type":"string"}},{"in":"query","name":"template_name_regex","schema":{"type":"string"}},{"in":"query","name":"template_name_starts_with","schema":{"type":"string"}},{"in":"query","name":"template_not","schema":{"type":"string"}},{"in":"query","name":"text_path","schema":{"type":"string"}},{"in":"query","name":"text_truncated","schema":{"type":"boolean"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["generated_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProGeneratedReportListList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"generated_reports_create","tags":["generated_reports"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProGeneratedReportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProGeneratedReportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProGeneratedReportRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProGeneratedReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/generated_reports/{id}/":{"get":{"operationId":"generated_reports_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Generated Report.","required":true}],"tags":["generated_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProGeneratedReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"generated_reports_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Generated Report.","required":true}],"tags":["generated_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/generated_reports/{id}/content/":{"get":{"operationId":"generated_reports_content_retrieve","description":"A bounded plain-text excerpt of a completed report, for LLM agents that cannot consume the PDF/HTML file. The text is produced once, when the report is generated, and capped there; this call reads at most max_bytes of it. content is null for a report with no text rendition (CSV, XLSX and JSON reports, or reports generated before this existed): use download/ instead. 404 File not ready until the report is completed.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Generated Report.","required":true},{"in":"query","name":"max_bytes","schema":{"type":"integer"},"description":"Most bytes of text to return (UTF-8). Defaults to 65536; values above the server ceiling (262144) are clamped, values below 1 are rejected."}],"tags":["generated_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratedReportContent"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/generated_reports/{id}/download/":{"get":{"operationId":"generated_reports_download_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Generated Report.","required":true}],"tags":["generated_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProGeneratedReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/generated_reports/quick_report/":{"post":{"operationId":"generated_reports_quick_report_create","description":"Generate a Quick Export scoped to the request's findings filters.\n\nBy default this uses the hidden system \"Quick Report Template\" (the generic\nfindings table); when template_id is supplied it applies that (non-system) Report\nEngine template instead. The current findings filters are applied at render time\nvia runtime_filters rather than being stored on any shared block. name is the\nreport's list label; blank falls back to the template name in the list.\nchart_snapshots carries the browser-captured graph images for an applied template.","tags":["generated_reports"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProGeneratedReportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProGeneratedReportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProGeneratedReportRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProGeneratedReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/generated_reports/retention/":{"get":{"operationId":"generated_reports_retention_retrieve","description":"How many days a generated report is kept before the nightly job deletes it; 0 means indefinitely.\n\nServed here, to anyone who can see generated reports, because the System Settings API that\nstores it is superuser-only and the Generated Reports page has to say when reports go.","tags":["generated_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProGeneratedReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/global_roles/":{"get":{"operationId":"global_roles_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"group","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"role","schema":{"type":"integer"}},{"in":"query","name":"user","schema":{"type":"integer"}}],"tags":["global_roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedGlobalRoleList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"global_roles_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["global_roles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalRoleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GlobalRoleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GlobalRoleRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalRole"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/global_roles/{id}/":{"get":{"operationId":"global_roles_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this global_ role.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["global_roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalRole"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"global_roles_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this global_ role.","required":true}],"tags":["global_roles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalRoleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GlobalRoleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GlobalRoleRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalRole"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"global_roles_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this global_ role.","required":true}],"tags":["global_roles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedGlobalRoleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedGlobalRoleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedGlobalRoleRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalRole"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"global_roles_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this global_ role.","required":true}],"tags":["global_roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/global_roles/{id}/delete_preview/":{"get":{"operationId":"global_roles_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this global_ role.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["global_roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/global_roles/{id}/history/":{"get":{"operationId":"global_roles_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"group","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this global_ role.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"integer"}},{"in":"query","name":"user","schema":{"type":"integer"}}],"tags":["global_roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/global_roles/{id}/history/legacy/":{"get":{"operationId":"global_roles_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"group","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this global_ role.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"integer"}},{"in":"query","name":"user","schema":{"type":"integer"}}],"tags":["global_roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/global_roles/{id}/history/legacy/count/":{"get":{"operationId":"global_roles_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this global_ role.","required":true}],"tags":["global_roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/health_check/light/":{"get":{"operationId":"health_check_light_retrieve","description":"Accepts unauthenticated requests to determine if the DefectDojo is reachable. Performs a very lightweight\ndatabase connection to check connectivity.\n\nA failed check answers 503 Service Unavailable: the server cannot serve, and the client did nothing\nwrong. Kubernetes probes and load balancer health checks read any status outside 200-399 as down, so\nto them the failure is still a failure, now with the status that says why.","tags":["health_check"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretOnly"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/assets.csv/":{"get":{"operationId":"hierarchy_assets.csv_retrieve","description":"Every asset you can see, one row each, in the change plan CSV format: asset_id, asset_name, organization, parent_id, parent_name, asset_type, business_criticality, user_records, revenue, external_audience, internet_accessible, prioritization_engine, sla_configuration, technical_contact, team_manager, product_manager, tags_add, tags_remove. Edit the cells you want to change and upload the file to POST /api/v2/hierarchy/plans/ to review the diff; an unedited file produces an empty plan. The tag columns are empty on export. Cells that a spreadsheet would run as a formula are prefixed with an apostrophe, and the import strips it.","parameters":[{"in":"query","name":"format","schema":{"type":"string","enum":["csv","json"]}},{"in":"query","name":"organization","schema":{"type":"array","items":{"type":"integer"}},"description":"Only assets in these organizations (repeat the parameter for several)."}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"text/csv":{"schema":{"type":"string","format":"binary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/health/":{"get":{"operationId":"hierarchy_health_retrieve","description":"The two measures (assets outside connector holding organizations; assets with all five priority fields), counts of open suggestions and of each list tab, the top three, when the checks last ran and when Check now may run again (check_available_at, null when it may run now), and the summary of a big arrival (arrival: at least 100 new assets in the last 7 days, else null). Over the assets you can see.","tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/health/check/":{"post":{"operationId":"hierarchy_health_check_create","description":"Run the checks now, for one connection or one organization (scope_type with its scope_id, which is required; 400 without it), or for the whole instance (no scope_type, or instance), which needs global Asset Hierarchy View or Edit. Free; at most once every five minutes per scope.","tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyCheckRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/HierarchyCheckRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/HierarchyCheckRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"429":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/health/precision/":{"get":{"operationId":"hierarchy_health_precision_retrieve","description":"Superusers: per check, how many suggestions are labeled right, wrong and unclear, and whether the share of right ones meets the check's GA gate (at least 90% for H1 to H4, 95% for H9 Merge suggestions, each on at least sample_size labels). Only labels for the check's current version count; unclear counts as not right.","tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyPrecision"}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/health/settings/":{"get":{"operationId":"hierarchy_health_settings_retrieve","description":"The thresholds the checks use, every check and whether it is on, and where the structure is kept flat on purpose (among the organizations you can see). For anyone with global Asset Hierarchy View or an organization they can edit.","tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyHealthSettings"}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"hierarchy_health_settings_partial_update","description":"Change the settings. The thresholds and notify are for superusers; disabled_checks and flat_structure_instance need global Asset Hierarchy Edit. A turned-off check stops running and its open, snoozed and dismissed suggestions are hidden until it is on again.","tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedHierarchyHealthSettingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedHierarchyHealthSettingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedHierarchyHealthSettingsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyHealthSettings"}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/health/settings/flat_structure/":{"post":{"operationId":"hierarchy_health_settings_flat_structure_create","description":"We keep a flat structure on purpose: turn the structural checks (large flat organization, name families) off or on again for one organization (Product Type Edit on it) or, with no organization, for the whole instance (global Asset Hierarchy Edit). Their suggestions there are hidden while it is on; the other checks keep running.","tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyFlatStructureRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/HierarchyFlatStructureRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/HierarchyFlatStructureRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyFlatStructure"}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"404":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/health/shadow/":{"get":{"operationId":"hierarchy_health_shadow_retrieve","description":"Superusers: whether the instance is in shadow mode. Answers while the feature flag is off too.","tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyShadowMode"}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"hierarchy_health_shadow_create","description":"Superusers: turn shadow mode on or off. While it is on, the checks run and store suggestions, only superusers see them (marked as shadow mode), everyone else is answered as if the feature were off, and nobody is notified. Works while the feature flag is off, so an instance can enter shadow mode before the feature is turned on.","tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyShadowModeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/HierarchyShadowModeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/HierarchyShadowModeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyShadowMode"}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/health/telemetry/":{"get":{"operationId":"hierarchy_health_telemetry_retrieve","description":"Superusers: what people did with the suggestions, as counts and codes (never names or notes): shown, opened, applied (with which edits were made first, and the time from when people could first see the suggestion to the apply), dismissed by reason, snoozed, undone (and within 14 days); imports resolved through a former name (null without import tolerance); open, applied and undone suggestions; and the two measures with the first import and the first time each reached 100%. Events in shadow mode are counted apart (shadow_events).","tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyTelemetry"}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/plans/":{"get":{"operationId":"hierarchy_plans_list","description":"Change plans visible to you (yours, and every plan for superusers and global owners), newest first. A hierarchy suggestion's draft (source advisor) is listed once someone starts applying it.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","enum":["applied","applying","discarded","draft","failed","stale"]}}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPlanListList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"hierarchy_plans_create","description":"Dry-run a list of operations and save it as a draft plan. Nothing is written to assets: every name is resolved to an id, every operation is checked against the hierarchy rules and your permissions, and the response carries the diff (every field that would change with its value before and after, organizations to create, descendants that move along, parent links that would be removed, the organizations whose priority is recalculated) and per-operation errors. An operation you may not perform is listed with code forbidden; a plan with any error cannot be applied. Instead of JSON, upload an asset CSV as multipart form data (a file field named file, plus name). One row per asset, columns: asset_id, asset_name, organization, parent_id, parent_name, asset_type, business_criticality, user_records, revenue, external_audience, internet_accessible, prioritization_engine, sla_configuration, technical_contact, team_manager, product_manager, tags_add, tags_remove. asset_id wins over asset_name and parent_id over parent_name; an empty cell or a missing row changes nothing; null clears a value (parent_id null detaches); tags_add and tags_remove take comma-separated tags. GET /api/v2/hierarchy/assets.csv/ exports the current state in exactly this format, so an exported file imported back unchanged produces an empty plan. At most 10000 rows; operations that change nothing are left out of the stored plan.","tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PlanUploadRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanDetail"}}},"description":""},"400":{"description":"The request is malformed."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/plans/{id}/":{"get":{"operationId":"hierarchy_plans_retrieve","description":"One change plan with its operations, its diff, and the record of an apply.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this hierarchy change plan.","required":true}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/plans/{id}/apply/":{"post":{"operationId":"hierarchy_plans_apply_create","description":"Apply a draft plan. The plan is dry-run again as you: if any operation is refused the request fails with 400 and the errors; if the only refusals are assets held by a running priority or SLA recalculation, it fails with 409 and lists them under locked (the plan stays a draft: apply it later, or rebuild it without them); if any value recorded in the diff no longer matches the current state the plan is marked stale and the request fails with 409 and the drifted entries (rebuild the plan to review the new state). Otherwise the plan becomes applying and is written in the background, in chunks, under one audit context carrying the plan id; poll the plan for applied or failed. A failed apply stops at the failing chunk and lists what was applied, what failed and what was never attempted; undo then reverses exactly what was applied. A plan built from a hierarchy suggestion (source advisor) is refused with code advisor_plan: apply it from the suggestion.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanDetail"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRefused"}}},"description":""},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePlanApplyConflict"}}},"description":"Stale (the body carries drift) or locked (the body carries locked)."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/plans/{id}/discard/":{"post":{"operationId":"hierarchy_plans_discard_create","description":"Discard a draft or stale plan so it can no longer be applied. Nothing else changes.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanDetail"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRefused"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/plans/{id}/export.csv/":{"get":{"operationId":"hierarchy_plans_export.csv_retrieve","description":"The plan's diff as CSV for spreadsheet review: one row per organization created, asset created (create_asset), field change, descendant carried along, parent link removed, membership change, recalculated organization and error, and in an undo plan one row per created asset it removes (remove_asset) or keeps (keep_asset, with the reasons). Columns: kind, op_index, asset_id, asset_name, field, from, to, from_value, to_value, via_asset_id, via_asset_name, code, message. Cells that a spreadsheet would run as a formula are prefixed with an apostrophe.","parameters":[{"in":"query","name":"format","schema":{"type":"string","enum":["csv","json"]}},{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"text/csv":{"schema":{"type":"string","format":"binary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/plans/{id}/rebuild/":{"post":{"operationId":"hierarchy_plans_rebuild_create","description":"Dry-run a plan's operations again as a NEW draft, leaving out the operation indexes in exclude_ops. A draft or stale plan is rebuilt from all its operations (to review a stale plan again, or to apply the rest while some assets are locked) and is then discarded. A failed plan is rebuilt from the operations it did not apply, and keeps its record. A plan built from a hierarchy suggestion (source advisor) is refused with code advisor_plan: review it again from the suggestion.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRebuildRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PlanRebuildRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PlanRebuildRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanDetail"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRefused"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/plans/{id}/undo/":{"post":{"operationId":"hierarchy_plans_undo_create","description":"Create a NEW draft plan that reverses what this applied (or partly applied) plan changed, so the undo gets its own review. Assets move back one by one, removed parent links are restored and fields return to their recorded values. Organizations the plan created are left in place. Assets the plan created (create_asset) are deleted only while they are still empty and unchanged: no data of any kind attached since, no field or parent changed, nothing but what creating them wrote; otherwise they stay, listed in the diff's assets_kept with the reasons, and the apply checks again before it deletes. Undoing an undo creates the assets it removed again, with new ids. A plan a hierarchy suggestion applied is refused with code advisor_plan: undo it from the suggestion.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanDetail"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRefused"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/":{"get":{"operationId":"hierarchy_suggestions_list","description":"The suggestions you can act on, most assets affected first. Titles render from kind, params and facts; fallback_title is English for API readers.","parameters":[{"in":"query","name":"actionable","schema":{"type":"boolean"},"description":"Leave out informational suggestions (nothing to apply)."},{"in":"query","name":"check","schema":{"type":"string"}},{"in":"query","name":"connector_config","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"tab","schema":{"type":"string","enum":["applied","dismissed","open"]}}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedHierarchySuggestionListList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/":{"get":{"operationId":"hierarchy_suggestions_retrieve","description":"One suggestion with its placement options, plans and your draft.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/apply/":{"post":{"operationId":"hierarchy_suggestions_apply_create","description":"Apply your reviewed draft at the revision you reviewed: its change plan is checked again and written in the background. 400 with code draft_expired when the draft has a newer revision (or none to apply); 409 with drift when something changed since the review (refresh the preview); 409 with locked when some assets are still recalculating; 409 with code shadow_mode while the instance is in shadow mode, for superusers too (turning shadow mode off makes applying available). When anyone loses access, acknowledge_access_loss is required.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionApplyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionApplyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionApplyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanDetail"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanRefused"}}},"description":""},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanStale"}}},"description":"Stale (drift), locked (locked), or shadow mode (code shadow_mode)."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/discovery/":{"get":{"operationId":"hierarchy_suggestions_discovery_retrieve","description":"Connector placement, step 2: how the discovery started for this suggestion is going. When it finished, the check runs again and the suggestion moves on to the moves.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"hierarchy_suggestions_discovery_create","description":"Start discovery for the connection, so its records carry the current placement setting. Needs global Connector Edit, as the connection's own discovery does.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/dismiss/":{"post":{"operationId":"hierarchy_suggestions_dismiss_create","description":"Advisor > Hierarchy: the structural problems the checks found, each with a fix to review and apply.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionDismissRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionDismissRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionDismissRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/groups/":{"get":{"operationId":"hierarchy_suggestions_groups_retrieve","description":"The groups of the fix under your current draft's edits, server-paged: one per destination, with its name, whether it exists already (existing_id) or the plan creates it, how many members it has and how many you can see, and a few examples. members_total adds up every group's members.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true},{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Rows per page (at most 200, default 50)."},{"in":"query","name":"offset","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"string"},"description":"'-members' for the largest groups first; by name otherwise."},{"in":"query","name":"search","schema":{"type":"string"},"description":"Only rows whose name contains this text."}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/groups/{gid}/members/":{"get":{"operationId":"hierarchy_suggestions_groups_members_retrieve","description":"The members of one group under your current draft's edits, server-paged: the assets you can see, whether each is included, excluded or moved, the path its own data names (for connector placement, its records), and why it is in the group; a parent asset that reason names is hidden unless you can see it.","parameters":[{"in":"path","name":"gid","schema":{"type":"string"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"required":true},{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Rows per page (at most 200, default 50)."},{"in":"query","name":"offset","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Only rows whose name contains this text."}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"404":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/groups/{gid}/name/":{"get":{"operationId":"hierarchy_suggestions_groups_name_retrieve","description":"Where a group would land under a new name, before the rename is previewed (the review's live check): lands_in is new (the plan creates it), existing (it lands in one that exists, existing_id), existing_hidden (one exists that you may not see), taken (the name is held by something the plan cannot use, so the create would be refused), or group (another group of this review has that name, named only when you may see it).","parameters":[{"in":"path","name":"gid","schema":{"type":"string"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"required":true},{"in":"query","name":"name","schema":{"type":"string"},"required":true}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"404":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/label/":{"get":{"operationId":"hierarchy_suggestions_label_retrieve","description":"Superusers: the label on this suggestion (right, wrong or unclear, with a note), or null.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionLabelResponse"}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"hierarchy_suggestions_label_create","description":"Superusers: say whether the check got this suggestion right, for the precision it needs before it goes to everyone (shadow mode). Replaces any earlier label, and records the check's version and the suggestion's kind as they are now.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionLabelRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionLabelRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionLabelRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionLabelResponse"}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/placement/":{"post":{"operationId":"hierarchy_suggestions_placement_create","description":"Connector placement, step 1: turn the connection's placement setting on (recording the previous value for undo) and start discovery. New assets follow the setting at once; existing assets move only after review. Needs global Connector Edit, as editing the connection does.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionPlacementRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionPlacementRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionPlacementRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/prevention/":{"post":{"operationId":"hierarchy_suggestions_prevention_create","description":"Keep it tidy: create the Rules Engine rule the review you applied offers (its prevention of kind rule_draft), from the group parents the apply created or reused. Created disabled unless enable is true, owned by you. 201 {rule: {id, name, enabled}, created: true, pending: false}; 202 {rule: null, pending: true} while the plan is still applying (the rule is created when it applies); 200 with created false when this suggestion already created its rule. Needs global Rule Add, the Rules Engine on, and sight of every asset the rule is built from (403 otherwise); 400 with code rules_engine_off, not_applied, draft_expired, blocked or no_rule.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionPreventionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionPreventionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionPreventionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"201":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"202":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"403":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/preview/":{"post":{"operationId":"hierarchy_suggestions_preview_create","description":"Build your draft from your edits: the change plan the fix applies (dry-run, nothing written to assets) and the review sections: what moves and is created, who loses or gains access, what is left out and why, warnings, and the recalculation. Rebuilds your draft and its plan in place and returns its new revision; apply names that revision. A refused preview (400) also moves the revision on and discards the plan, so nothing reviewed earlier can be applied instead. 400 with code not_previewable when the suggestion has nothing to apply yet (it is at another step): reload it.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionEditsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionEditsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionEditsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionDraft"}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/restore/":{"post":{"operationId":"hierarchy_suggestions_restore_create","description":"Advisor > Hierarchy: the structural problems the checks found, each with a fix to review and apply.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/rows/":{"get":{"operationId":"hierarchy_suggestions_rows_retrieve","description":"The suggestion's own list, server-paged: for example the organizations that hold nothing, the imports that resolved through a former name, or the priority data table under your current draft's edits. Rows you cannot see are counted in hidden, not listed; filters counts the rows behind each filter.","parameters":[{"in":"query","name":"filter","schema":{"type":"string"},"description":"One of the filter keys the response counts."},{"in":"path","name":"id","schema":{"type":"integer"},"required":true},{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Rows per page (at most 200, default 50)."},{"in":"query","name":"offset","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Only rows whose name contains this text."}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/snooze/":{"post":{"operationId":"hierarchy_suggestions_snooze_create","description":"Advisor > Hierarchy: the structural problems the checks found, each with a fix to review and apply.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionSnoozeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionSnoozeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionSnoozeRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/{id}/undo/":{"post":{"operationId":"hierarchy_suggestions_undo_create","description":"Build the inverse of what the suggestion applied as a new draft change plan, reviewed and applied on the change plan page. The suggestion is marked undone when that plan is applied. turn_off_rule (default true) turns off the Keep It Tidy rule the suggestion created when that plan applies, if it is on then and nobody else changed it since, so it does not put the assets back. 409 with code shadow_mode while the instance is in shadow mode (the new plan would be listed on Change Plans).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"required":true}],"tags":["hierarchy"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionUndoRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionUndoRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/HierarchySuggestionUndoRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanDetail"}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"409":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/hierarchy/suggestions/touching/":{"get":{"operationId":"hierarchy_suggestions_touching_retrieve","description":"The open suggestions you can see that touch what a page shows: a connection, organizations (and the connections whose holding organization they are), or the organizations of some assets; with none of these, every open suggestion you can see. Most assets affected first, without the ones whose banner you hid (your UI state). For the pointers other pages show; titles render as on the list.","parameters":[{"in":"query","name":"actionable","schema":{"type":"boolean"},"description":"Leave out informational suggestions."},{"in":"query","name":"assets","schema":{"type":"string"},"description":"Asset ids, comma separated (their organizations)."},{"in":"query","name":"checks","schema":{"type":"string"},"description":"Check keys, comma separated (h1,h6)."},{"in":"query","name":"connector_config","schema":{"type":"integer"},"description":"A connection's id."},{"in":"query","name":"limit","schema":{"type":"integer"},"description":"Suggestions returned (1 to 5, default 3)."},{"in":"query","name":"organizations","schema":{"type":"string"},"description":"Organization ids, comma separated."}],"tags":["hierarchy"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HierarchyTouching"}}},"description":""},"400":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/import-languages/":{"post":{"operationId":"import_languages_create","tags":["import-languages"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ImportLanguagesRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportLanguages"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/import-scan/":{"post":{"operationId":"import_scan_create","description":"Answers a successful import that resolved a former name with the warning, and records it.\n\nThe permission class sets ``import_name_resolution`` (``pro/importers/api/permissions.py``,\n``pro/importers/sbom/permissions.py``) before anything else reads the names.","tags":["import-scan"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AsyncImportScanRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncImportScan"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/import-scan/preview/":{"post":{"operationId":"import_scan_preview_create","description":"Parse a scan file and return top-level counts (parsed / new / duplicate / findings_to_close) without creating tests or findings.","summary":"Preview import scan","tags":["import-scan"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ImportPreviewRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportPreviewResponse"}}},"description":""},"400":{"description":"Invalid payload, product not found, or engagement criteria could not be resolved."},"401":{"description":"Not authenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Import preview is disabled for this site or the user lacks access.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/inline_images/":{"post":{"operationId":"inline_images_create","description":"Stores one image and returns a reference to it. Put the returned `markdown` (or `url`) into any markdown field, such as a finding description or a note, through that object's own endpoint, and DefectDojo displays the image there and in generated reports.\n\nSend the file as `multipart/form-data` in the `image` field. PNG, JPEG, GIF and WebP images up to 10 MB are accepted; the type is read from the bytes.\n\nAn image that no field references two days after it was uploaded is deleted, so embed it soon after uploading.","summary":"Upload an image for a markdown field","tags":["inline_images"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/InlineImageUploadRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InlineImage"},"examples":{"StoredImage":{"value":{"id":"3f0c2a1e-5b7d-4c1a-9e2f-8a6b4d3c2e1f","url":"/api/vue/inline_images/3f0c2a1e-5b7d-4c1a-9e2f-8a6b4d3c2e1f/","markdown":"![login-page](/api/vue/inline_images/3f0c2a1e-5b7d-4c1a-9e2f-8a6b4d3c2e1f/)","content_type":"image/png","size_bytes":48213,"original_filename":"login-page.png","created_at":"2026-09-28T12:00:00Z"},"summary":"Stored image"}}}},"description":"The image was stored."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InlineImageValidationError"},"examples":{"WrongFormat":{"value":{"image":["Only PNG, JPEG, GIF, and WebP images can be inserted."]},"summary":"Wrong format"}}}},"description":"The upload is missing, is not an image, is not PNG, JPEG, GIF or WebP, or is larger than 10 MB."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/inline_images/{id}/":{"get":{"operationId":"inline_images_retrieve","description":"Returns the stored image's reference, markdown, type and size. The image itself is at the `download` operation.","summary":"Get an image's details","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"The id returned when the image was uploaded.","required":true}],"tags":["inline_images"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InlineImage"},"examples":{"StoredImage":{"value":{"id":"3f0c2a1e-5b7d-4c1a-9e2f-8a6b4d3c2e1f","url":"/api/vue/inline_images/3f0c2a1e-5b7d-4c1a-9e2f-8a6b4d3c2e1f/","markdown":"![login-page](/api/vue/inline_images/3f0c2a1e-5b7d-4c1a-9e2f-8a6b4d3c2e1f/)","content_type":"image/png","size_bytes":48213,"original_filename":"login-page.png","created_at":"2026-09-28T12:00:00Z"},"summary":"Stored image"}}}},"description":"The image's details."},"404":{"description":"No image has this id."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/inline_images/{id}/download/":{"get":{"operationId":"inline_images_download","description":"Returns the stored image bytes, with the image's own content type.","summary":"Download an image","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"The id returned when the image was uploaded.","required":true}],"tags":["inline_images"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/gif":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}},"description":"The image."},"404":{"description":"No image has this id."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_configurations/":{"get":{"operationId":"jira_configurations_list","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"url","schema":{"type":"string"}}],"tags":["jira_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedJIRAInstanceList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"jira_configurations_create","tags":["jira_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_configurations/{id}/":{"get":{"operationId":"jira_configurations_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ instance.","required":true}],"tags":["jira_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"jira_configurations_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ instance.","required":true}],"tags":["jira_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"jira_configurations_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ instance.","required":true}],"tags":["jira_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedJIRAInstanceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedJIRAInstanceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedJIRAInstanceRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"jira_configurations_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ instance.","required":true}],"tags":["jira_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_configurations/{id}/delete_preview/":{"get":{"operationId":"jira_configurations_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ instance.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["jira_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_finding_mappings/":{"get":{"operationId":"jira_finding_mappings_list","parameters":[{"in":"query","name":"engagement","schema":{"type":"integer"}},{"in":"query","name":"finding","schema":{"type":"integer"}},{"in":"query","name":"finding_group","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"jira_id","schema":{"type":"string"}},{"in":"query","name":"jira_key","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["jira_finding_mappings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedJIRAIssueList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"jira_finding_mappings_create","tags":["jira_finding_mappings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAIssueRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/JIRAIssueRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/JIRAIssueRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAIssue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_finding_mappings/{id}/":{"get":{"operationId":"jira_finding_mappings_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ issue.","required":true}],"tags":["jira_finding_mappings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAIssue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"jira_finding_mappings_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ issue.","required":true}],"tags":["jira_finding_mappings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAIssueRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/JIRAIssueRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/JIRAIssueRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAIssue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"jira_finding_mappings_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ issue.","required":true}],"tags":["jira_finding_mappings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedJIRAIssueRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedJIRAIssueRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedJIRAIssueRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAIssue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"jira_finding_mappings_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ issue.","required":true}],"tags":["jira_finding_mappings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_finding_mappings/{id}/delete_preview/":{"get":{"operationId":"jira_finding_mappings_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ issue.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["jira_finding_mappings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_instances/":{"get":{"operationId":"jira_instances_list","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"url","schema":{"type":"string"}}],"tags":["jira_instances"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedJIRAInstanceList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"jira_instances_create","tags":["jira_instances"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_instances/{id}/":{"get":{"operationId":"jira_instances_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ instance.","required":true}],"tags":["jira_instances"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"jira_instances_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ instance.","required":true}],"tags":["jira_instances"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/JIRAInstanceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"jira_instances_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ instance.","required":true}],"tags":["jira_instances"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedJIRAInstanceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedJIRAInstanceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedJIRAInstanceRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAInstance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"jira_instances_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ instance.","required":true}],"tags":["jira_instances"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_instances/{id}/delete_preview/":{"get":{"operationId":"jira_instances_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ instance.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["jira_instances"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_product_configurations/":{"get":{"operationId":"jira_product_configurations_list","parameters":[{"in":"query","name":"component","schema":{"type":"string"}},{"in":"query","name":"enable_engagement_epic_mapping","schema":{"type":"boolean"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"engagement","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"jira_instance","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["engagement","jira_instance","product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"project_key","schema":{"type":"string"}},{"in":"query","name":"push_all_issues","schema":{"type":"boolean"}},{"in":"query","name":"push_notes","schema":{"type":"boolean"}}],"tags":["jira_product_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedJIRAProjectList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"jira_product_configurations_create","tags":["jira_product_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProject"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_product_configurations/{id}/":{"get":{"operationId":"jira_product_configurations_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ project.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["engagement","jira_instance","product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["jira_product_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProject"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"jira_product_configurations_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ project.","required":true}],"tags":["jira_product_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProject"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"jira_product_configurations_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ project.","required":true}],"tags":["jira_product_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedJIRAProjectRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedJIRAProjectRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedJIRAProjectRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProject"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"jira_product_configurations_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ project.","required":true}],"tags":["jira_product_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_product_configurations/{id}/delete_preview/":{"get":{"operationId":"jira_product_configurations_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ project.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["jira_product_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_projects/":{"get":{"operationId":"jira_projects_list","parameters":[{"in":"query","name":"component","schema":{"type":"string"}},{"in":"query","name":"enable_engagement_epic_mapping","schema":{"type":"boolean"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"engagement","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"jira_instance","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["engagement","jira_instance","product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"project_key","schema":{"type":"string"}},{"in":"query","name":"push_all_issues","schema":{"type":"boolean"}},{"in":"query","name":"push_notes","schema":{"type":"boolean"}}],"tags":["jira_projects"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedJIRAProjectList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"jira_projects_create","tags":["jira_projects"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProject"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_projects/{id}/":{"get":{"operationId":"jira_projects_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ project.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["engagement","jira_instance","product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["jira_projects"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProject"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"jira_projects_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ project.","required":true}],"tags":["jira_projects"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/JIRAProjectRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProject"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"jira_projects_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ project.","required":true}],"tags":["jira_projects"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedJIRAProjectRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedJIRAProjectRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedJIRAProjectRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JIRAProject"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"jira_projects_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ project.","required":true}],"tags":["jira_projects"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/jira_projects/{id}/delete_preview/":{"get":{"operationId":"jira_projects_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this jir a_ project.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["jira_projects"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/language_types/":{"get":{"operationId":"language_types_list","parameters":[{"in":"query","name":"color","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"language","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["language_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLanguageTypeList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"language_types_create","tags":["language_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LanguageTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LanguageTypeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/language_types/{id}/":{"get":{"operationId":"language_types_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this language_ type.","required":true}],"tags":["language_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"language_types_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this language_ type.","required":true}],"tags":["language_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LanguageTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LanguageTypeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"language_types_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this language_ type.","required":true}],"tags":["language_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLanguageTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLanguageTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLanguageTypeRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"language_types_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this language_ type.","required":true}],"tags":["language_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/language_types/{id}/delete_preview/":{"get":{"operationId":"language_types_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this language_ type.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["language_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/languages/":{"get":{"operationId":"languages_list","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"language","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["language","product","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product","schema":{"type":"integer"}}],"tags":["languages"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLanguageList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"languages_create","tags":["languages"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LanguageRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LanguageRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Language"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/languages/{id}/":{"get":{"operationId":"languages_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this languages.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["language","product","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["languages"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Language"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"languages_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this languages.","required":true}],"tags":["languages"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LanguageRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LanguageRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Language"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"languages_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this languages.","required":true}],"tags":["languages"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLanguageRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLanguageRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLanguageRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Language"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"languages_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this languages.","required":true}],"tags":["languages"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/languages/{id}/delete_preview/":{"get":{"operationId":"languages_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this languages.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["languages"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/license/{id}/":{"get":{"operationId":"license_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this license_ manager.","required":true}],"tags":["license"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseManager"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"license_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this license_ manager.","required":true}],"tags":["license"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLicenseManagerRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLicenseManagerRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLicenseManagerRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseManager"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/license/license_days_until_expiration/":{"get":{"operationId":"license_license_days_until_expiration_retrieve","tags":["license"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseManager"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/license/license_expiration/":{"get":{"operationId":"license_license_expiration_retrieve","tags":["license"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseManager"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/license/license_initialization/":{"get":{"operationId":"license_license_initialization_retrieve","tags":["license"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseManager"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/license/license_is_valid/":{"get":{"operationId":"license_license_is_valid_retrieve","tags":["license"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseManager"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/license/license_package/":{"get":{"operationId":"license_license_package_retrieve","tags":["license"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseManager"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/license/license_status/":{"get":{"operationId":"license_license_status_retrieve","tags":["license"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseManager"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/license/license_subscriber/":{"get":{"operationId":"license_license_subscriber_retrieve","tags":["license"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseManager"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/license/remind_later/":{"post":{"operationId":"license_remind_later_create","tags":["license"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/license/view_license/":{"get":{"operationId":"license_view_license_retrieve","tags":["license"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseManager"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/location/":{"get":{"operationId":"location_list","description":"A simple ViewSet for viewing and editing Locations.","parameters":[{"in":"query","name":"created_at_after","schema":{"type":"string","format":"date-time"},"description":"Created At: DateTime Range Filter"},{"in":"query","name":"created_at_before","schema":{"type":"string","format":"date-time"},"description":"Created At: DateTime Range Filter"},{"in":"query","name":"findings__finding_equals","schema":{"type":"integer"},"description":"Finding ID: Equals"},{"in":"query","name":"findings__finding_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Greater Than or Equal To"},{"in":"query","name":"findings__finding_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"findings__finding_less_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Less Than or Equal To"},{"in":"query","name":"findings__finding_not_equals","schema":{"type":"integer"},"description":"Finding ID: Not Equals"},{"in":"query","name":"findings__finding_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"},"description":"ID: Equals"},{"in":"query","name":"id_greater_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Greater Than or Equal To"},{"in":"query","name":"id_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"id_less_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Less Than or Equal To"},{"in":"query","name":"id_not_equals","schema":{"type":"integer"},"description":"ID: Not Equals"},{"in":"query","name":"id_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Not Included in List","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location_type_contains","schema":{"type":"string"},"description":"Location Type: Contains"},{"in":"query","name":"location_type_ends_with","schema":{"type":"string"},"description":"Location Type: Ends With"},{"in":"query","name":"location_type_exact","schema":{"type":"string"},"description":"Location Type: Exact Match"},{"in":"query","name":"location_type_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Type: Included in List","explode":false,"style":"form"},{"in":"query","name":"location_type_not_contains","schema":{"type":"string"},"description":"Location Type: Not Contains"},{"in":"query","name":"location_type_not_exact","schema":{"type":"string"},"description":"Location Type: Not Exact Match"},{"in":"query","name":"location_type_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Type: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location_type_starts_with","schema":{"type":"string"},"description":"Location Type: Starts With"},{"in":"query","name":"location_value_contains","schema":{"type":"string"},"description":"Location Value: Contains"},{"in":"query","name":"location_value_ends_with","schema":{"type":"string"},"description":"Location Value: Ends With"},{"in":"query","name":"location_value_exact","schema":{"type":"string"},"description":"Location Value: Exact Match"},{"in":"query","name":"location_value_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Value: Included in List","explode":false,"style":"form"},{"in":"query","name":"location_value_not_contains","schema":{"type":"string"},"description":"Location Value: Not Contains"},{"in":"query","name":"location_value_not_exact","schema":{"type":"string"},"description":"Location Value: Not Exact Match"},{"in":"query","name":"location_value_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Value: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location_value_starts_with","schema":{"type":"string"},"description":"Location Value: Starts With"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"array","items":{"type":"string","enum":["-created_at","-id","-location_type","-location_value","-updated_at","created_at","id","location_type","location_value","updated_at"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `location_type` - Location type\n* `-location_type` - Location type (descending)\n* `location_value` - Location value\n* `-location_value` - Location value (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"in":"query","name":"products__product_equals","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"products__product_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Greater Than or Equal To"},{"in":"query","name":"products__product_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"products__product_less_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Less Than or Equal To"},{"in":"query","name":"products__product_not_equals","schema":{"type":"integer"},"description":"Product ID: Not Equals"},{"in":"query","name":"products__product_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"tags__name_contains","schema":{"type":"string"},"description":"Tags: Contains"},{"in":"query","name":"tags__name_ends_with","schema":{"type":"string"},"description":"Tags: Ends With"},{"in":"query","name":"tags__name_exact","schema":{"type":"string"},"description":"Tags: Exact Match"},{"in":"query","name":"tags__name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Included in List","explode":false,"style":"form"},{"in":"query","name":"tags__name_not_contains","schema":{"type":"string"},"description":"Tags: Not Contains"},{"in":"query","name":"tags__name_not_exact","schema":{"type":"string"},"description":"Tags: Not Exact Match"},{"in":"query","name":"tags__name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"tags__name_starts_with","schema":{"type":"string"},"description":"Tags: Starts With"},{"in":"query","name":"updated_at_after","schema":{"type":"string","format":"date-time"},"description":"Updated At: DateTime Range Filter"},{"in":"query","name":"updated_at_before","schema":{"type":"string","format":"date-time"},"description":"Updated At: DateTime Range Filter"}],"tags":["location"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLocationList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/location/{id}/":{"get":{"operationId":"location_retrieve","description":"A simple ViewSet for viewing and editing Locations.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - Location.","required":true}],"tags":["location"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Location"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/location_findings/":{"get":{"operationId":"location_findings_list","description":"A simple ViewSet for viewing and editing LocationFindingReference.","parameters":[{"in":"query","name":"created_at_after","schema":{"type":"string","format":"date-time"},"description":"Created At: DateTime Range Filter"},{"in":"query","name":"created_at_before","schema":{"type":"string","format":"date-time"},"description":"Created At: DateTime Range Filter"},{"in":"query","name":"finding__severity_contains","schema":{"type":"string"},"description":"Finding Severity: Contains"},{"in":"query","name":"finding__severity_ends_with","schema":{"type":"string"},"description":"Finding Severity: Ends With"},{"in":"query","name":"finding__severity_exact","schema":{"type":"string"},"description":"Finding Severity: Exact Match"},{"in":"query","name":"finding__severity_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Finding Severity: Included in List","explode":false,"style":"form"},{"in":"query","name":"finding__severity_not_contains","schema":{"type":"string"},"description":"Finding Severity: Not Contains"},{"in":"query","name":"finding__severity_not_exact","schema":{"type":"string"},"description":"Finding Severity: Not Exact Match"},{"in":"query","name":"finding__severity_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Finding Severity: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"finding__severity_starts_with","schema":{"type":"string"},"description":"Finding Severity: Starts With"},{"in":"query","name":"finding_equals","schema":{"type":"integer"},"description":"Finding: Equals"},{"in":"query","name":"finding_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Finding: Greater Than or Equal To"},{"in":"query","name":"finding_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding: Included in List","explode":false,"style":"form"},{"in":"query","name":"finding_less_than_or_equal_to","schema":{"type":"integer"},"description":"Finding: Less Than or Equal To"},{"in":"query","name":"finding_not_equals","schema":{"type":"integer"},"description":"Finding: Not Equals"},{"in":"query","name":"finding_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"},"description":"ID: Equals"},{"in":"query","name":"id_greater_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Greater Than or Equal To"},{"in":"query","name":"id_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"id_less_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Less Than or Equal To"},{"in":"query","name":"id_not_equals","schema":{"type":"integer"},"description":"ID: Not Equals"},{"in":"query","name":"id_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Not Included in List","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location_equals","schema":{"type":"integer"},"description":"Location: Equals"},{"in":"query","name":"location_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Location: Greater Than or Equal To"},{"in":"query","name":"location_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Location: Included in List","explode":false,"style":"form"},{"in":"query","name":"location_less_than_or_equal_to","schema":{"type":"integer"},"description":"Location: Less Than or Equal To"},{"in":"query","name":"location_not_equals","schema":{"type":"integer"},"description":"Location: Not Equals"},{"in":"query","name":"location_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Location: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location_type_contains","schema":{"type":"string"},"description":"Location Type: Contains"},{"in":"query","name":"location_type_ends_with","schema":{"type":"string"},"description":"Location Type: Ends With"},{"in":"query","name":"location_type_exact","schema":{"type":"string"},"description":"Location Type: Exact Match"},{"in":"query","name":"location_type_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Type: Included in List","explode":false,"style":"form"},{"in":"query","name":"location_type_not_contains","schema":{"type":"string"},"description":"Location Type: Not Contains"},{"in":"query","name":"location_type_not_exact","schema":{"type":"string"},"description":"Location Type: Not Exact Match"},{"in":"query","name":"location_type_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Type: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location_type_starts_with","schema":{"type":"string"},"description":"Location Type: Starts With"},{"in":"query","name":"location_value_contains","schema":{"type":"string"},"description":"Location Value: Contains"},{"in":"query","name":"location_value_ends_with","schema":{"type":"string"},"description":"Location Value: Ends With"},{"in":"query","name":"location_value_exact","schema":{"type":"string"},"description":"Location Value: Exact Match"},{"in":"query","name":"location_value_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Value: Included in List","explode":false,"style":"form"},{"in":"query","name":"location_value_not_contains","schema":{"type":"string"},"description":"Location Value: Not Contains"},{"in":"query","name":"location_value_not_exact","schema":{"type":"string"},"description":"Location Value: Not Exact Match"},{"in":"query","name":"location_value_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Value: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location_value_starts_with","schema":{"type":"string"},"description":"Location Value: Starts With"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"array","items":{"type":"string","enum":["-created_at","-finding","-finding__severity","-id","-location_type","-location_value","-status","-updated_at","created_at","finding","finding__severity","id","location_type","location_value","status","updated_at"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `location_type` - Location type\n* `-location_type` - Location type (descending)\n* `location_value` - Location value\n* `-location_value` - Location value (descending)\n* `finding` - Finding\n* `-finding` - Finding (descending)\n* `finding__severity` - Finding  severity\n* `-finding__severity` - Finding  severity (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"in":"query","name":"status_equals","schema":{"type":"array","items":{"type":"string","x-spec-enum-id":"918ee82ac8d9cac7","enum":["Active","FalsePositive","Mitigated","OutOfScope","RiskAccepted"]}},"description":"Status: Choice Filter\n\n* `Active` - Active\n* `Mitigated` - Mitigated\n* `FalsePositive` - False Positive\n* `RiskAccepted` - Risk Accepted\n* `OutOfScope` - Out Of Scope","explode":true,"style":"form"},{"in":"query","name":"updated_at_after","schema":{"type":"string","format":"date-time"},"description":"Updated At: DateTime Range Filter"},{"in":"query","name":"updated_at_before","schema":{"type":"string","format":"date-time"},"description":"Updated At: DateTime Range Filter"}],"tags":["location_findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLocationFindingReferenceList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"location_findings_create","description":"A simple ViewSet for viewing and editing LocationFindingReference.","tags":["location_findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationFindingReferenceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LocationFindingReferenceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LocationFindingReferenceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationFindingReference"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/location_findings/{id}/":{"get":{"operationId":"location_findings_retrieve","description":"A simple ViewSet for viewing and editing LocationFindingReference.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - FindingReference.","required":true}],"tags":["location_findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationFindingReference"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"location_findings_update","description":"A simple ViewSet for viewing and editing LocationFindingReference.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - FindingReference.","required":true}],"tags":["location_findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationFindingReferenceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LocationFindingReferenceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LocationFindingReferenceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationFindingReference"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"location_findings_partial_update","description":"A simple ViewSet for viewing and editing LocationFindingReference.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - FindingReference.","required":true}],"tags":["location_findings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLocationFindingReferenceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLocationFindingReferenceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLocationFindingReferenceRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationFindingReference"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"location_findings_destroy","description":"A simple ViewSet for viewing and editing LocationFindingReference.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - FindingReference.","required":true}],"tags":["location_findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/location_findings/{id}/delete_preview/":{"get":{"operationId":"location_findings_delete_preview_list","description":"A simple ViewSet for viewing and editing LocationFindingReference.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - FindingReference.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["location_findings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/location_products/":{"get":{"operationId":"location_products_list","description":"A simple ViewSet for viewing and editing LocationProductReference.","parameters":[{"in":"query","name":"created_at_after","schema":{"type":"string","format":"date-time"},"description":"Created At: DateTime Range Filter"},{"in":"query","name":"created_at_before","schema":{"type":"string","format":"date-time"},"description":"Created At: DateTime Range Filter"},{"in":"query","name":"id_equals","schema":{"type":"integer"},"description":"ID: Equals"},{"in":"query","name":"id_greater_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Greater Than or Equal To"},{"in":"query","name":"id_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"id_less_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Less Than or Equal To"},{"in":"query","name":"id_not_equals","schema":{"type":"integer"},"description":"ID: Not Equals"},{"in":"query","name":"id_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Not Included in List","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location_equals","schema":{"type":"integer"},"description":"Location: Equals"},{"in":"query","name":"location_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Location: Greater Than or Equal To"},{"in":"query","name":"location_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Location: Included in List","explode":false,"style":"form"},{"in":"query","name":"location_less_than_or_equal_to","schema":{"type":"integer"},"description":"Location: Less Than or Equal To"},{"in":"query","name":"location_not_equals","schema":{"type":"integer"},"description":"Location: Not Equals"},{"in":"query","name":"location_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Location: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location_type_contains","schema":{"type":"string"},"description":"Location Type: Contains"},{"in":"query","name":"location_type_ends_with","schema":{"type":"string"},"description":"Location Type: Ends With"},{"in":"query","name":"location_type_exact","schema":{"type":"string"},"description":"Location Type: Exact Match"},{"in":"query","name":"location_type_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Type: Included in List","explode":false,"style":"form"},{"in":"query","name":"location_type_not_contains","schema":{"type":"string"},"description":"Location Type: Not Contains"},{"in":"query","name":"location_type_not_exact","schema":{"type":"string"},"description":"Location Type: Not Exact Match"},{"in":"query","name":"location_type_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Type: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location_type_starts_with","schema":{"type":"string"},"description":"Location Type: Starts With"},{"in":"query","name":"location_value_contains","schema":{"type":"string"},"description":"Location Value: Contains"},{"in":"query","name":"location_value_ends_with","schema":{"type":"string"},"description":"Location Value: Ends With"},{"in":"query","name":"location_value_exact","schema":{"type":"string"},"description":"Location Value: Exact Match"},{"in":"query","name":"location_value_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Value: Included in List","explode":false,"style":"form"},{"in":"query","name":"location_value_not_contains","schema":{"type":"string"},"description":"Location Value: Not Contains"},{"in":"query","name":"location_value_not_exact","schema":{"type":"string"},"description":"Location Value: Not Exact Match"},{"in":"query","name":"location_value_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Location Value: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location_value_starts_with","schema":{"type":"string"},"description":"Location Value: Starts With"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"array","items":{"type":"string","enum":["-created_at","-id","-location_type","-location_value","-product","-product__name","-status","-updated_at","created_at","id","location_type","location_value","product","product__name","status","updated_at"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `location_type` - Location type\n* `-location_type` - Location type (descending)\n* `location_value` - Location value\n* `-location_value` - Location value (descending)\n* `product` - Product\n* `-product` - Product (descending)\n* `product__name` - Product  name\n* `-product__name` - Product  name (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"in":"query","name":"product__name_contains","schema":{"type":"string"},"description":"Product Name: Contains"},{"in":"query","name":"product__name_ends_with","schema":{"type":"string"},"description":"Product Name: Ends With"},{"in":"query","name":"product__name_exact","schema":{"type":"string"},"description":"Product Name: Exact Match"},{"in":"query","name":"product__name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Product Name: Included in List","explode":false,"style":"form"},{"in":"query","name":"product__name_not_contains","schema":{"type":"string"},"description":"Product Name: Not Contains"},{"in":"query","name":"product__name_not_exact","schema":{"type":"string"},"description":"Product Name: Not Exact Match"},{"in":"query","name":"product__name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Product Name: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"product__name_starts_with","schema":{"type":"string"},"description":"Product Name: Starts With"},{"in":"query","name":"product_equals","schema":{"type":"integer"},"description":"Product: Equals"},{"in":"query","name":"product_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Product: Greater Than or Equal To"},{"in":"query","name":"product_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product: Included in List","explode":false,"style":"form"},{"in":"query","name":"product_less_than_or_equal_to","schema":{"type":"integer"},"description":"Product: Less Than or Equal To"},{"in":"query","name":"product_not_equals","schema":{"type":"integer"},"description":"Product: Not Equals"},{"in":"query","name":"product_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"status_equals","schema":{"type":"array","items":{"type":"string","x-spec-enum-id":"bcfb073a62b96b70","enum":["Active","Mitigated"]}},"description":"Status: Choice Filter\n\n* `Active` - Active\n* `Mitigated` - Mitigated","explode":true,"style":"form"},{"in":"query","name":"updated_at_after","schema":{"type":"string","format":"date-time"},"description":"Updated At: DateTime Range Filter"},{"in":"query","name":"updated_at_before","schema":{"type":"string","format":"date-time"},"description":"Updated At: DateTime Range Filter"}],"tags":["location_products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLocationProductReferenceList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"location_products_create","description":"A simple ViewSet for viewing and editing LocationProductReference.","tags":["location_products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationProductReferenceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LocationProductReferenceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LocationProductReferenceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationProductReference"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/location_products/{id}/":{"get":{"operationId":"location_products_retrieve","description":"A simple ViewSet for viewing and editing LocationProductReference.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - ProductReference.","required":true}],"tags":["location_products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationProductReference"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"location_products_update","description":"A simple ViewSet for viewing and editing LocationProductReference.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - ProductReference.","required":true}],"tags":["location_products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationProductReferenceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LocationProductReferenceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LocationProductReferenceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationProductReference"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"location_products_partial_update","description":"A simple ViewSet for viewing and editing LocationProductReference.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - ProductReference.","required":true}],"tags":["location_products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLocationProductReferenceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLocationProductReferenceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLocationProductReferenceRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocationProductReference"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"location_products_destroy","description":"A simple ViewSet for viewing and editing LocationProductReference.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - ProductReference.","required":true}],"tags":["location_products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/location_products/{id}/delete_preview/":{"get":{"operationId":"location_products_delete_preview_list","description":"A simple ViewSet for viewing and editing LocationProductReference.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - ProductReference.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["location_products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/login_banner/{id}/":{"get":{"operationId":"login_banner_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this banner conf.","required":true}],"tags":["login_banner"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBanner"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"login_banner_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this banner conf.","required":true}],"tags":["login_banner"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBannerRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/LoginBannerRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/LoginBannerRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBanner"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"login_banner_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this banner conf.","required":true}],"tags":["login_banner"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedLoginBannerRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedLoginBannerRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedLoginBannerRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBanner"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/metadata/":{"get":{"operationId":"metadata_list","description":"The flat ``/api/v2/metadata/`` endpoint.\n\nFinding and product metadata is replaced by the Pro typed Custom Fields subsystem: once the\nCustom Fields flag is on, finding/product metadata operations 404 here (read and write custom\nfields through ``/api/vue/custom_field_values/`` instead). Endpoint and location metadata are\nout of scope and keep working on ``dojo.DojoMeta``. With the flag off, the endpoint behaves\nexactly as OSS for every owner.","parameters":[{"in":"query","name":"endpoint","schema":{"type":"integer"}},{"in":"query","name":"finding","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_case_insensitive","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"value","schema":{"type":"string"}},{"in":"query","name":"value_case_insensitive","schema":{"type":"string"}}],"tags":["metadata"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedMetaList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"metadata_create","description":"The flat ``/api/v2/metadata/`` endpoint.\n\nFinding and product metadata is replaced by the Pro typed Custom Fields subsystem: once the\nCustom Fields flag is on, finding/product metadata operations 404 here (read and write custom\nfields through ``/api/vue/custom_field_values/`` instead). Endpoint and location metadata are\nout of scope and keep working on ``dojo.DojoMeta``. With the flag off, the endpoint behaves\nexactly as OSS for every owner.","tags":["metadata"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/MetaRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/MetaRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Meta"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/metadata/{id}/":{"get":{"operationId":"metadata_retrieve","description":"The flat ``/api/v2/metadata/`` endpoint.\n\nFinding and product metadata is replaced by the Pro typed Custom Fields subsystem: once the\nCustom Fields flag is on, finding/product metadata operations 404 here (read and write custom\nfields through ``/api/vue/custom_field_values/`` instead). Endpoint and location metadata are\nout of scope and keep working on ``dojo.DojoMeta``. With the flag off, the endpoint behaves\nexactly as OSS for every owner.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo meta.","required":true}],"tags":["metadata"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Meta"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"metadata_update","description":"The flat ``/api/v2/metadata/`` endpoint.\n\nFinding and product metadata is replaced by the Pro typed Custom Fields subsystem: once the\nCustom Fields flag is on, finding/product metadata operations 404 here (read and write custom\nfields through ``/api/vue/custom_field_values/`` instead). Endpoint and location metadata are\nout of scope and keep working on ``dojo.DojoMeta``. With the flag off, the endpoint behaves\nexactly as OSS for every owner.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo meta.","required":true}],"tags":["metadata"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/MetaRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/MetaRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Meta"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"metadata_partial_update","description":"The flat ``/api/v2/metadata/`` endpoint.\n\nFinding and product metadata is replaced by the Pro typed Custom Fields subsystem: once the\nCustom Fields flag is on, finding/product metadata operations 404 here (read and write custom\nfields through ``/api/vue/custom_field_values/`` instead). Endpoint and location metadata are\nout of scope and keep working on ``dojo.DojoMeta``. With the flag off, the endpoint behaves\nexactly as OSS for every owner.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo meta.","required":true}],"tags":["metadata"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedMetaRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedMetaRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedMetaRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Meta"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"metadata_destroy","description":"The flat ``/api/v2/metadata/`` endpoint.\n\nFinding and product metadata is replaced by the Pro typed Custom Fields subsystem: once the\nCustom Fields flag is on, finding/product metadata operations 404 here (read and write custom\nfields through ``/api/vue/custom_field_values/`` instead). Endpoint and location metadata are\nout of scope and keep working on ``dojo.DojoMeta``. With the flag off, the endpoint behaves\nexactly as OSS for every owner.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo meta.","required":true}],"tags":["metadata"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/metadata/{id}/delete_preview/":{"get":{"operationId":"metadata_delete_preview_list","description":"The flat ``/api/v2/metadata/`` endpoint.\n\nFinding and product metadata is replaced by the Pro typed Custom Fields subsystem: once the\nCustom Fields flag is on, finding/product metadata operations 404 here (read and write custom\nfields through ``/api/vue/custom_field_values/`` instead). Endpoint and location metadata are\nout of scope and keep working on ``dojo.DojoMeta``. With the flag off, the endpoint behaves\nexactly as OSS for every owner.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo meta.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["metadata"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/metadata/batch/":{"post":{"operationId":"metadata_batch_create","description":"The flat ``/api/v2/metadata/`` endpoint.\n\nFinding and product metadata is replaced by the Pro typed Custom Fields subsystem: once the\nCustom Fields flag is on, finding/product metadata operations 404 here (read and write custom\nfields through ``/api/vue/custom_field_values/`` instead). Endpoint and location metadata are\nout of scope and keep working on ``dojo.DojoMeta``. With the flag off, the endpoint behaves\nexactly as OSS for every owner.","tags":["metadata"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaMainRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/MetaMainRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/MetaMainRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaMain"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"metadata_batch_partial_update","description":"The flat ``/api/v2/metadata/`` endpoint.\n\nFinding and product metadata is replaced by the Pro typed Custom Fields subsystem: once the\nCustom Fields flag is on, finding/product metadata operations 404 here (read and write custom\nfields through ``/api/vue/custom_field_values/`` instead). Endpoint and location metadata are\nout of scope and keep working on ``dojo.DojoMeta``. With the flag off, the endpoint behaves\nexactly as OSS for every owner.","tags":["metadata"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedMetaMainRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedMetaMainRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedMetaMainRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaMain"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/mitigation_policies/":{"get":{"operationId":"mitigation_policies_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"is_default","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-id","-is_default","-title","id","is_default","title"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `is_default` - Is default\n* `-is_default` - Is default (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: title, description"},{"in":"query","name":"title_contains","schema":{"type":"string"}},{"in":"query","name":"title_ends_with","schema":{"type":"string"}},{"in":"query","name":"title_exact","schema":{"type":"string"}},{"in":"query","name":"title_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_contains","schema":{"type":"string"}},{"in":"query","name":"title_not_exact","schema":{"type":"string"}},{"in":"query","name":"title_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_regex","schema":{"type":"string"}},{"in":"query","name":"title_regex","schema":{"type":"string"}},{"in":"query","name":"title_starts_with","schema":{"type":"string"}}],"tags":["mitigation_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedMitigationPolicyList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"mitigation_policies_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["mitigation_policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MitigationPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/MitigationPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/MitigationPolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MitigationPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/mitigation_policies/{id}/":{"get":{"operationId":"mitigation_policies_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Mitigation Policy.","required":true},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["mitigation_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MitigationPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"mitigation_policies_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Mitigation Policy.","required":true}],"tags":["mitigation_policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MitigationPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/MitigationPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/MitigationPolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MitigationPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"mitigation_policies_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Mitigation Policy.","required":true}],"tags":["mitigation_policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedMitigationPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedMitigationPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedMitigationPolicyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MitigationPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"mitigation_policies_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Mitigation Policy.","required":true}],"tags":["mitigation_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/mitigation_policies/{id}/history/":{"get":{"operationId":"mitigation_policies_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Mitigation Policy.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"is_default","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-id","-is_default","-title","id","is_default","title"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `is_default` - Is default\n* `-is_default` - Is default (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: title, description"},{"in":"query","name":"title_contains","schema":{"type":"string"}},{"in":"query","name":"title_ends_with","schema":{"type":"string"}},{"in":"query","name":"title_exact","schema":{"type":"string"}},{"in":"query","name":"title_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_contains","schema":{"type":"string"}},{"in":"query","name":"title_not_exact","schema":{"type":"string"}},{"in":"query","name":"title_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_regex","schema":{"type":"string"}},{"in":"query","name":"title_regex","schema":{"type":"string"}},{"in":"query","name":"title_starts_with","schema":{"type":"string"}}],"tags":["mitigation_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/mitigation_policies/{id}/history/legacy/":{"get":{"operationId":"mitigation_policies_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Mitigation Policy.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"is_default","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-id","-is_default","-title","id","is_default","title"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `is_default` - Is default\n* `-is_default` - Is default (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: title, description"},{"in":"query","name":"title_contains","schema":{"type":"string"}},{"in":"query","name":"title_ends_with","schema":{"type":"string"}},{"in":"query","name":"title_exact","schema":{"type":"string"}},{"in":"query","name":"title_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_contains","schema":{"type":"string"}},{"in":"query","name":"title_not_exact","schema":{"type":"string"}},{"in":"query","name":"title_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_regex","schema":{"type":"string"}},{"in":"query","name":"title_regex","schema":{"type":"string"}},{"in":"query","name":"title_starts_with","schema":{"type":"string"}}],"tags":["mitigation_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/mitigation_policies/{id}/history/legacy/count/":{"get":{"operationId":"mitigation_policies_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Mitigation Policy.","required":true}],"tags":["mitigation_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/network_locations/":{"get":{"operationId":"network_locations_list","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["network_locations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedNetworkLocationsList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"network_locations_create","tags":["network_locations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkLocationsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NetworkLocationsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NetworkLocationsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkLocations"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/network_locations/{id}/":{"get":{"operationId":"network_locations_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this network_ locations.","required":true}],"tags":["network_locations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkLocations"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"network_locations_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this network_ locations.","required":true}],"tags":["network_locations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkLocationsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NetworkLocationsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NetworkLocationsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkLocations"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"network_locations_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this network_ locations.","required":true}],"tags":["network_locations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedNetworkLocationsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedNetworkLocationsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedNetworkLocationsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkLocations"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"network_locations_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this network_ locations.","required":true}],"tags":["network_locations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/network_locations/{id}/delete_preview/":{"get":{"operationId":"network_locations_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this network_ locations.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["network_locations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/note_type/":{"get":{"operationId":"note_type_list","parameters":[{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"is_active","schema":{"type":"boolean"}},{"in":"query","name":"is_mandatory","schema":{"type":"boolean"}},{"in":"query","name":"is_single","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["note_type"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedNoteTypeList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"note_type_create","tags":["note_type"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NoteTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NoteTypeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/note_type/{id}/":{"get":{"operationId":"note_type_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this note_ type.","required":true}],"tags":["note_type"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"note_type_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this note_ type.","required":true}],"tags":["note_type"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NoteTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NoteTypeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"note_type_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this note_ type.","required":true}],"tags":["note_type"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedNoteTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedNoteTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedNoteTypeRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"note_type_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this note_ type.","required":true}],"tags":["note_type"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/note_type/{id}/delete_preview/":{"get":{"operationId":"note_type_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this note_ type.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["note_type"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/notes/":{"get":{"operationId":"notes_list","description":"Notes on findings, tests, engagements and risk acceptances.","parameters":[{"in":"query","name":"author","schema":{"type":"integer"}},{"in":"query","name":"date","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"edit_time","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"edited","schema":{"type":"boolean"}},{"in":"query","name":"editor","schema":{"type":"integer"}},{"in":"query","name":"engagement","schema":{"type":"integer"},"description":"Only notes attached to this engagement."},{"in":"query","name":"entry","schema":{"type":"string"}},{"in":"query","name":"finding","schema":{"type":"integer"},"description":"Only notes attached to this finding."},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"string"},"description":"'id' (the default), '-id', 'date' or '-date'."},{"in":"query","name":"private","schema":{"type":"boolean"}},{"in":"query","name":"risk_acceptance","schema":{"type":"integer"},"description":"Only notes attached to this risk acceptance."},{"in":"query","name":"test","schema":{"type":"integer"},"description":"Only notes attached to this test."}],"tags":["notes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedNoteList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"notes_create","description":"Notes on findings, tests, engagements and risk acceptances.","tags":["notes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NoteCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NoteCreateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Note"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/notes/{id}/":{"get":{"operationId":"notes_retrieve","description":"Notes on findings, tests, engagements and risk acceptances.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notes.","required":true}],"tags":["notes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Note"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"notes_update","description":"Notes on findings, tests, engagements and risk acceptances.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notes.","required":true}],"tags":["notes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NoteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NoteRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Note"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"notes_partial_update","description":"Notes on findings, tests, engagements and risk acceptances.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notes.","required":true}],"tags":["notes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedNoteRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedNoteRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedNoteRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Note"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"notes_destroy","description":"Notes on findings, tests, engagements and risk acceptances.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notes.","required":true}],"tags":["notes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/notes/{id}/history/":{"get":{"operationId":"notes_history_list","description":"Notes on findings, tests, engagements and risk acceptances.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notes.","required":true}],"tags":["notes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/NoteHistory"}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/notification_webhooks/":{"get":{"operationId":"notification_webhooks_list","parameters":[{"in":"query","name":"first_error","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"header_name","schema":{"type":"string"}},{"in":"query","name":"header_value","schema":{"type":"string"}},{"in":"query","name":"last_error","schema":{"type":"string","format":"date-time"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"note","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"owner","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"8611dd588eda2457","enum":["active","active_tmp","inactive_permanent","inactive_tmp"]},"description":"Status of the incoming webhook\n\n* `active` - Active\n* `active_tmp` - Active but 5xx (or similar) error detected\n* `inactive_tmp` - Temporary inactive because of 5xx (or similar) error\n* `inactive_permanent` - Permanently inactive"},{"in":"query","name":"url","schema":{"type":"string"}}],"tags":["notification_webhooks"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedNotificationWebhooksList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"notification_webhooks_create","tags":["notification_webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationWebhooksRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NotificationWebhooksRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NotificationWebhooksRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationWebhooks"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/notification_webhooks/{id}/":{"get":{"operationId":"notification_webhooks_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notification_ webhooks.","required":true}],"tags":["notification_webhooks"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationWebhooks"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"notification_webhooks_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notification_ webhooks.","required":true}],"tags":["notification_webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationWebhooksRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NotificationWebhooksRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NotificationWebhooksRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationWebhooks"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"notification_webhooks_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notification_ webhooks.","required":true}],"tags":["notification_webhooks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedNotificationWebhooksRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedNotificationWebhooksRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedNotificationWebhooksRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationWebhooks"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"notification_webhooks_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notification_ webhooks.","required":true}],"tags":["notification_webhooks"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/notification_webhooks/{id}/delete_preview/":{"get":{"operationId":"notification_webhooks_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notification_ webhooks.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["notification_webhooks"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/notifications/":{"get":{"operationId":"notifications_list","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"template","schema":{"type":"boolean"}},{"in":"query","name":"user","schema":{"type":"integer"}}],"tags":["notifications"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedNotificationsList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"notifications_create","tags":["notifications"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NotificationsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NotificationsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Notifications"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/notifications/{id}/":{"get":{"operationId":"notifications_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notifications.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["notifications"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Notifications"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"notifications_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notifications.","required":true}],"tags":["notifications"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/NotificationsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/NotificationsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Notifications"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"notifications_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notifications.","required":true}],"tags":["notifications"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedNotificationsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedNotificationsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedNotificationsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Notifications"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"notifications_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notifications.","required":true}],"tags":["notifications"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/notifications/{id}/delete_preview/":{"get":{"operationId":"notifications_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this notifications.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["notifications"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/oa3/schema/":{"get":{"operationId":"oa3_schema_retrieve","description":"OpenApi3 schema for this API. Format can be selected via content negotiation.\n\n- YAML: application/vnd.oai.openapi\n- JSON: application/vnd.oai.openapi+json","parameters":[{"in":"query","name":"format","schema":{"type":"string","enum":["json","yaml"]}},{"in":"query","name":"lang","schema":{"type":"string","enum":["ar","bn","de","en","es","fa","fr","he","hi","id","it","ja","ko","mr","nl","pl","pt-br","ru","ta","te","th","tl","tr","uk","ur","vi","zh-hans","zh-hant"]}}],"tags":["oa3"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}},"application/vnd.oai.openapi":{"schema":{"type":"object","additionalProperties":{}}},"application/yaml":{"schema":{"type":"object","additionalProperties":{}}},"application/vnd.oai.openapi+json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/oauth/token/":{"post":{"operationId":"oauth_token_create","description":"The client credentials grant. Errors follow RFC 6749 section 5.2.","summary":"OAuth 2.0 client credentials token for a service user","tags":["Service Users"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceUserOAuthTokenRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ServiceUserOAuthTokenRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ServiceUserOAuthTokenRequestRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceUserOAuthTokenResponse"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthUnsupportedGrant"}}},"description":""},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthInvalidClient"}}},"description":""},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/obligation_results/":{"get":{"operationId":"obligation_results_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"assessment","schema":{"type":"integer"}},{"in":"query","name":"control","schema":{"type":"integer"}},{"in":"query","name":"evidence_mode","schema":{"type":"string","x-spec-enum-id":"a7ea667bdebc6712","enum":["automated","hybrid","manual"]},"description":"* `automated` - Automated\n* `manual` - Manual\n* `hybrid` - Hybrid"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"manual_override","schema":{"type":"boolean"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"5662d6e57f125b99","title":"Evidence Status","enum":["not_applicable","not_satisfied","partially_satisfied","satisfied","unknown"]},"description":"Effective evidence state. This is an assessment aid, not a legal conclusion\n\n* `satisfied` - Satisfied\n* `partially_satisfied` - Partially satisfied\n* `not_satisfied` - Not satisfied\n* `not_applicable` - Not applicable\n* `unknown` - Unknown"}],"tags":["obligation_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedObligationResultList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"obligation_results_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["obligation_results"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObligationResultRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ObligationResultRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ObligationResultRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObligationResult"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/obligation_results/{id}/":{"get":{"operationId":"obligation_results_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this obligation result.","required":true}],"tags":["obligation_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObligationResult"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"obligation_results_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this obligation result.","required":true}],"tags":["obligation_results"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObligationResultRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ObligationResultRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ObligationResultRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObligationResult"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"obligation_results_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this obligation result.","required":true}],"tags":["obligation_results"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedObligationResultRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedObligationResultRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedObligationResultRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObligationResult"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"obligation_results_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this obligation result.","required":true}],"tags":["obligation_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/obligation_results/{id}/attachments/":{"get":{"operationId":"obligation_results_attachments_list","description":"List an obligation's supporting files, or attach one. A file always arrives as a new upload: no client can\nlink an existing FileUpload, so nothing from another product can reach this obligation's evidence pack.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this obligation result.","required":true}],"tags":["obligation_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ObligationAttachment"}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"obligation_results_attachments_create","description":"List an obligation's supporting files, or attach one. A file always arrives as a new upload: no client can\nlink an existing FileUpload, so nothing from another product can reach this obligation's evidence pack.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this obligation result.","required":true}],"tags":["obligation_results"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ObligationAttachmentUploadRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObligationAttachment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/obligation_results/{id}/attachments/{file_id}/":{"delete":{"operationId":"obligation_results_attachments_destroy","description":"Remove one attached file. The file goes with its link: it belonged to this obligation alone.","parameters":[{"in":"path","name":"file_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this obligation result.","required":true}],"tags":["obligation_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/obligation_results/{id}/attachments/{file_id}/download/":{"get":{"operationId":"obligation_results_attachments_download_retrieve","description":"Serve one attached file. Always as a download (Content-Disposition: attachment) with a generic content\ntype, never inline: the allowlist carries .html, .js and .svg, and an inline render on this origin would run\nwhatever an uploader put in them.","parameters":[{"in":"path","name":"file_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this obligation result.","required":true}],"tags":["obligation_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/obligation_results/{id}/history/":{"get":{"operationId":"obligation_results_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"assessment","schema":{"type":"integer"}},{"in":"query","name":"control","schema":{"type":"integer"}},{"in":"query","name":"evidence_mode","schema":{"type":"string","x-spec-enum-id":"a7ea667bdebc6712","enum":["automated","hybrid","manual"]},"description":"* `automated` - Automated\n* `manual` - Manual\n* `hybrid` - Hybrid"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this obligation result.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"manual_override","schema":{"type":"boolean"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"5662d6e57f125b99","title":"Evidence Status","enum":["not_applicable","not_satisfied","partially_satisfied","satisfied","unknown"]},"description":"Effective evidence state. This is an assessment aid, not a legal conclusion\n\n* `satisfied` - Satisfied\n* `partially_satisfied` - Partially satisfied\n* `not_satisfied` - Not satisfied\n* `not_applicable` - Not applicable\n* `unknown` - Unknown"}],"tags":["obligation_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/obligation_results/{id}/history/legacy/":{"get":{"operationId":"obligation_results_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"assessment","schema":{"type":"integer"}},{"in":"query","name":"control","schema":{"type":"integer"}},{"in":"query","name":"evidence_mode","schema":{"type":"string","x-spec-enum-id":"a7ea667bdebc6712","enum":["automated","hybrid","manual"]},"description":"* `automated` - Automated\n* `manual` - Manual\n* `hybrid` - Hybrid"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this obligation result.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"manual_override","schema":{"type":"boolean"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"5662d6e57f125b99","title":"Evidence Status","enum":["not_applicable","not_satisfied","partially_satisfied","satisfied","unknown"]},"description":"Effective evidence state. This is an assessment aid, not a legal conclusion\n\n* `satisfied` - Satisfied\n* `partially_satisfied` - Partially satisfied\n* `not_satisfied` - Not satisfied\n* `not_applicable` - Not applicable\n* `unknown` - Unknown"}],"tags":["obligation_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/obligation_results/{id}/history/legacy/count/":{"get":{"operationId":"obligation_results_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this obligation result.","required":true}],"tags":["obligation_results"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/open_surveys/":{"get":{"operationId":"open_surveys_list","parameters":[{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"expiration_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"expiration_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"expiration_during","schema":{"type":"string"}},{"in":"query","name":"expiration_on","schema":{"type":"string"}},{"in":"query","name":"expiration_past_days","schema":{"type":"number"}},{"in":"query","name":"generated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"generated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"generated_during","schema":{"type":"string"}},{"in":"query","name":"generated_on","schema":{"type":"string"}},{"in":"query","name":"generated_past_days","schema":{"type":"number"}},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"num_responses_equals","schema":{"type":"integer"}},{"in":"query","name":"num_responses_greater_than","schema":{"type":"integer"}},{"in":"query","name":"num_responses_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"num_responses_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"num_responses_less_than","schema":{"type":"integer"}},{"in":"query","name":"num_responses_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"num_responses_not_equals","schema":{"type":"integer"}},{"in":"query","name":"num_responses_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-expiration","-generated","-id","-num_responses","-survey_name","expiration","generated","id","num_responses","survey_name"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `survey_name` - Survey name\n* `-survey_name` - Survey name (descending)\n* `num_responses` - Num responses\n* `-num_responses` - Num responses (descending)\n* `generated` - Generated\n* `-generated` - Generated (descending)\n* `expiration` - Expiration\n* `-expiration` - Expiration (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: survey__name"},{"in":"query","name":"survey","schema":{"type":"integer"}},{"in":"query","name":"survey_name_contains","schema":{"type":"string"}},{"in":"query","name":"survey_name_ends_with","schema":{"type":"string"}},{"in":"query","name":"survey_name_exact","schema":{"type":"string"}},{"in":"query","name":"survey_name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"survey_name_not_contains","schema":{"type":"string"}},{"in":"query","name":"survey_name_not_exact","schema":{"type":"string"}},{"in":"query","name":"survey_name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"survey_name_not_regex","schema":{"type":"string"}},{"in":"query","name":"survey_name_regex","schema":{"type":"string"}},{"in":"query","name":"survey_name_starts_with","schema":{"type":"string"}}],"tags":["open_surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProOpenSurveyList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"open_surveys_create","tags":["open_surveys"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProOpenSurveyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProOpenSurveyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProOpenSurveyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProOpenSurvey"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/open_surveys/{id}/":{"get":{"operationId":"open_surveys_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this General Engagement Survey.","required":true}],"tags":["open_surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProOpenSurvey"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"open_surveys_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this General Engagement Survey.","required":true}],"tags":["open_surveys"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProOpenSurveyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProOpenSurveyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProOpenSurveyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProOpenSurvey"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"open_surveys_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this General Engagement Survey.","required":true}],"tags":["open_surveys"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProOpenSurveyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProOpenSurveyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProOpenSurveyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProOpenSurvey"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"open_surveys_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this General Engagement Survey.","required":true}],"tags":["open_surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/open_surveys/{id}/answer/":{"post":{"operationId":"open_surveys_answer_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this General Engagement Survey.","required":true}],"tags":["open_surveys"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProOpenSurveyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProOpenSurveyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProOpenSurveyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProOpenSurvey"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/open_surveys/{id}/history/":{"get":{"operationId":"open_surveys_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"expiration_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"expiration_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"expiration_during","schema":{"type":"string"}},{"in":"query","name":"expiration_on","schema":{"type":"string"}},{"in":"query","name":"expiration_past_days","schema":{"type":"number"}},{"in":"query","name":"generated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"generated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"generated_during","schema":{"type":"string"}},{"in":"query","name":"generated_on","schema":{"type":"string"}},{"in":"query","name":"generated_past_days","schema":{"type":"number"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this General Engagement Survey.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"num_responses_equals","schema":{"type":"integer"}},{"in":"query","name":"num_responses_greater_than","schema":{"type":"integer"}},{"in":"query","name":"num_responses_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"num_responses_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"num_responses_less_than","schema":{"type":"integer"}},{"in":"query","name":"num_responses_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"num_responses_not_equals","schema":{"type":"integer"}},{"in":"query","name":"num_responses_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-expiration","-generated","-id","-num_responses","-survey_name","expiration","generated","id","num_responses","survey_name"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `survey_name` - Survey name\n* `-survey_name` - Survey name (descending)\n* `num_responses` - Num responses\n* `-num_responses` - Num responses (descending)\n* `generated` - Generated\n* `-generated` - Generated (descending)\n* `expiration` - Expiration\n* `-expiration` - Expiration (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: survey__name"},{"in":"query","name":"survey","schema":{"type":"integer"}},{"in":"query","name":"survey_name_contains","schema":{"type":"string"}},{"in":"query","name":"survey_name_ends_with","schema":{"type":"string"}},{"in":"query","name":"survey_name_exact","schema":{"type":"string"}},{"in":"query","name":"survey_name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"survey_name_not_contains","schema":{"type":"string"}},{"in":"query","name":"survey_name_not_exact","schema":{"type":"string"}},{"in":"query","name":"survey_name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"survey_name_not_regex","schema":{"type":"string"}},{"in":"query","name":"survey_name_regex","schema":{"type":"string"}},{"in":"query","name":"survey_name_starts_with","schema":{"type":"string"}}],"tags":["open_surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/open_surveys/{id}/history/legacy/":{"get":{"operationId":"open_surveys_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"expiration_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"expiration_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"expiration_during","schema":{"type":"string"}},{"in":"query","name":"expiration_on","schema":{"type":"string"}},{"in":"query","name":"expiration_past_days","schema":{"type":"number"}},{"in":"query","name":"generated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"generated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"generated_during","schema":{"type":"string"}},{"in":"query","name":"generated_on","schema":{"type":"string"}},{"in":"query","name":"generated_past_days","schema":{"type":"number"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this General Engagement Survey.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"num_responses_equals","schema":{"type":"integer"}},{"in":"query","name":"num_responses_greater_than","schema":{"type":"integer"}},{"in":"query","name":"num_responses_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"num_responses_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"num_responses_less_than","schema":{"type":"integer"}},{"in":"query","name":"num_responses_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"num_responses_not_equals","schema":{"type":"integer"}},{"in":"query","name":"num_responses_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-expiration","-generated","-id","-num_responses","-survey_name","expiration","generated","id","num_responses","survey_name"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `survey_name` - Survey name\n* `-survey_name` - Survey name (descending)\n* `num_responses` - Num responses\n* `-num_responses` - Num responses (descending)\n* `generated` - Generated\n* `-generated` - Generated (descending)\n* `expiration` - Expiration\n* `-expiration` - Expiration (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: survey__name"},{"in":"query","name":"survey","schema":{"type":"integer"}},{"in":"query","name":"survey_name_contains","schema":{"type":"string"}},{"in":"query","name":"survey_name_ends_with","schema":{"type":"string"}},{"in":"query","name":"survey_name_exact","schema":{"type":"string"}},{"in":"query","name":"survey_name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"survey_name_not_contains","schema":{"type":"string"}},{"in":"query","name":"survey_name_not_exact","schema":{"type":"string"}},{"in":"query","name":"survey_name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"survey_name_not_regex","schema":{"type":"string"}},{"in":"query","name":"survey_name_regex","schema":{"type":"string"}},{"in":"query","name":"survey_name_starts_with","schema":{"type":"string"}}],"tags":["open_surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/open_surveys/{id}/history/legacy/count/":{"get":{"operationId":"open_surveys_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this General Engagement Survey.","required":true}],"tags":["open_surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_groups/":{"get":{"operationId":"organization_groups_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization_id","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product_type_id","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["organization_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedProductTypeGroupList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"organization_groups_create","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","tags":["organization_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_groups/{id}/":{"get":{"operationId":"organization_groups_retrieve","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["organization_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"organization_groups_update","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true}],"tags":["organization_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"organization_groups_destroy","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true}],"tags":["organization_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_groups/{id}/delete_preview/":{"get":{"operationId":"organization_groups_delete_preview_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["organization_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_groups/{id}/history/":{"get":{"operationId":"organization_groups_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization_id","schema":{"type":"integer"}},{"in":"query","name":"product_type_id","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["organization_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_groups/{id}/history/legacy/":{"get":{"operationId":"organization_groups_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization_id","schema":{"type":"integer"}},{"in":"query","name":"product_type_id","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["organization_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_groups/{id}/history/legacy/count/":{"get":{"operationId":"organization_groups_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true}],"tags":["organization_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_members/":{"get":{"operationId":"organization_members_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization_id","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product_type","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product_type_id","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}},{"in":"query","name":"user","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"user_id","schema":{"type":"integer"}}],"tags":["organization_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedProductTypeMemberList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"organization_members_create","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","tags":["organization_members"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_members/{id}/":{"get":{"operationId":"organization_members_retrieve","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ member.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product_type","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["organization_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"organization_members_update","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ member.","required":true}],"tags":["organization_members"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"organization_members_destroy","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ member.","required":true}],"tags":["organization_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_members/{id}/delete_preview/":{"get":{"operationId":"organization_members_delete_preview_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ member.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["organization_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_memberships/":{"get":{"operationId":"organization_memberships_list","description":"Asset<->organization memberships: read every origin, mint and remove USER pins.\n\nNo update action on purpose -- a membership is created or dissolved, never edited. The\nprimary mirror row cannot be deleted here (repoint the asset's organization instead), and\npin creation requires edit permission on BOTH sides: adding an asset to an organization\ngrants that organization's members visibility into the asset under union-of-grants, so it\ntakes authority over the asset as well as over the organization. Creation is gated on\n``DD_V3_ORGANIZATION_NONEXCLUSIVE`` (the flag the union-of-grants consumer reads); reads\nand deletes stay available regardless so existing rows can always be inspected and\ncleaned up.","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"is_primary","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization","schema":{"type":"integer"}},{"in":"query","name":"origin","schema":{"type":"string","x-spec-enum-id":"8b4df912bcd675bd","enum":["connector","rule","user"]},"description":"Who created this membership: a user (manual pin), a connector's grouping attributes, or a tag-predicate membership rule. Automated reconciliation only ever touches rows of its own origin -- user pins are never removed by machinery.\n\n* `user` - User\n* `connector` - Connector\n* `rule` - Rule"},{"in":"query","name":"product","schema":{"type":"integer"}}],"tags":["organization_memberships"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedOrganizationMembershipList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"organization_memberships_create","description":"Asset<->organization memberships: read every origin, mint and remove USER pins.\n\nNo update action on purpose -- a membership is created or dissolved, never edited. The\nprimary mirror row cannot be deleted here (repoint the asset's organization instead), and\npin creation requires edit permission on BOTH sides: adding an asset to an organization\ngrants that organization's members visibility into the asset under union-of-grants, so it\ntakes authority over the asset as well as over the organization. Creation is gated on\n``DD_V3_ORGANIZATION_NONEXCLUSIVE`` (the flag the union-of-grants consumer reads); reads\nand deletes stay available regardless so existing rows can always be inspected and\ncleaned up.","tags":["organization_memberships"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMembershipRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/OrganizationMembershipRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/OrganizationMembershipRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMembership"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_memberships/{id}/":{"get":{"operationId":"organization_memberships_retrieve","description":"Asset<->organization memberships: read every origin, mint and remove USER pins.\n\nNo update action on purpose -- a membership is created or dissolved, never edited. The\nprimary mirror row cannot be deleted here (repoint the asset's organization instead), and\npin creation requires edit permission on BOTH sides: adding an asset to an organization\ngrants that organization's members visibility into the asset under union-of-grants, so it\ntakes authority over the asset as well as over the organization. Creation is gated on\n``DD_V3_ORGANIZATION_NONEXCLUSIVE`` (the flag the union-of-grants consumer reads); reads\nand deletes stay available regardless so existing rows can always be inspected and\ncleaned up.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this organization membership.","required":true}],"tags":["organization_memberships"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMembership"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"organization_memberships_destroy","description":"Asset<->organization memberships: read every origin, mint and remove USER pins.\n\nNo update action on purpose -- a membership is created or dissolved, never edited. The\nprimary mirror row cannot be deleted here (repoint the asset's organization instead), and\npin creation requires edit permission on BOTH sides: adding an asset to an organization\ngrants that organization's members visibility into the asset under union-of-grants, so it\ntakes authority over the asset as well as over the organization. Creation is gated on\n``DD_V3_ORGANIZATION_NONEXCLUSIVE`` (the flag the union-of-grants consumer reads); reads\nand deletes stay available regardless so existing rows can always be inspected and\ncleaned up.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this organization membership.","required":true}],"tags":["organization_memberships"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_type_roles/":{"get":{"operationId":"organization_type_roles_list","description":"Facet grants: a role held across every organization of one organization type (Phase 5).\n\n**Restricted to superusers and global owners, on every action including reads.** A facet\ngrant is an instance-wide privilege -- it reaches organizations that do not exist yet --\nso it cannot be delegated by per-object permission on any one organization the way an\n``OrganizationMembership`` can. Reads carry the same bar deliberately: the grant list is a\nmap of who holds broad access, which is exactly what an attacker enumerates first.\n\nNo update action, matching ``OrganizationMembershipViewSet``: a grant is created or\nrevoked. Editing one in place would silently move access between facets or roles under a\nsingle audit row, so re-granting is the honest operation.\n\nCreation is gated on ``DD_V3_ORGANIZATION_TYPE_ROLES`` (the flag the authorization\nconsumers read); reads and deletes stay available regardless, so rows created before the\nflag was turned off can always be inspected and cleaned up.","parameters":[{"in":"query","name":"group","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"org_type","schema":{"type":"string","x-spec-enum-id":"6ba9512199a7c3f4","title":"Organization Type","enum":["business_app","compliance_scope","custom","portfolio","team"]},"description":"The organization facet this grant covers. The role applies to every organization carrying this facet, including ones created later.\n\n* `team` - Team\n* `business_app` - Business Application\n* `compliance_scope` - Compliance Scope\n* `portfolio` - Portfolio\n* `custom` - Custom"},{"in":"query","name":"role","schema":{"type":"integer"}},{"in":"query","name":"user","schema":{"type":"integer"}}],"tags":["organization_type_roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedOrganizationTypeRoleList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"organization_type_roles_create","description":"Facet grants: a role held across every organization of one organization type (Phase 5).\n\n**Restricted to superusers and global owners, on every action including reads.** A facet\ngrant is an instance-wide privilege -- it reaches organizations that do not exist yet --\nso it cannot be delegated by per-object permission on any one organization the way an\n``OrganizationMembership`` can. Reads carry the same bar deliberately: the grant list is a\nmap of who holds broad access, which is exactly what an attacker enumerates first.\n\nNo update action, matching ``OrganizationMembershipViewSet``: a grant is created or\nrevoked. Editing one in place would silently move access between facets or roles under a\nsingle audit row, so re-granting is the honest operation.\n\nCreation is gated on ``DD_V3_ORGANIZATION_TYPE_ROLES`` (the flag the authorization\nconsumers read); reads and deletes stay available regardless, so rows created before the\nflag was turned off can always be inspected and cleaned up.","tags":["organization_type_roles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationTypeRoleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/OrganizationTypeRoleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/OrganizationTypeRoleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationTypeRole"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organization_type_roles/{id}/":{"get":{"operationId":"organization_type_roles_retrieve","description":"Facet grants: a role held across every organization of one organization type (Phase 5).\n\n**Restricted to superusers and global owners, on every action including reads.** A facet\ngrant is an instance-wide privilege -- it reaches organizations that do not exist yet --\nso it cannot be delegated by per-object permission on any one organization the way an\n``OrganizationMembership`` can. Reads carry the same bar deliberately: the grant list is a\nmap of who holds broad access, which is exactly what an attacker enumerates first.\n\nNo update action, matching ``OrganizationMembershipViewSet``: a grant is created or\nrevoked. Editing one in place would silently move access between facets or roles under a\nsingle audit row, so re-granting is the honest operation.\n\nCreation is gated on ``DD_V3_ORGANIZATION_TYPE_ROLES`` (the flag the authorization\nconsumers read); reads and deletes stay available regardless, so rows created before the\nflag was turned off can always be inspected and cleaned up.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this organization type role.","required":true}],"tags":["organization_type_roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationTypeRole"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"organization_type_roles_destroy","description":"Facet grants: a role held across every organization of one organization type (Phase 5).\n\n**Restricted to superusers and global owners, on every action including reads.** A facet\ngrant is an instance-wide privilege -- it reaches organizations that do not exist yet --\nso it cannot be delegated by per-object permission on any one organization the way an\n``OrganizationMembership`` can. Reads carry the same bar deliberately: the grant list is a\nmap of who holds broad access, which is exactly what an attacker enumerates first.\n\nNo update action, matching ``OrganizationMembershipViewSet``: a grant is created or\nrevoked. Editing one in place would silently move access between facets or roles under a\nsingle audit row, so re-granting is the honest operation.\n\nCreation is gated on ``DD_V3_ORGANIZATION_TYPE_ROLES`` (the flag the authorization\nconsumers read); reads and deletes stay available regardless, so rows created before the\nflag was turned off can always be inspected and cleaned up.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this organization type role.","required":true}],"tags":["organization_type_roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organizations/":{"get":{"operationId":"organizations_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"critical_asset","schema":{"type":"boolean"}},{"in":"query","name":"has_parent","schema":{"type":"boolean"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"key_asset","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"org_type","schema":{"type":"string","x-spec-enum-id":"6ba9512199a7c3f4","title":"Organization Type","enum":["business_app","compliance_scope","custom","portfolio","team"]},"description":"The facet this organization represents: team, business application, compliance scope, portfolio, or custom. Facets are orthogonal -- an asset may belong to one of each.\n\n* `team` - Team\n* `business_app` - Business Application\n* `compliance_scope` - Compliance Scope\n* `portfolio` - Portfolio\n* `custom` - Custom"},{"in":"query","name":"parent_organization","schema":{"type":"number"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["authorized_users"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}}],"tags":["organizations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedOrganizationList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"organizations_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["organizations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedOrganizationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedOrganizationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedOrganizationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedOrganization"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organizations/{id}/":{"get":{"operationId":"organizations_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["authorized_users"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["organizations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedOrganization"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"organizations_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true}],"tags":["organizations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedOrganizationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedOrganizationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedOrganizationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedOrganization"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"organizations_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true}],"tags":["organizations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedOrganizationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedOrganizationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedOrganizationRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedOrganization"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"organizations_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true}],"tags":["organizations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organizations/{id}/delete_preview/":{"get":{"operationId":"organizations_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["organizations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organizations/{id}/generate_report/":{"post":{"operationId":"organizations_generate_report_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true}],"tags":["organizations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organizations/{id}/history/":{"get":{"operationId":"organizations_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"critical_asset","schema":{"type":"boolean"}},{"in":"query","name":"has_parent","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"key_asset","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"org_type","schema":{"type":"string","x-spec-enum-id":"6ba9512199a7c3f4","title":"Organization Type","enum":["business_app","compliance_scope","custom","portfolio","team"]},"description":"The facet this organization represents: team, business application, compliance scope, portfolio, or custom. Facets are orthogonal -- an asset may belong to one of each.\n\n* `team` - Team\n* `business_app` - Business Application\n* `compliance_scope` - Compliance Scope\n* `portfolio` - Portfolio\n* `custom` - Custom"},{"in":"query","name":"parent_organization","schema":{"type":"number"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}}],"tags":["organizations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organizations/{id}/history/legacy/":{"get":{"operationId":"organizations_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"critical_asset","schema":{"type":"boolean"}},{"in":"query","name":"has_parent","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"key_asset","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"org_type","schema":{"type":"string","x-spec-enum-id":"6ba9512199a7c3f4","title":"Organization Type","enum":["business_app","compliance_scope","custom","portfolio","team"]},"description":"The facet this organization represents: team, business application, compliance scope, portfolio, or custom. Facets are orthogonal -- an asset may belong to one of each.\n\n* `team` - Team\n* `business_app` - Business Application\n* `compliance_scope` - Compliance Scope\n* `portfolio` - Portfolio\n* `custom` - Custom"},{"in":"query","name":"parent_organization","schema":{"type":"number"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}}],"tags":["organizations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/organizations/{id}/history/legacy/count/":{"get":{"operationId":"organizations_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true}],"tags":["organizations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/layouts/":{"get":{"operationId":"page_layouts_layouts_list","description":"CRUD, sharing, and cloning for customizable View-page layouts.\n\nA layout is a persistent widget grid for ONE entity View page, identified by\n``page_key`` (the set is published by ``pro.page_layouts.pages.PAGE_KEYS`` and by\nthe ``page`` parameter's enum on every action below). Each layout\nbelongs to a single user, or to the shared set when ``is_shared=True``, and\ncarries:\n\n  * ``widgets`` - an ordered list of widget objects, each with a ``type``\n    (one of the values from ``/api/v2/page_layouts/widget_catalog/`` for that\n    page), an optional ``title`` (null means \"render the product's own label\",\n    which keeps relabeled wording live), a per-type ``config``, and a UUID\n    ``id`` tying the widget to its grid position.\n  * ``layout`` - a UUID to grid-position map (``{x, y, w, h, min_w, min_h,\n    max_w, max_h}``) on the 12-column grid.\n  * ``settings`` - reserved for per-layout options; carries nothing today.\n\nResolution model (no autoclone, resolve at read):\n\n  The effective layout for a page is the caller's personal default, else the\n  admin-designated shared page default, else the layout the product ships in\n  code. Personal rows are created copy-on-write, the first time a user\n  customizes a page. Users who never customize keep picking up product changes\n  to the shipped layout, and admins can retheme a page for everyone by\n  changing the shared default.\n\nAuthorization model:\n\n  * The whole surface is gated behind the ``page_layouts`` feature flag\n    (``PageLayoutsCustomizationEnabled``); when it is off the read actions\nstill work, because the grid is the only renderer for those View pages\nand 403ing those would blank the pages. Every write returns 403\n    regardless of the caller's role.\n  * Any authenticated user can list and read their own layouts plus every\n    shared layout, and can create their own.\n  * Publishing or modifying a shared layout, and setting or clearing the\n    global page default, require the global ``Page_Layout_Share`` permission.\n  * Cloning is always allowed; the clone is personal and independent.\n\nTypical AI-agent flow:\n\n  1. ``GET widget_catalog/?page=asset`` once to discover widget types.\n  2. ``GET layouts/for_page/?page=asset`` to read the current state, including\n     the shipped default to start from.\n  3. ``POST layouts/`` with the desired ``widgets`` and ``layout``.\n  4. ``POST layouts/{id}/set_default/`` to make it the caller's default.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"page","schema":{"type":"string","enum":["asset","engagement","finding","organization","risk_acceptance","test"]},"description":"Optional View page key to filter by. One of organization, asset, engagement, test, finding, risk_acceptance."}],"tags":["page_layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPageLayoutList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"page_layouts_layouts_create","description":"CRUD, sharing, and cloning for customizable View-page layouts.\n\nA layout is a persistent widget grid for ONE entity View page, identified by\n``page_key`` (the set is published by ``pro.page_layouts.pages.PAGE_KEYS`` and by\nthe ``page`` parameter's enum on every action below). Each layout\nbelongs to a single user, or to the shared set when ``is_shared=True``, and\ncarries:\n\n  * ``widgets`` - an ordered list of widget objects, each with a ``type``\n    (one of the values from ``/api/v2/page_layouts/widget_catalog/`` for that\n    page), an optional ``title`` (null means \"render the product's own label\",\n    which keeps relabeled wording live), a per-type ``config``, and a UUID\n    ``id`` tying the widget to its grid position.\n  * ``layout`` - a UUID to grid-position map (``{x, y, w, h, min_w, min_h,\n    max_w, max_h}``) on the 12-column grid.\n  * ``settings`` - reserved for per-layout options; carries nothing today.\n\nResolution model (no autoclone, resolve at read):\n\n  The effective layout for a page is the caller's personal default, else the\n  admin-designated shared page default, else the layout the product ships in\n  code. Personal rows are created copy-on-write, the first time a user\n  customizes a page. Users who never customize keep picking up product changes\n  to the shipped layout, and admins can retheme a page for everyone by\n  changing the shared default.\n\nAuthorization model:\n\n  * The whole surface is gated behind the ``page_layouts`` feature flag\n    (``PageLayoutsCustomizationEnabled``); when it is off the read actions\nstill work, because the grid is the only renderer for those View pages\nand 403ing those would blank the pages. Every write returns 403\n    regardless of the caller's role.\n  * Any authenticated user can list and read their own layouts plus every\n    shared layout, and can create their own.\n  * Publishing or modifying a shared layout, and setting or clearing the\n    global page default, require the global ``Page_Layout_Share`` permission.\n  * Cloning is always allowed; the clone is personal and independent.\n\nTypical AI-agent flow:\n\n  1. ``GET widget_catalog/?page=asset`` once to discover widget types.\n  2. ``GET layouts/for_page/?page=asset`` to read the current state, including\n     the shipped default to start from.\n  3. ``POST layouts/`` with the desired ``widgets`` and ``layout``.\n  4. ``POST layouts/{id}/set_default/`` to make it the caller's default.","tags":["page_layouts"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayoutRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PageLayoutRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PageLayoutRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayout"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/layouts/{id}/":{"get":{"operationId":"page_layouts_layouts_retrieve","description":"CRUD, sharing, and cloning for customizable View-page layouts.\n\nA layout is a persistent widget grid for ONE entity View page, identified by\n``page_key`` (the set is published by ``pro.page_layouts.pages.PAGE_KEYS`` and by\nthe ``page`` parameter's enum on every action below). Each layout\nbelongs to a single user, or to the shared set when ``is_shared=True``, and\ncarries:\n\n  * ``widgets`` - an ordered list of widget objects, each with a ``type``\n    (one of the values from ``/api/v2/page_layouts/widget_catalog/`` for that\n    page), an optional ``title`` (null means \"render the product's own label\",\n    which keeps relabeled wording live), a per-type ``config``, and a UUID\n    ``id`` tying the widget to its grid position.\n  * ``layout`` - a UUID to grid-position map (``{x, y, w, h, min_w, min_h,\n    max_w, max_h}``) on the 12-column grid.\n  * ``settings`` - reserved for per-layout options; carries nothing today.\n\nResolution model (no autoclone, resolve at read):\n\n  The effective layout for a page is the caller's personal default, else the\n  admin-designated shared page default, else the layout the product ships in\n  code. Personal rows are created copy-on-write, the first time a user\n  customizes a page. Users who never customize keep picking up product changes\n  to the shipped layout, and admins can retheme a page for everyone by\n  changing the shared default.\n\nAuthorization model:\n\n  * The whole surface is gated behind the ``page_layouts`` feature flag\n    (``PageLayoutsCustomizationEnabled``); when it is off the read actions\nstill work, because the grid is the only renderer for those View pages\nand 403ing those would blank the pages. Every write returns 403\n    regardless of the caller's role.\n  * Any authenticated user can list and read their own layouts plus every\n    shared layout, and can create their own.\n  * Publishing or modifying a shared layout, and setting or clearing the\n    global page default, require the global ``Page_Layout_Share`` permission.\n  * Cloning is always allowed; the clone is personal and independent.\n\nTypical AI-agent flow:\n\n  1. ``GET widget_catalog/?page=asset`` once to discover widget types.\n  2. ``GET layouts/for_page/?page=asset`` to read the current state, including\n     the shipped default to start from.\n  3. ``POST layouts/`` with the desired ``widgets`` and ``layout``.\n  4. ``POST layouts/{id}/set_default/`` to make it the caller's default.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this page layout.","required":true}],"tags":["page_layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayout"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"page_layouts_layouts_update","description":"CRUD, sharing, and cloning for customizable View-page layouts.\n\nA layout is a persistent widget grid for ONE entity View page, identified by\n``page_key`` (the set is published by ``pro.page_layouts.pages.PAGE_KEYS`` and by\nthe ``page`` parameter's enum on every action below). Each layout\nbelongs to a single user, or to the shared set when ``is_shared=True``, and\ncarries:\n\n  * ``widgets`` - an ordered list of widget objects, each with a ``type``\n    (one of the values from ``/api/v2/page_layouts/widget_catalog/`` for that\n    page), an optional ``title`` (null means \"render the product's own label\",\n    which keeps relabeled wording live), a per-type ``config``, and a UUID\n    ``id`` tying the widget to its grid position.\n  * ``layout`` - a UUID to grid-position map (``{x, y, w, h, min_w, min_h,\n    max_w, max_h}``) on the 12-column grid.\n  * ``settings`` - reserved for per-layout options; carries nothing today.\n\nResolution model (no autoclone, resolve at read):\n\n  The effective layout for a page is the caller's personal default, else the\n  admin-designated shared page default, else the layout the product ships in\n  code. Personal rows are created copy-on-write, the first time a user\n  customizes a page. Users who never customize keep picking up product changes\n  to the shipped layout, and admins can retheme a page for everyone by\n  changing the shared default.\n\nAuthorization model:\n\n  * The whole surface is gated behind the ``page_layouts`` feature flag\n    (``PageLayoutsCustomizationEnabled``); when it is off the read actions\nstill work, because the grid is the only renderer for those View pages\nand 403ing those would blank the pages. Every write returns 403\n    regardless of the caller's role.\n  * Any authenticated user can list and read their own layouts plus every\n    shared layout, and can create their own.\n  * Publishing or modifying a shared layout, and setting or clearing the\n    global page default, require the global ``Page_Layout_Share`` permission.\n  * Cloning is always allowed; the clone is personal and independent.\n\nTypical AI-agent flow:\n\n  1. ``GET widget_catalog/?page=asset`` once to discover widget types.\n  2. ``GET layouts/for_page/?page=asset`` to read the current state, including\n     the shipped default to start from.\n  3. ``POST layouts/`` with the desired ``widgets`` and ``layout``.\n  4. ``POST layouts/{id}/set_default/`` to make it the caller's default.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this page layout.","required":true}],"tags":["page_layouts"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayoutRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PageLayoutRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PageLayoutRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayout"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"page_layouts_layouts_partial_update","description":"CRUD, sharing, and cloning for customizable View-page layouts.\n\nA layout is a persistent widget grid for ONE entity View page, identified by\n``page_key`` (the set is published by ``pro.page_layouts.pages.PAGE_KEYS`` and by\nthe ``page`` parameter's enum on every action below). Each layout\nbelongs to a single user, or to the shared set when ``is_shared=True``, and\ncarries:\n\n  * ``widgets`` - an ordered list of widget objects, each with a ``type``\n    (one of the values from ``/api/v2/page_layouts/widget_catalog/`` for that\n    page), an optional ``title`` (null means \"render the product's own label\",\n    which keeps relabeled wording live), a per-type ``config``, and a UUID\n    ``id`` tying the widget to its grid position.\n  * ``layout`` - a UUID to grid-position map (``{x, y, w, h, min_w, min_h,\n    max_w, max_h}``) on the 12-column grid.\n  * ``settings`` - reserved for per-layout options; carries nothing today.\n\nResolution model (no autoclone, resolve at read):\n\n  The effective layout for a page is the caller's personal default, else the\n  admin-designated shared page default, else the layout the product ships in\n  code. Personal rows are created copy-on-write, the first time a user\n  customizes a page. Users who never customize keep picking up product changes\n  to the shipped layout, and admins can retheme a page for everyone by\n  changing the shared default.\n\nAuthorization model:\n\n  * The whole surface is gated behind the ``page_layouts`` feature flag\n    (``PageLayoutsCustomizationEnabled``); when it is off the read actions\nstill work, because the grid is the only renderer for those View pages\nand 403ing those would blank the pages. Every write returns 403\n    regardless of the caller's role.\n  * Any authenticated user can list and read their own layouts plus every\n    shared layout, and can create their own.\n  * Publishing or modifying a shared layout, and setting or clearing the\n    global page default, require the global ``Page_Layout_Share`` permission.\n  * Cloning is always allowed; the clone is personal and independent.\n\nTypical AI-agent flow:\n\n  1. ``GET widget_catalog/?page=asset`` once to discover widget types.\n  2. ``GET layouts/for_page/?page=asset`` to read the current state, including\n     the shipped default to start from.\n  3. ``POST layouts/`` with the desired ``widgets`` and ``layout``.\n  4. ``POST layouts/{id}/set_default/`` to make it the caller's default.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this page layout.","required":true}],"tags":["page_layouts"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPageLayoutRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPageLayoutRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPageLayoutRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayout"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"page_layouts_layouts_destroy","description":"CRUD, sharing, and cloning for customizable View-page layouts.\n\nA layout is a persistent widget grid for ONE entity View page, identified by\n``page_key`` (the set is published by ``pro.page_layouts.pages.PAGE_KEYS`` and by\nthe ``page`` parameter's enum on every action below). Each layout\nbelongs to a single user, or to the shared set when ``is_shared=True``, and\ncarries:\n\n  * ``widgets`` - an ordered list of widget objects, each with a ``type``\n    (one of the values from ``/api/v2/page_layouts/widget_catalog/`` for that\n    page), an optional ``title`` (null means \"render the product's own label\",\n    which keeps relabeled wording live), a per-type ``config``, and a UUID\n    ``id`` tying the widget to its grid position.\n  * ``layout`` - a UUID to grid-position map (``{x, y, w, h, min_w, min_h,\n    max_w, max_h}``) on the 12-column grid.\n  * ``settings`` - reserved for per-layout options; carries nothing today.\n\nResolution model (no autoclone, resolve at read):\n\n  The effective layout for a page is the caller's personal default, else the\n  admin-designated shared page default, else the layout the product ships in\n  code. Personal rows are created copy-on-write, the first time a user\n  customizes a page. Users who never customize keep picking up product changes\n  to the shipped layout, and admins can retheme a page for everyone by\n  changing the shared default.\n\nAuthorization model:\n\n  * The whole surface is gated behind the ``page_layouts`` feature flag\n    (``PageLayoutsCustomizationEnabled``); when it is off the read actions\nstill work, because the grid is the only renderer for those View pages\nand 403ing those would blank the pages. Every write returns 403\n    regardless of the caller's role.\n  * Any authenticated user can list and read their own layouts plus every\n    shared layout, and can create their own.\n  * Publishing or modifying a shared layout, and setting or clearing the\n    global page default, require the global ``Page_Layout_Share`` permission.\n  * Cloning is always allowed; the clone is personal and independent.\n\nTypical AI-agent flow:\n\n  1. ``GET widget_catalog/?page=asset`` once to discover widget types.\n  2. ``GET layouts/for_page/?page=asset`` to read the current state, including\n     the shipped default to start from.\n  3. ``POST layouts/`` with the desired ``widgets`` and ``layout``.\n  4. ``POST layouts/{id}/set_default/`` to make it the caller's default.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this page layout.","required":true}],"tags":["page_layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/layouts/{id}/clone/":{"post":{"operationId":"page_layouts_layouts_clone","description":"Creates a personal copy of the source layout on the same page. Each widget in the copy gets a freshly generated UUID, so later PATCHes to the clone cannot rewrite the source, and the ``layout`` position map is remapped to the new ids.\n\nIf ``name`` is omitted the clone is named ``\"Copy of <source name>\"``. A 400 is returned when the caller already has a layout with that name on that page.","summary":"Clone a layout into the caller's own space","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this page layout.","required":true}],"tags":["page_layouts"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayoutCloneRequestRequest"},"examples":{"CloneWithCustomName":{"value":{"name":"My Asset View"},"summary":"Clone with custom name"}}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PageLayoutCloneRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PageLayoutCloneRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayout"}}},"description":""},"400":{"description":"Name already exists for the caller on this page."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/layouts/{id}/set_default/":{"post":{"operationId":"page_layouts_layouts_set_default","description":"Sets the layout identified by ``id`` as the caller's default for that layout's page. Defaults are per page, so setting an Asset default does not affect the Finding page. A user may only default their OWN layouts: defaulting a shared row returns 400 (use ``set_shared_default`` for the global pointer). The previous pointer for the page is replaced atomically.","summary":"Make a layout the caller's default for its page","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this page layout.","required":true}],"tags":["page_layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayout"}}},"description":""},"400":{"description":"Not the layout owner."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/layouts/{id}/set_shared_default/":{"post":{"operationId":"page_layouts_layouts_set_shared_default","description":"Requires the global ``Page_Layout_Share`` permission. The target must already be shared (``is_shared=true``); a personal row returns 400. Every user who has not set a personal default for that page then sees this layout instead of the shipped one.","summary":"Make a shared layout the global default for its page","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this page layout.","required":true}],"tags":["page_layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayout"}}},"description":""},"400":{"description":"Target layout is not shared."},"403":{"description":"Missing the share permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/layouts/clear_default/":{"post":{"operationId":"page_layouts_layouts_clear_default","description":"Removes the caller's personal default for the given page, so the page falls back to the global shared default, else the shipped layout. Idempotent: 204 whether or not a pointer existed.","summary":"Drop the caller's default pointer for one page","tags":["page_layouts"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayoutClearDefaultRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PageLayoutClearDefaultRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PageLayoutClearDefaultRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"Pointer cleared."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/layouts/clear_shared_default/":{"post":{"operationId":"page_layouts_layouts_clear_shared_default","description":"Requires the global ``Page_Layout_Share`` permission. The page falls back to the shipped layout for every user without a personal default. Idempotent: 204 whether or not a pointer existed.","summary":"Drop the global default pointer for one page","tags":["page_layouts"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayoutClearSharedDefaultRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PageLayoutClearSharedDefaultRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PageLayoutClearSharedDefaultRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"Pointer cleared."},"403":{"description":"Missing the share permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/layouts/for_page/":{"get":{"operationId":"page_layouts_layouts_for_page","description":"Single read the UI needs on page load. Returns the caller's own layouts for the page, the shared templates for the page, the caller's personal default pointer, the global default pointer, and the layout the product ships in code.\n\nThis endpoint performs NO writes. Nothing is auto-cloned and no pointer is created as a side effect, which is what lets a user who never customizes the page keep receiving product changes to the shipped layout.\n\nClient-side resolution order: the persisted selection if it is still valid, else ``default_id``, else ``shared_default_id`` (read-only), else ``shipped_default`` (read-only).","summary":"Bootstrap every layout state for one View page","parameters":[{"in":"query","name":"page","schema":{"type":"string","enum":["asset","engagement","finding","organization","risk_acceptance","test"]},"description":"View page key. One of organization, asset, engagement, test, finding, risk_acceptance.","required":true}],"tags":["page_layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"Layout state for the page."},"400":{"description":"Unknown page key."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/layouts/shared/":{"get":{"operationId":"page_layouts_layouts_shared","description":"Read-only. Every shared layout across all pages, so the Layout Defaults settings page can offer one dropdown of choices per page. Grouped by page key on the client.","summary":"List every shared layout, for the Layout Defaults dropdowns","tags":["page_layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayoutSharedResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/layouts/shared_defaults/":{"get":{"operationId":"page_layouts_layouts_shared_defaults","description":"Read-only overview for the Layout Defaults settings page: one entry per page that has a designated global default, each with the page key and the target layout's id and name. Pages with no designation are omitted.","summary":"List every global default page pointer","tags":["page_layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageLayoutSharedDefaultsResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/layouts/shipped/":{"get":{"operationId":"page_layouts_layouts_shipped","description":"Returns the code-shipped layout for the page as a read-only template. It is never a database row, which is why users who have not customized the page keep receiving product changes to it. List-shaped so a page can ship more than one template later without a breaking change.","summary":"Read the layout the product ships for one page","parameters":[{"in":"query","name":"page","schema":{"type":"string","enum":["asset","engagement","finding","organization","risk_acceptance","test"]},"description":"View page key. One of organization, asset, engagement, test, finding, risk_acceptance.","required":true}],"tags":["page_layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"The shipped template for the page."},"400":{"description":"Unknown page key."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/page_layouts/widget_catalog/":{"get":{"operationId":"page_layouts_widget_catalog_list","description":"Without ``page``, returns ``{\"pages\": [...]}`` with one descriptor per View page. With ``page``, returns that single descriptor.\n\nEach descriptor carries:\n\n* ``widgets`` - every type valid on the page. ``type`` is the value to set on a widget in a saved layout, ``pane`` says whether the type may be used as a tab inside a tab group, ``gates`` names the feature flags or system settings that decide whether it renders (a gated-off widget is simply skipped, it is not an error), and ``config_example`` is a minimal valid config to copy.\n* ``metadata_fields`` - the only field keys a ``metadata`` widget's ``config.fields`` may name on this page, in the standard display order.\n* ``tabs`` - the tab-group limits: ``max_tabs`` and the ``pane_types`` allowed inside one.\n\nWidget types are page-scoped: the same slug on two pages can bind different content, and a type valid on one page is a 400 on another.","summary":"List every widget type the View pages support","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"page","schema":{"type":"string","enum":["asset","engagement","finding","organization","risk_acceptance","test"]},"description":"Optional View page key to filter by. One of organization, asset, engagement, test, finding, risk_acceptance."}],"tags":["page_layouts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"Widget catalog descriptors."},"400":{"description":"Unknown page key."},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/pci_evidence/annual/":{"get":{"operationId":"pci_evidence_annual_retrieve","description":"The Requirement 11.4 checks: penetration tests, segmentation, and retest of findings.","tags":["pci_evidence"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/pci_evidence/export/":{"get":{"operationId":"pci_evidence_export_retrieve","description":"The evidence workbook for every in-scope product, optionally narrowed to one organization.","tags":["pci_evidence"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string","format":"binary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/pci_evidence/quarterly/":{"get":{"operationId":"pci_evidence_quarterly_retrieve","description":"The six Requirement 11.3 checks for each of the product's four quarters.","tags":["pci_evidence"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/pci_significant_changes/":{"get":{"operationId":"pci_significant_changes_list","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","parameters":[{"in":"query","name":"change_date","schema":{"type":"string","format":"date"}},{"in":"query","name":"change_date__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"change_date__lte","schema":{"type":"string","format":"date"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"requires_asv_scan","schema":{"type":"boolean"}},{"in":"query","name":"requires_internal_scan","schema":{"type":"boolean"}},{"in":"query","name":"requires_pentest","schema":{"type":"boolean"}}],"tags":["pci_significant_changes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSignificantChangeList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"pci_significant_changes_create","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","tags":["pci_significant_changes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignificantChangeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SignificantChangeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SignificantChangeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignificantChange"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/pci_significant_changes/{id}/":{"get":{"operationId":"pci_significant_changes_retrieve","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this significant change.","required":true}],"tags":["pci_significant_changes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignificantChange"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"pci_significant_changes_update","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this significant change.","required":true}],"tags":["pci_significant_changes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignificantChangeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SignificantChangeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SignificantChangeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignificantChange"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"pci_significant_changes_partial_update","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this significant change.","required":true}],"tags":["pci_significant_changes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedSignificantChangeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedSignificantChangeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedSignificantChangeRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignificantChange"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"pci_significant_changes_destroy","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this significant change.","required":true}],"tags":["pci_significant_changes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/pci_unauthenticated_exceptions/":{"get":{"operationId":"pci_unauthenticated_exceptions_list","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"system_identifier","schema":{"type":"string"}},{"in":"query","name":"system_identifier__icontains","schema":{"type":"string"}},{"in":"query","name":"valid_from","schema":{"type":"string","format":"date"}},{"in":"query","name":"valid_from__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"valid_from__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"valid_until","schema":{"type":"string","format":"date"}},{"in":"query","name":"valid_until__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"valid_until__isnull","schema":{"type":"boolean"}},{"in":"query","name":"valid_until__lte","schema":{"type":"string","format":"date"}}],"tags":["pci_unauthenticated_exceptions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedUnauthenticatedSystemExceptionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"pci_unauthenticated_exceptions_create","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","tags":["pci_unauthenticated_exceptions"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthenticatedSystemExceptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/UnauthenticatedSystemExceptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UnauthenticatedSystemExceptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthenticatedSystemException"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/pci_unauthenticated_exceptions/{id}/":{"get":{"operationId":"pci_unauthenticated_exceptions_retrieve","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this unauthenticated system exception.","required":true}],"tags":["pci_unauthenticated_exceptions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthenticatedSystemException"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"pci_unauthenticated_exceptions_update","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this unauthenticated system exception.","required":true}],"tags":["pci_unauthenticated_exceptions"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthenticatedSystemExceptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/UnauthenticatedSystemExceptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UnauthenticatedSystemExceptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthenticatedSystemException"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"pci_unauthenticated_exceptions_partial_update","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this unauthenticated system exception.","required":true}],"tags":["pci_unauthenticated_exceptions"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedUnauthenticatedSystemExceptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedUnauthenticatedSystemExceptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedUnauthenticatedSystemExceptionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnauthenticatedSystemException"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"pci_unauthenticated_exceptions_destroy","description":"Stamp the creating user onto ``recorded_by`` rather than trusting the payload.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this unauthenticated system exception.","required":true}],"tags":["pci_unauthenticated_exceptions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_artifacts/":{"get":{"operationId":"poam_artifacts_list","parameters":[{"in":"query","name":"kind","schema":{"type":"string","x-spec-enum-id":"6f90a37efbd8a510","enum":["fedramp_xlsx","oscal_poam_json"]},"description":"The deliverable format\n\n* `fedramp_xlsx` - FedRAMP POA&M workbook (xlsx)\n* `oscal_poam_json` - OSCAL POA&M (json)"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"snapshot","schema":{"type":"integer"}}],"tags":["poam_artifacts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPOAMArtifactList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_artifacts/{id}/":{"get":{"operationId":"poam_artifacts_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam artifact.","required":true}],"tags":["poam_artifacts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMArtifact"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_artifacts/{id}/download/":{"get":{"operationId":"poam_artifacts_download_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam artifact.","required":true}],"tags":["poam_artifacts"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMArtifact"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_items/":{"get":{"operationId":"poam_items_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"is_cm6_consolidated","schema":{"type":"boolean"}},{"in":"query","name":"is_configuration_item","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"original_risk_rating","schema":{"type":"string","x-spec-enum-id":"568f7c4ec987ae2a","enum":["High","Low","Moderate"]},"description":"The initial risk rating on the FedRAMP High/Moderate/Low scale\n\n* `High` - High\n* `Moderate` - Moderate\n* `Low` - Low"},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"da18659620c74b54","enum":["closed","open"]},"description":"Open items appear on the Open POA&M Items worksheet; closed on the Closed one\n\n* `open` - Open\n* `closed` - Closed"},{"in":"query","name":"vendor_dependency","schema":{"type":"boolean"}}],"tags":["poam_items"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPOAMItemList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"poam_items_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["poam_items"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMItemRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/POAMItemRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/POAMItemRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMItem"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_items/{id}/":{"get":{"operationId":"poam_items_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam item.","required":true}],"tags":["poam_items"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMItem"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"poam_items_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam item.","required":true}],"tags":["poam_items"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMItemRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/POAMItemRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/POAMItemRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMItem"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"poam_items_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam item.","required":true}],"tags":["poam_items"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPOAMItemRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPOAMItemRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPOAMItemRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMItem"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"poam_items_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam item.","required":true}],"tags":["poam_items"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_items/{id}/history/":{"get":{"operationId":"poam_items_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam item.","required":true},{"in":"query","name":"is_cm6_consolidated","schema":{"type":"boolean"}},{"in":"query","name":"is_configuration_item","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"original_risk_rating","schema":{"type":"string","x-spec-enum-id":"568f7c4ec987ae2a","enum":["High","Low","Moderate"]},"description":"The initial risk rating on the FedRAMP High/Moderate/Low scale\n\n* `High` - High\n* `Moderate` - Moderate\n* `Low` - Low"},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"da18659620c74b54","enum":["closed","open"]},"description":"Open items appear on the Open POA&M Items worksheet; closed on the Closed one\n\n* `open` - Open\n* `closed` - Closed"},{"in":"query","name":"vendor_dependency","schema":{"type":"boolean"}}],"tags":["poam_items"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_items/{id}/history/legacy/":{"get":{"operationId":"poam_items_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam item.","required":true},{"in":"query","name":"is_cm6_consolidated","schema":{"type":"boolean"}},{"in":"query","name":"is_configuration_item","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"original_risk_rating","schema":{"type":"string","x-spec-enum-id":"568f7c4ec987ae2a","enum":["High","Low","Moderate"]},"description":"The initial risk rating on the FedRAMP High/Moderate/Low scale\n\n* `High` - High\n* `Moderate` - Moderate\n* `Low` - Low"},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"da18659620c74b54","enum":["closed","open"]},"description":"Open items appear on the Open POA&M Items worksheet; closed on the Closed one\n\n* `open` - Open\n* `closed` - Closed"},{"in":"query","name":"vendor_dependency","schema":{"type":"boolean"}}],"tags":["poam_items"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_items/{id}/history/legacy/count/":{"get":{"operationId":"poam_items_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam item.","required":true}],"tags":["poam_items"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_milestones/":{"get":{"operationId":"poam_milestones_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"item","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["poam_milestones"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPOAMMilestoneList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"poam_milestones_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["poam_milestones"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMMilestoneRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/POAMMilestoneRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/POAMMilestoneRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMMilestone"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_milestones/{id}/":{"get":{"operationId":"poam_milestones_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam milestone.","required":true}],"tags":["poam_milestones"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMMilestone"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"poam_milestones_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam milestone.","required":true}],"tags":["poam_milestones"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMMilestoneRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/POAMMilestoneRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/POAMMilestoneRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMMilestone"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"poam_milestones_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam milestone.","required":true}],"tags":["poam_milestones"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPOAMMilestoneRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPOAMMilestoneRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPOAMMilestoneRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMMilestone"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"poam_milestones_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam milestone.","required":true}],"tags":["poam_milestones"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_milestones/{id}/history/":{"get":{"operationId":"poam_milestones_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam milestone.","required":true},{"in":"query","name":"item","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["poam_milestones"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_milestones/{id}/history/legacy/":{"get":{"operationId":"poam_milestones_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam milestone.","required":true},{"in":"query","name":"item","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["poam_milestones"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_milestones/{id}/history/legacy/count/":{"get":{"operationId":"poam_milestones_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam milestone.","required":true}],"tags":["poam_milestones"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_snapshots/":{"get":{"operationId":"poam_snapshots_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"period","schema":{"type":"string","format":"date"}},{"in":"query","name":"period__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"period__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"a8f61caf99619754","enum":["completed","failed","pending","processing"]},"description":"Generation lifecycle state\n\n* `pending` - Pending\n* `processing` - Processing\n* `completed` - Completed\n* `failed` - Failed"}],"tags":["poam_snapshots"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPOAMSnapshotList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_snapshots/{id}/":{"get":{"operationId":"poam_snapshots_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam snapshot.","required":true}],"tags":["poam_snapshots"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMSnapshotDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"poam_snapshots_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this poam snapshot.","required":true}],"tags":["poam_snapshots"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/poam_snapshots/generate/":{"post":{"operationId":"poam_snapshots_generate_create","description":"Create (or regenerate) a monthly ConMon snapshot for a product and dispatch generation.","tags":["poam_snapshots"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMSnapshotRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/POAMSnapshotRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/POAMSnapshotRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/POAMSnapshot"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/preset_applications/":{"get":{"operationId":"preset_applications_list","description":"The history of preset plans and applications, with ``revert`` for a live application.","parameters":[{"in":"query","name":"drifted","schema":{"type":"boolean"},"description":"true: only applications whose applied settings no longer match; false: only those that still match."},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"live","schema":{"type":"boolean"},"description":"true: only applied applications that have not been reverted."},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"preset","schema":{"type":"integer"}},{"in":"query","name":"scope_type","schema":{"type":"string","x-spec-enum-id":"244477cf639989fa","enum":["instance","product","product_type"]},"description":"What the checks in this application are evaluated against.\n\n* `instance` - Whole instance\n* `product_type` - One product type\n* `product` - One product"},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"8ca65ee3ca0de9eb","enum":["applied","partially_applied","previewed","reverted"]},"description":"Where this application is in its lifecycle.\n\n* `previewed` - Previewed\n* `applied` - Applied\n* `partially_applied` - Partially applied\n* `reverted` - Reverted"},{"in":"query","name":"status__in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"variant","schema":{"type":"string"}}],"tags":["preset_applications"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPresetApplicationList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/preset_applications/{id}/":{"get":{"operationId":"preset_applications_retrieve","description":"The history of preset plans and applications, with ``revert`` for a live application.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this preset application.","required":true}],"tags":["preset_applications"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresetApplication"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/preset_applications/{id}/revert/":{"post":{"operationId":"preset_applications_revert_create","description":"The history of preset plans and applications, with ``revert`` for a live application.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this preset application.","required":true}],"tags":["preset_applications"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PresetApplication"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/prioritization_engines/":{"get":{"operationId":"prioritization_engines_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["prioritization_engines"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPrioritizationEngineList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"prioritization_engines_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["prioritization_engines"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrioritizationEngineRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PrioritizationEngineRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PrioritizationEngineRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrioritizationEngine"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/prioritization_engines/{id}/":{"get":{"operationId":"prioritization_engines_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Prioritization Engine.","required":true},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["prioritization_engines"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrioritizationEngine"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"prioritization_engines_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Prioritization Engine.","required":true}],"tags":["prioritization_engines"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrioritizationEngineRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PrioritizationEngineRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PrioritizationEngineRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrioritizationEngine"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"prioritization_engines_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Prioritization Engine.","required":true}],"tags":["prioritization_engines"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPrioritizationEngineRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPrioritizationEngineRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPrioritizationEngineRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrioritizationEngine"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"prioritization_engines_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Prioritization Engine.","required":true}],"tags":["prioritization_engines"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/priority_insights/active_age_by_risk_category/":{"get":{"operationId":"priority_insights_active_age_by_risk_category_retrieve","description":"Adds self.cached_metric(...) to a metrics viewset.\n\nUsage inside an @action:\n\n    data = self.cached_metric(\n        request,\n        \"products_by_risk_category\",\n        lambda: list(MetricsHelpers.get_products_by_risk_category(findings)),\n    )\n    return Response({\"products_by_risk_category\": data})\n\nThe compute callable MUST return a materialized, JSON-serializable structure\n(e.g. list(queryset), not a lazy queryset) so it can be stored in Redis.","tags":["priority_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/priority_insights/average_risk_over_time/":{"get":{"operationId":"priority_insights_average_risk_over_time_retrieve","description":"Adds self.cached_metric(...) to a metrics viewset.\n\nUsage inside an @action:\n\n    data = self.cached_metric(\n        request,\n        \"products_by_risk_category\",\n        lambda: list(MetricsHelpers.get_products_by_risk_category(findings)),\n    )\n    return Response({\"products_by_risk_category\": data})\n\nThe compute callable MUST return a materialized, JSON-serializable structure\n(e.g. list(queryset), not a lazy queryset) so it can be stored in Redis.","tags":["priority_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/priority_insights/components_by_risk_category/":{"get":{"operationId":"priority_insights_components_by_risk_category_retrieve","description":"Adds self.cached_metric(...) to a metrics viewset.\n\nUsage inside an @action:\n\n    data = self.cached_metric(\n        request,\n        \"products_by_risk_category\",\n        lambda: list(MetricsHelpers.get_products_by_risk_category(findings)),\n    )\n    return Response({\"products_by_risk_category\": data})\n\nThe compute callable MUST return a materialized, JSON-serializable structure\n(e.g. list(queryset), not a lazy queryset) so it can be stored in Redis.","tags":["priority_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/priority_insights/endpoint_hosts_by_risk_category/":{"get":{"operationId":"priority_insights_endpoint_hosts_by_risk_category_retrieve","description":"Adds self.cached_metric(...) to a metrics viewset.\n\nUsage inside an @action:\n\n    data = self.cached_metric(\n        request,\n        \"products_by_risk_category\",\n        lambda: list(MetricsHelpers.get_products_by_risk_category(findings)),\n    )\n    return Response({\"products_by_risk_category\": data})\n\nThe compute callable MUST return a materialized, JSON-serializable structure\n(e.g. list(queryset), not a lazy queryset) so it can be stored in Redis.","tags":["priority_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/priority_insights/mitigated_outside_of_sla_by_risk/":{"get":{"operationId":"priority_insights_mitigated_outside_of_sla_by_risk_retrieve","description":"Adds self.cached_metric(...) to a metrics viewset.\n\nUsage inside an @action:\n\n    data = self.cached_metric(\n        request,\n        \"products_by_risk_category\",\n        lambda: list(MetricsHelpers.get_products_by_risk_category(findings)),\n    )\n    return Response({\"products_by_risk_category\": data})\n\nThe compute callable MUST return a materialized, JSON-serializable structure\n(e.g. list(queryset), not a lazy queryset) so it can be stored in Redis.","tags":["priority_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/priority_insights/mitigated_within_sla_by_risk/":{"get":{"operationId":"priority_insights_mitigated_within_sla_by_risk_retrieve","description":"Adds self.cached_metric(...) to a metrics viewset.\n\nUsage inside an @action:\n\n    data = self.cached_metric(\n        request,\n        \"products_by_risk_category\",\n        lambda: list(MetricsHelpers.get_products_by_risk_category(findings)),\n    )\n    return Response({\"products_by_risk_category\": data})\n\nThe compute callable MUST return a materialized, JSON-serializable structure\n(e.g. list(queryset), not a lazy queryset) so it can be stored in Redis.","tags":["priority_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/priority_insights/priority_distribution/":{"get":{"operationId":"priority_insights_priority_distribution_retrieve","description":"Adds self.cached_metric(...) to a metrics viewset.\n\nUsage inside an @action:\n\n    data = self.cached_metric(\n        request,\n        \"products_by_risk_category\",\n        lambda: list(MetricsHelpers.get_products_by_risk_category(findings)),\n    )\n    return Response({\"products_by_risk_category\": data})\n\nThe compute callable MUST return a materialized, JSON-serializable structure\n(e.g. list(queryset), not a lazy queryset) so it can be stored in Redis.","tags":["priority_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/priority_insights/products_by_risk_category/":{"get":{"operationId":"priority_insights_products_by_risk_category_retrieve","description":"Adds self.cached_metric(...) to a metrics viewset.\n\nUsage inside an @action:\n\n    data = self.cached_metric(\n        request,\n        \"products_by_risk_category\",\n        lambda: list(MetricsHelpers.get_products_by_risk_category(findings)),\n    )\n    return Response({\"products_by_risk_category\": data})\n\nThe compute callable MUST return a materialized, JSON-serializable structure\n(e.g. list(queryset), not a lazy queryset) so it can be stored in Redis.","tags":["priority_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/priority_insights/risk_accepted_over_time/":{"get":{"operationId":"priority_insights_risk_accepted_over_time_retrieve","description":"Adds self.cached_metric(...) to a metrics viewset.\n\nUsage inside an @action:\n\n    data = self.cached_metric(\n        request,\n        \"products_by_risk_category\",\n        lambda: list(MetricsHelpers.get_products_by_risk_category(findings)),\n    )\n    return Response({\"products_by_risk_category\": data})\n\nThe compute callable MUST return a materialized, JSON-serializable structure\n(e.g. list(queryset), not a lazy queryset) so it can be stored in Redis.","tags":["priority_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/priority_insights/summary/":{"get":{"operationId":"priority_insights_summary_retrieve","description":"basic metrics counts","tags":["priority_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/priority_insights/total_by_risk_category/":{"get":{"operationId":"priority_insights_total_by_risk_category_retrieve","description":"Adds self.cached_metric(...) to a metrics viewset.\n\nUsage inside an @action:\n\n    data = self.cached_metric(\n        request,\n        \"products_by_risk_category\",\n        lambda: list(MetricsHelpers.get_products_by_risk_category(findings)),\n    )\n    return Response({\"products_by_risk_category\": data})\n\nThe compute callable MUST return a materialized, JSON-serializable structure\n(e.g. list(queryset), not a lazy queryset) so it can be stored in Redis.","tags":["priority_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_api_scan_configurations/":{"get":{"operationId":"product_api_scan_configurations_list","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","tool_configuration"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"service_key_1","schema":{"type":"string"}},{"in":"query","name":"service_key_2","schema":{"type":"string"}},{"in":"query","name":"service_key_3","schema":{"type":"string"}},{"in":"query","name":"tool_configuration","schema":{"type":"integer"}}],"tags":["product_api_scan_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProductAPIScanConfigurationList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"product_api_scan_configurations_create","tags":["product_api_scan_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductAPIScanConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductAPIScanConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductAPIScanConfigurationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductAPIScanConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_api_scan_configurations/{id}/":{"get":{"operationId":"product_api_scan_configurations_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ap i_ scan_ configuration.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","tool_configuration"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["product_api_scan_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductAPIScanConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"product_api_scan_configurations_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ap i_ scan_ configuration.","required":true}],"tags":["product_api_scan_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductAPIScanConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductAPIScanConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductAPIScanConfigurationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductAPIScanConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"product_api_scan_configurations_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ap i_ scan_ configuration.","required":true}],"tags":["product_api_scan_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProductAPIScanConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProductAPIScanConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProductAPIScanConfigurationRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductAPIScanConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"product_api_scan_configurations_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ap i_ scan_ configuration.","required":true}],"tags":["product_api_scan_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_api_scan_configurations/{id}/delete_preview/":{"get":{"operationId":"product_api_scan_configurations_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ap i_ scan_ configuration.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_api_scan_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_groups/":{"get":{"operationId":"product_groups_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"query","name":"asset_id","schema":{"type":"integer"}},{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product_id","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["product_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedProductGroupList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"product_groups_create","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","tags":["product_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_groups/{id}/":{"get":{"operationId":"product_groups_retrieve","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["product_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"product_groups_update","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true}],"tags":["product_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"product_groups_destroy","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true}],"tags":["product_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_groups/{id}/delete_preview/":{"get":{"operationId":"product_groups_delete_preview_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_groups/{id}/history/":{"get":{"operationId":"product_groups_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"asset_id","schema":{"type":"integer"}},{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product_id","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["product_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_groups/{id}/history/legacy/":{"get":{"operationId":"product_groups_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"asset_id","schema":{"type":"integer"}},{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product_id","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["product_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_groups/{id}/history/legacy/count/":{"get":{"operationId":"product_groups_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ group.","required":true}],"tags":["product_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_lifecycles/":{"get":{"operationId":"product_lifecycles_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_lifecycles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProductLifecycleList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"product_lifecycles_create","tags":["product_lifecycles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductLifecycleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductLifecycleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductLifecycleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductLifecycle"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_lifecycles/{id}/":{"get":{"operationId":"product_lifecycles_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ lifecycle.","required":true}],"tags":["product_lifecycles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductLifecycle"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"product_lifecycles_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ lifecycle.","required":true}],"tags":["product_lifecycles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductLifecycleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductLifecycleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductLifecycleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductLifecycle"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"product_lifecycles_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ lifecycle.","required":true}],"tags":["product_lifecycles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProductLifecycleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProductLifecycleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProductLifecycleRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductLifecycle"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"product_lifecycles_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ lifecycle.","required":true}],"tags":["product_lifecycles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_lifecycles/{id}/delete_preview/":{"get":{"operationId":"product_lifecycles_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ lifecycle.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_lifecycles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_members/":{"get":{"operationId":"product_members_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"query","name":"asset_id","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product_id","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}},{"in":"query","name":"user","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"user_id","schema":{"type":"integer"}}],"tags":["product_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedProductMemberList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"product_members_create","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","tags":["product_members"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_members/{id}/":{"get":{"operationId":"product_members_retrieve","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ member.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["product_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"product_members_update","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ member.","required":true}],"tags":["product_members"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductMemberRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"product_members_destroy","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ member.","required":true}],"tags":["product_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_members/{id}/delete_preview/":{"get":{"operationId":"product_members_delete_preview_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ member.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_origins/":{"get":{"operationId":"product_origins_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_origins"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProductOriginList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"product_origins_create","tags":["product_origins"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductOriginRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductOriginRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductOriginRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductOrigin"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_origins/{id}/":{"get":{"operationId":"product_origins_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ origin.","required":true}],"tags":["product_origins"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductOrigin"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"product_origins_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ origin.","required":true}],"tags":["product_origins"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductOriginRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductOriginRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductOriginRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductOrigin"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"product_origins_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ origin.","required":true}],"tags":["product_origins"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProductOriginRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProductOriginRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProductOriginRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductOrigin"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"product_origins_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ origin.","required":true}],"tags":["product_origins"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_origins/{id}/delete_preview/":{"get":{"operationId":"product_origins_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ origin.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_origins"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_platforms/":{"get":{"operationId":"product_platforms_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_platforms"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProductPlatformList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"product_platforms_create","tags":["product_platforms"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPlatformRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductPlatformRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductPlatformRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPlatform"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_platforms/{id}/":{"get":{"operationId":"product_platforms_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ platform.","required":true}],"tags":["product_platforms"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPlatform"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"product_platforms_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ platform.","required":true}],"tags":["product_platforms"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPlatformRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductPlatformRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductPlatformRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPlatform"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"product_platforms_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ platform.","required":true}],"tags":["product_platforms"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProductPlatformRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProductPlatformRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProductPlatformRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPlatform"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"product_platforms_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ platform.","required":true}],"tags":["product_platforms"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_platforms/{id}/delete_preview/":{"get":{"operationId":"product_platforms_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ platform.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_platforms"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_type_groups/":{"get":{"operationId":"product_type_groups_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization_id","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product_type_id","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["product_type_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedProductTypeGroupList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"product_type_groups_create","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","tags":["product_type_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_type_groups/{id}/":{"get":{"operationId":"product_type_groups_retrieve","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["product_type_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"product_type_groups_update","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true}],"tags":["product_type_groups"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"product_type_groups_destroy","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true}],"tags":["product_type_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_type_groups/{id}/delete_preview/":{"get":{"operationId":"product_type_groups_delete_preview_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_type_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_type_groups/{id}/history/":{"get":{"operationId":"product_type_groups_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization_id","schema":{"type":"integer"}},{"in":"query","name":"product_type_id","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["product_type_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_type_groups/{id}/history/legacy/":{"get":{"operationId":"product_type_groups_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"group","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_id","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization_id","schema":{"type":"integer"}},{"in":"query","name":"product_type_id","schema":{"type":"integer"}},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["product_type_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_type_groups/{id}/history/legacy/count/":{"get":{"operationId":"product_type_groups_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ group.","required":true}],"tags":["product_type_groups"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_type_members/":{"get":{"operationId":"product_type_members_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization_id","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product_type","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product_type_id","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"role","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"}},{"in":"query","name":"user","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"user_id","schema":{"type":"integer"}}],"tags":["product_type_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedProductTypeMemberList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"product_type_members_create","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","tags":["product_type_members"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_type_members/{id}/":{"get":{"operationId":"product_type_members_retrieve","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ member.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product_type","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["product_type_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"product_type_members_update","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ member.","required":true}],"tags":["product_type_members"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMemberRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeMember"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"product_type_members_destroy","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ member.","required":true}],"tags":["product_type_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_type_members/{id}/delete_preview/":{"get":{"operationId":"product_type_members_delete_preview_list","description":"Mix in ahead of the DRF viewset so both overrides run before the stock ones.\n\nSubclasses set the row's scope field (``product``, ``product_type`` or ``group``), its principal field\n(``user`` or ``group``) and the ``Permissions`` member that grants Owner on that scope.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type_ member.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_type_members"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_types/":{"get":{"operationId":"product_types_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"critical_product","schema":{"type":"boolean"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"key_product","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["authorized_users"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}}],"tags":["product_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedProductTypeList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"product_types_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["product_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_types/{id}/":{"get":{"operationId":"product_types_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["authorized_users"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["product_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"product_types_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true}],"tags":["product_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedProductTypeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"product_types_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true}],"tags":["product_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedProductTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedProductTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedProductTypeRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedProductType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"product_types_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true}],"tags":["product_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_types/{id}/delete_preview/":{"get":{"operationId":"product_types_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["product_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_types/{id}/generate_report/":{"post":{"operationId":"product_types_generate_report_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true}],"tags":["product_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_types/{id}/history/":{"get":{"operationId":"product_types_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"critical_product","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"key_product","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}}],"tags":["product_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_types/{id}/history/legacy/":{"get":{"operationId":"product_types_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"critical_product","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"key_product","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}}],"tags":["product_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/product_types/{id}/history/legacy/count/":{"get":{"operationId":"product_types_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product_ type.","required":true}],"tags":["product_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/":{"get":{"operationId":"products_list","description":"Product endpoint — mirrors EnhancedAssetViewSet with product-specific naming.\n\nInherits get_queryset, prefetches, and all shared behavior from\nEnhancedAssetViewSet; only the class attributes that differ between the\nasset (renamed) and product (legacy) API contracts are overridden here.","parameters":[{"in":"query","name":"business_criticality","schema":{"type":"array","items":{"type":"string","x-spec-enum-id":"ef412461eb271471","nullable":true,"enum":["high","low","medium","none","very high","very low"]}},"description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","explode":true,"style":"form"},{"in":"query","name":"created","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was initially created, and saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"external_audience","schema":{"type":"boolean"}},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"internet_accessible","schema":{"type":"boolean"}},{"in":"query","name":"lifecycle","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-business_criticality","-created","-external_audience","-id","-internet_accessible","-lifecycle","-name","-origin","-platform","-prod_numeric_grade","-prod_type","-prod_type__name","-product_manager","-product_manager__first_name","-product_manager__last_name","-revenue","-team_manager","-team_manager__first_name","-team_manager__last_name","-technical_contact","-technical_contact__first_name","-technical_contact__last_name","-tid","-updated","-user_records","business_criticality","created","external_audience","id","internet_accessible","lifecycle","name","origin","platform","prod_numeric_grade","prod_type","prod_type__name","product_manager","product_manager__first_name","product_manager__last_name","revenue","team_manager","team_manager__first_name","team_manager__last_name","technical_contact","technical_contact__first_name","technical_contact__last_name","tid","updated","user_records"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `tid` - Tid\n* `-tid` - Tid (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `prod_numeric_grade` - Prod numeric grade\n* `-prod_numeric_grade` - Prod numeric grade (descending)\n* `business_criticality` - Business criticality\n* `-business_criticality` - Business criticality (descending)\n* `platform` - Platform\n* `-platform` - Platform (descending)\n* `lifecycle` - Lifecycle\n* `-lifecycle` - Lifecycle (descending)\n* `origin` - Origin\n* `-origin` - Origin (descending)\n* `revenue` - Revenue\n* `-revenue` - Revenue (descending)\n* `external_audience` - External audience\n* `-external_audience` - External audience (descending)\n* `internet_accessible` - Internet accessible\n* `-internet_accessible` - Internet accessible (descending)\n* `product_manager` - Product manager\n* `-product_manager` - Product manager (descending)\n* `product_manager__first_name` - Product manager  first name\n* `-product_manager__first_name` - Product manager  first name (descending)\n* `product_manager__last_name` - Product manager  last name\n* `-product_manager__last_name` - Product manager  last name (descending)\n* `technical_contact` - Technical contact\n* `-technical_contact` - Technical contact (descending)\n* `technical_contact__first_name` - Technical contact  first name\n* `-technical_contact__first_name` - Technical contact  first name (descending)\n* `technical_contact__last_name` - Technical contact  last name\n* `-technical_contact__last_name` - Technical contact  last name (descending)\n* `team_manager` - Team manager\n* `-team_manager` - Team manager (descending)\n* `team_manager__first_name` - Team manager  first name\n* `-team_manager__first_name` - Team manager  first name (descending)\n* `team_manager__last_name` - Team manager  last name\n* `-team_manager__last_name` - Team manager  last name (descending)\n* `prod_type` - Prod type\n* `-prod_type` - Prod type (descending)\n* `prod_type__name` - Prod type  name\n* `-prod_type__name` - Prod type  name (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `user_records` - User records\n* `-user_records` - User records (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"origin","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"outside_of_sla","schema":{"type":"number"}},{"in":"query","name":"pci_component_kind","schema":{"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","enum":["bespoke_or_custom_software","payment_page","system_component","third_party_software","unspecified"]},"description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},{"in":"query","name":"pci_scope","schema":{"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","enum":["cde","connected_or_security_impacting","not_assessed","out_of_scope"]},"description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},{"in":"query","name":"platform","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["authorized_users","prod_type","product_manager","regulations","sla_configuration","team_manager","technical_contact","locations"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"prod_numeric_grade","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"prod_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"regulations","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"revenue","schema":{"type":"number"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"team_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"technical_contact","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"tid","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was most recently saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"user_records","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"}],"tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProductsList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"products_create","description":"Product endpoint — mirrors EnhancedAssetViewSet with product-specific naming.\n\nInherits get_queryset, prefetches, and all shared behavior from\nEnhancedAssetViewSet; only the class attributes that differ between the\nasset (renamed) and product (legacy) API contracts are overridden here.","tags":["products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Products"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/{id}/":{"get":{"operationId":"products_retrieve","description":"Product endpoint — mirrors EnhancedAssetViewSet with product-specific naming.\n\nInherits get_queryset, prefetches, and all shared behavior from\nEnhancedAssetViewSet; only the class attributes that differ between the\nasset (renamed) and product (legacy) API contracts are overridden here.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["authorized_users","prod_type","product_manager","regulations","sla_configuration","team_manager","technical_contact","locations"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Products"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"products_update","description":"Product endpoint — mirrors EnhancedAssetViewSet with product-specific naming.\n\nInherits get_queryset, prefetches, and all shared behavior from\nEnhancedAssetViewSet; only the class attributes that differ between the\nasset (renamed) and product (legacy) API contracts are overridden here.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProductsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProductsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Products"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"products_partial_update","description":"Product endpoint — mirrors EnhancedAssetViewSet with product-specific naming.\n\nInherits get_queryset, prefetches, and all shared behavior from\nEnhancedAssetViewSet; only the class attributes that differ between the\nasset (renamed) and product (legacy) API contracts are overridden here.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProductsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProductsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProductsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Products"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"products_destroy","description":"Product endpoint — mirrors EnhancedAssetViewSet with product-specific naming.\n\nInherits get_queryset, prefetches, and all shared behavior from\nEnhancedAssetViewSet; only the class attributes that differ between the\nasset (renamed) and product (legacy) API contracts are overridden here.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/{id}/delete_preview/":{"get":{"operationId":"products_delete_preview_list","description":"Product endpoint — mirrors EnhancedAssetViewSet with product-specific naming.\n\nInherits get_queryset, prefetches, and all shared behavior from\nEnhancedAssetViewSet; only the class attributes that differ between the\nasset (renamed) and product (legacy) API contracts are overridden here.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/{id}/finding_diff/{other_id}/":{"get":{"operationId":"products_finding_diff_retrieve","description":"Compares the findings associated with the two objects and returns\nadded, removed, equality, and improvement information.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"in":"path","name":"other_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true}],"tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingDiff"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/{id}/generate_report/":{"post":{"operationId":"products_generate_report_create","description":"Product endpoint — mirrors EnhancedAssetViewSet with product-specific naming.\n\nInherits get_queryset, prefetches, and all shared behavior from\nEnhancedAssetViewSet; only the class attributes that differ between the\nasset (renamed) and product (legacy) API contracts are overridden here.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/{id}/history/":{"get":{"operationId":"products_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"business_criticality","schema":{"type":"array","items":{"type":"string","x-spec-enum-id":"ef412461eb271471","nullable":true,"enum":["high","low","medium","none","very high","very low"]}},"description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","explode":true,"style":"form"},{"in":"query","name":"created","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was initially created, and saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"external_audience","schema":{"type":"boolean"}},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"internet_accessible","schema":{"type":"boolean"}},{"in":"query","name":"lifecycle","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-business_criticality","-created","-external_audience","-id","-internet_accessible","-lifecycle","-name","-origin","-platform","-prod_numeric_grade","-prod_type","-prod_type__name","-product_manager","-product_manager__first_name","-product_manager__last_name","-revenue","-team_manager","-team_manager__first_name","-team_manager__last_name","-technical_contact","-technical_contact__first_name","-technical_contact__last_name","-tid","-updated","-user_records","business_criticality","created","external_audience","id","internet_accessible","lifecycle","name","origin","platform","prod_numeric_grade","prod_type","prod_type__name","product_manager","product_manager__first_name","product_manager__last_name","revenue","team_manager","team_manager__first_name","team_manager__last_name","technical_contact","technical_contact__first_name","technical_contact__last_name","tid","updated","user_records"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `tid` - Tid\n* `-tid` - Tid (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `prod_numeric_grade` - Prod numeric grade\n* `-prod_numeric_grade` - Prod numeric grade (descending)\n* `business_criticality` - Business criticality\n* `-business_criticality` - Business criticality (descending)\n* `platform` - Platform\n* `-platform` - Platform (descending)\n* `lifecycle` - Lifecycle\n* `-lifecycle` - Lifecycle (descending)\n* `origin` - Origin\n* `-origin` - Origin (descending)\n* `revenue` - Revenue\n* `-revenue` - Revenue (descending)\n* `external_audience` - External audience\n* `-external_audience` - External audience (descending)\n* `internet_accessible` - Internet accessible\n* `-internet_accessible` - Internet accessible (descending)\n* `product_manager` - Product manager\n* `-product_manager` - Product manager (descending)\n* `product_manager__first_name` - Product manager  first name\n* `-product_manager__first_name` - Product manager  first name (descending)\n* `product_manager__last_name` - Product manager  last name\n* `-product_manager__last_name` - Product manager  last name (descending)\n* `technical_contact` - Technical contact\n* `-technical_contact` - Technical contact (descending)\n* `technical_contact__first_name` - Technical contact  first name\n* `-technical_contact__first_name` - Technical contact  first name (descending)\n* `technical_contact__last_name` - Technical contact  last name\n* `-technical_contact__last_name` - Technical contact  last name (descending)\n* `team_manager` - Team manager\n* `-team_manager` - Team manager (descending)\n* `team_manager__first_name` - Team manager  first name\n* `-team_manager__first_name` - Team manager  first name (descending)\n* `team_manager__last_name` - Team manager  last name\n* `-team_manager__last_name` - Team manager  last name (descending)\n* `prod_type` - Prod type\n* `-prod_type` - Prod type (descending)\n* `prod_type__name` - Prod type  name\n* `-prod_type__name` - Prod type  name (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `user_records` - User records\n* `-user_records` - User records (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"origin","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"outside_of_sla","schema":{"type":"number"}},{"in":"query","name":"pci_component_kind","schema":{"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","enum":["bespoke_or_custom_software","payment_page","system_component","third_party_software","unspecified"]},"description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},{"in":"query","name":"pci_scope","schema":{"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","enum":["cde","connected_or_security_impacting","not_assessed","out_of_scope"]},"description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},{"in":"query","name":"platform","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"prod_numeric_grade","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"prod_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"regulations","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"revenue","schema":{"type":"number"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"team_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"technical_contact","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"tid","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was most recently saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"user_records","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"}],"tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/{id}/history/legacy/":{"get":{"operationId":"products_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"business_criticality","schema":{"type":"array","items":{"type":"string","x-spec-enum-id":"ef412461eb271471","nullable":true,"enum":["high","low","medium","none","very high","very low"]}},"description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","explode":true,"style":"form"},{"in":"query","name":"created","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was initially created, and saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"external_audience","schema":{"type":"boolean"}},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"internet_accessible","schema":{"type":"boolean"}},{"in":"query","name":"lifecycle","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-business_criticality","-created","-external_audience","-id","-internet_accessible","-lifecycle","-name","-origin","-platform","-prod_numeric_grade","-prod_type","-prod_type__name","-product_manager","-product_manager__first_name","-product_manager__last_name","-revenue","-team_manager","-team_manager__first_name","-team_manager__last_name","-technical_contact","-technical_contact__first_name","-technical_contact__last_name","-tid","-updated","-user_records","business_criticality","created","external_audience","id","internet_accessible","lifecycle","name","origin","platform","prod_numeric_grade","prod_type","prod_type__name","product_manager","product_manager__first_name","product_manager__last_name","revenue","team_manager","team_manager__first_name","team_manager__last_name","technical_contact","technical_contact__first_name","technical_contact__last_name","tid","updated","user_records"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `tid` - Tid\n* `-tid` - Tid (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `prod_numeric_grade` - Prod numeric grade\n* `-prod_numeric_grade` - Prod numeric grade (descending)\n* `business_criticality` - Business criticality\n* `-business_criticality` - Business criticality (descending)\n* `platform` - Platform\n* `-platform` - Platform (descending)\n* `lifecycle` - Lifecycle\n* `-lifecycle` - Lifecycle (descending)\n* `origin` - Origin\n* `-origin` - Origin (descending)\n* `revenue` - Revenue\n* `-revenue` - Revenue (descending)\n* `external_audience` - External audience\n* `-external_audience` - External audience (descending)\n* `internet_accessible` - Internet accessible\n* `-internet_accessible` - Internet accessible (descending)\n* `product_manager` - Product manager\n* `-product_manager` - Product manager (descending)\n* `product_manager__first_name` - Product manager  first name\n* `-product_manager__first_name` - Product manager  first name (descending)\n* `product_manager__last_name` - Product manager  last name\n* `-product_manager__last_name` - Product manager  last name (descending)\n* `technical_contact` - Technical contact\n* `-technical_contact` - Technical contact (descending)\n* `technical_contact__first_name` - Technical contact  first name\n* `-technical_contact__first_name` - Technical contact  first name (descending)\n* `technical_contact__last_name` - Technical contact  last name\n* `-technical_contact__last_name` - Technical contact  last name (descending)\n* `team_manager` - Team manager\n* `-team_manager` - Team manager (descending)\n* `team_manager__first_name` - Team manager  first name\n* `-team_manager__first_name` - Team manager  first name (descending)\n* `team_manager__last_name` - Team manager  last name\n* `-team_manager__last_name` - Team manager  last name (descending)\n* `prod_type` - Prod type\n* `-prod_type` - Prod type (descending)\n* `prod_type__name` - Prod type  name\n* `-prod_type__name` - Prod type  name (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `user_records` - User records\n* `-user_records` - User records (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"origin","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"outside_of_sla","schema":{"type":"number"}},{"in":"query","name":"pci_component_kind","schema":{"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","enum":["bespoke_or_custom_software","payment_page","system_component","third_party_software","unspecified"]},"description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},{"in":"query","name":"pci_scope","schema":{"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","enum":["cde","connected_or_security_impacting","not_assessed","out_of_scope"]},"description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},{"in":"query","name":"platform","schema":{"type":"array","items":{"type":"string"}},"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","explode":true,"style":"form"},{"in":"query","name":"prod_numeric_grade","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"prod_type","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"regulations","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"revenue","schema":{"type":"number"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"team_manager","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"technical_contact","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"tid","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time","nullable":true,"enum":[1,2,3,4,5,6,7,null]},"description":"Time that the object was most recently saved to the database\n\n* `None` - Any date\n* `1` - Today\n* `2` - Past 7 days\n* `3` - Past 30 days\n* `4` - Past 90 days\n* `5` - Current month\n* `6` - Current year\n* `7` - Past year"},{"in":"query","name":"user_records","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"}],"tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/{id}/history/legacy/count/":{"get":{"operationId":"products_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/{id}/priority_drivers/":{"get":{"operationId":"products_priority_drivers_retrieve","description":"What drives this asset's finding priority and SLA: the five priority fields with their set or unset state and the prioritization engine's weight for each (revenue and user records also carry the asset's share of its organization's total), the prioritization engine, and the SLA configuration with where it comes from (`default`, `criticality_mapping` or `asset`).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriorityDrivers"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/{id}/remove_parent/":{"post":{"operationId":"products_remove_parent_create","description":"Detach this asset from its current parent and decide what happens to the asset's own children in the same transaction. `orphan_child_children: false` closes the gap (the children move under the asset's former parent); `true` scatters them (each child becomes a root). To detach while keeping the subtree intact, `PATCH {\"parent\": null}` the asset instead. Requires the global Asset_Hierarchy_Edit permission plus Product_Edit on both the asset and its parent, and the `asset_hierarchy` feature flag. 400 when the asset has no parent or the resulting graph would break a hierarchy constraint.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true}],"tags":["products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveParentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RemoveParentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RemoveParentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/bulk_update/":{"post":{"operationId":"products_bulk_update_create","description":"Apply the same change to many assets in one request: organization (`prod_type`), parent (`null` detaches), asset type, business criticality, contacts (`technical_contact`, `team_manager`, `product_manager`), SLA configuration, prioritization engine, and tags (added, never replaced). At most 500 assets per request. All-or-nothing: if any asset is refused, nothing is written and the 400 lists every refused asset under `errors`. Permissions match a single-asset PATCH: Product_Edit on each asset and on the new parent, Product_Type_Add_Product on the destination organization. Moving an asset to another organization moves its descendants with it unless `move_children` is false (the children then stay behind and become roots), and removes a parent link left crossing organizations. Setting `parent` requires the asset hierarchy. `dry_run: true` writes nothing and returns the change plan diff of the request instead: every field change with its value before and after, the descendants that move along, the parent links a move removes, the organizations whose priority is recalculated, and every refused asset (the same shape as `diff` on `/api/v2/hierarchy/plans/`).","tags":["products"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateAssetRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BulkUpdateAssetRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BulkUpdateAssetRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateResponse"}}},"description":"The counts of an applied update, or the diff of a dry run (dry_run: true)."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkUpdateRejected"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/needs_attention/":{"get":{"operationId":"products_needs_attention_list","description":"Assets that still need attention after onboarding, with the reasons: `connector_default_org` (the asset sits in the organization a connector created as its default, and that connector mapped it) and `missing_priority_fields` (any of business_criticality, user_records, revenue, external_audience, internet_accessible is unset; `missing_fields` names which). Filter by `reason`, `missing_field`, `organization`, `connector` (comma-separated). Only assets the caller may view are listed.","parameters":[{"in":"query","name":"connector","schema":{"type":"string"},"description":"Connector configuration ids, comma-separated."},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"missing_field","schema":{"type":"string"},"description":"Priority fields, comma-separated (any of them missing)."},{"in":"query","name":"o","schema":{"type":"string"},"description":"Ordering: name, organization or id (prefix - for descending)."},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"organization","schema":{"type":"string"},"description":"Organization ids, comma-separated."},{"in":"query","name":"reason","schema":{"type":"string"},"description":"Reasons, comma-separated: connector_default_org, missing_priority_fields."},{"in":"query","name":"search","schema":{"type":"string"},"description":"Asset name contains."}],"tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedNeedsAttentionAssetList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/needs_attention/summary/":{"get":{"operationId":"products_needs_attention_summary_retrieve","description":"Counts behind the assets needing attention list: `total`, `by_reason`, `by_field` (assets missing each priority field), `by_organization` (largest first, at most 100) and `by_connector`. Optionally scoped by `organization` and `connector`.","parameters":[{"in":"query","name":"connector","schema":{"type":"string"},"description":"Connector configuration ids, comma-separated."},{"in":"query","name":"organization","schema":{"type":"string"},"description":"Organization ids, comma-separated."}],"tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NeedsAttentionSummary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/products/onboarding_status/":{"get":{"operationId":"products_onboarding_status_retrieve","description":"Whether onboarding is complete: `onboarding_complete` is true when none of the assets the caller may view needs attention (no asset left in a connector's default organization, and every priority field set). Also returns the counts per reason.","tags":["products"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingStatus"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/program_insights/cumulative_cost_savings/":{"get":{"operationId":"program_insights_cumulative_cost_savings_retrieve","description":"the cumulative cost saved monthly (assuming noise reduction saved $5 per\nfinding)","tags":["program_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/program_insights/efficiency_increase/":{"get":{"operationId":"program_insights_efficiency_increase_retrieve","description":"the efficiency increased, calculated by the total sum of findings that are\nduplicates, false positives, or that were closed, reactivated, or left untouched\nby an import/reimport divided by the total number of findings","tags":["program_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/program_insights/findings_fixed/":{"get":{"operationId":"program_insights_findings_fixed_retrieve","description":"the total number of findings fixed (mitigated)","tags":["program_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/program_insights/noise_reduction_by_category/":{"get":{"operationId":"program_insights_noise_reduction_by_category_retrieve","description":"total findings grouped by noise reduction category, i.e. findings that were\nclosed, reactivated, or left untouched by an import/reimport or findings that\nare duplicates, false positives","tags":["program_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/program_insights/noise_reduction_categories_over_time/":{"get":{"operationId":"program_insights_noise_reduction_categories_over_time_retrieve","description":"findings grouped monthly by noise reduction category, i.e. findings that were\nclosed, reactivated, or left untouched by an import/reimport or findings that\nhave a duplicate or false positive status","tags":["program_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/program_insights/products_tested/":{"get":{"operationId":"program_insights_products_tested_retrieve","description":"the total number of products tested (findings were created)","tags":["program_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/program_insights/tests_performed/":{"get":{"operationId":"program_insights_tests_performed_retrieve","description":"the total number of tests performed","tags":["program_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories/":{"get":{"operationId":"psirt_advisories_list","description":"The advisory queue. Read-only plus the analyst's overlay actions.","parameters":[{"in":"query","name":"created_at_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at_during","schema":{"type":"string"}},{"in":"query","name":"created_at_on","schema":{"type":"string"}},{"in":"query","name":"created_at_past_days","schema":{"type":"number"}},{"in":"query","name":"cve","schema":{"type":"string"}},{"in":"query","name":"enrichment_status","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"enrichment_status_not","schema":{"type":"string"}},{"in":"query","name":"external_id_contains","schema":{"type":"string"}},{"in":"query","name":"external_id_ends_with","schema":{"type":"string"}},{"in":"query","name":"external_id_exact","schema":{"type":"string"}},{"in":"query","name":"external_id_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"external_id_not_contains","schema":{"type":"string"}},{"in":"query","name":"external_id_not_exact","schema":{"type":"string"}},{"in":"query","name":"external_id_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"external_id_not_regex","schema":{"type":"string"}},{"in":"query","name":"external_id_regex","schema":{"type":"string"}},{"in":"query","name":"external_id_starts_with","schema":{"type":"string"}},{"in":"query","name":"feed_source","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"feed_source_not","schema":{"type":"string"}},{"in":"query","name":"has_matches","schema":{"type":"boolean"}},{"in":"query","name":"has_verified_matches","schema":{"type":"boolean"}},{"in":"query","name":"is_exploited","schema":{"type":"boolean"}},{"in":"query","name":"is_reviewed","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"match_status","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"match_status_not","schema":{"type":"string"}},{"in":"query","name":"min_amplitude","schema":{"type":"number"}},{"in":"query","name":"min_cvss","schema":{"type":"number","format":"float"}},{"in":"query","name":"min_epss","schema":{"type":"number","format":"float"}},{"in":"query","name":"min_prefilter_score","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-amplitude","-created_at","-cvss_score","-epss_score","-external_id","-feed_source_name","-match_count","-prefilter_score","-published_at","-severity","-title","-verified_match_count","amplitude","created_at","cvss_score","epss_score","external_id","feed_source_name","match_count","prefilter_score","published_at","severity","title","verified_match_count"]}},"description":"Ordering\n\n* `published_at` - Published at\n* `-published_at` - Published at (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `external_id` - External id\n* `-external_id` - External id (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `severity` - Severity\n* `-severity` - Severity (descending)\n* `cvss_score` - Cvss score\n* `-cvss_score` - Cvss score (descending)\n* `epss_score` - Epss score\n* `-epss_score` - Epss score (descending)\n* `match_count` - Match count\n* `-match_count` - Match count (descending)\n* `amplitude` - Amplitude\n* `-amplitude` - Amplitude (descending)\n* `verified_match_count` - Verified match count\n* `-verified_match_count` - Verified match count (descending)\n* `prefilter_score` - Prefilter score\n* `-prefilter_score` - Prefilter score (descending)\n* `feed_source_name` - Feed source name\n* `-feed_source_name` - Feed source name (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefilter_favorite","schema":{"type":"boolean"}},{"in":"query","name":"prefilter_matched","schema":{"type":"boolean"}},{"in":"query","name":"prefilter_tag","schema":{"type":"string"}},{"in":"query","name":"published_at_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"published_at_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"published_at_during","schema":{"type":"string"}},{"in":"query","name":"published_at_on","schema":{"type":"string"}},{"in":"query","name":"published_at_past_days","schema":{"type":"number"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: external_id, title, description"},{"in":"query","name":"severity","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"severity_not","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"status_not","schema":{"type":"string"}},{"in":"query","name":"title_contains","schema":{"type":"string"}},{"in":"query","name":"title_ends_with","schema":{"type":"string"}},{"in":"query","name":"title_exact","schema":{"type":"string"}},{"in":"query","name":"title_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_contains","schema":{"type":"string"}},{"in":"query","name":"title_not_exact","schema":{"type":"string"}},{"in":"query","name":"title_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_regex","schema":{"type":"string"}},{"in":"query","name":"title_regex","schema":{"type":"string"}},{"in":"query","name":"title_starts_with","schema":{"type":"string"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtSourceAdvisoryListList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/":{"get":{"operationId":"psirt_advisories_authored_list","description":"Advisories, their review, and the one route that publishes them.","parameters":[{"in":"query","name":"advisory_id","schema":{"type":"string"}},{"in":"query","name":"audit_state","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"audit_state_not","schema":{"type":"string"}},{"in":"query","name":"author","schema":{"type":"integer"}},{"in":"query","name":"embargoed","schema":{"type":"boolean"}},{"in":"query","name":"is_candidate","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-advisory_id","-created_at","-disclosure_date","-published_at","-scheduled_publish_at","-status","-title","-updated_at","advisory_id","created_at","disclosure_date","published_at","scheduled_publish_at","status","title","updated_at"]}},"description":"Ordering\n\n* `advisory_id` - Advisory id\n* `-advisory_id` - Advisory id (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `disclosure_date` - Disclosure date\n* `-disclosure_date` - Disclosure date (descending)\n* `published_at` - Published at\n* `-published_at` - Published at (descending)\n* `scheduled_publish_at` - Scheduled publish at\n* `-scheduled_publish_at` - Scheduled publish at (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"scheduled","schema":{"type":"boolean"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: advisory_id, title, summary"},{"in":"query","name":"staleness_state","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"staleness_state_not","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"status_not","schema":{"type":"string"}},{"in":"query","name":"title_contains","schema":{"type":"string"}},{"in":"query","name":"title_ends_with","schema":{"type":"string"}},{"in":"query","name":"title_exact","schema":{"type":"string"}},{"in":"query","name":"title_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_contains","schema":{"type":"string"}},{"in":"query","name":"title_not_exact","schema":{"type":"string"}},{"in":"query","name":"title_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_regex","schema":{"type":"string"}},{"in":"query","name":"title_regex","schema":{"type":"string"}},{"in":"query","name":"title_starts_with","schema":{"type":"string"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtAdvisoryList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_advisories_authored_create","description":"Advisories, their review, and the one route that publishes them.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/":{"get":{"operationId":"psirt_advisories_authored_retrieve","description":"Advisories, their review, and the one route that publishes them.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_advisories_authored_update","description":"Advisories, their review, and the one route that publishes them.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_advisories_authored_partial_update","description":"Advisories, their review, and the one route that publishes them.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtAdvisoryRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_advisories_authored_destroy","description":"Advisories, their review, and the one route that publishes them.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/acknowledge-material-change/":{"post":{"operationId":"psirt_advisories_authored_acknowledge_material_change_create","description":"Record that the moved underlying facts were reviewed, and clear staleness.\n\nNot a republish and not a fix — see ``advisories/staleness.py``. Available on\na fresh advisory too, where it is a no-op that re-stamps the same aggregates,\nbecause refusing would make the button's availability depend on a race with\nthe drain.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/assign_reviewer/":{"post":{"operationId":"psirt_advisories_authored_assign_reviewer_create","description":"Advisories, their review, and the one route that publishes them.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignReviewerRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssignReviewerRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssignReviewerRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/cases/":{"post":{"operationId":"psirt_advisories_authored_cases_create","description":"Attach or detach cases — the blast-radius edit, honest after approval.\n\nAllowed at every pre-published status *because* ``case_ids`` is hashed into\nthe content fingerprint: changing the set after approval flips every approval\nstale, exactly like a content edit, and the publish gate then demands a\nre-review. Refused once published — the blast radius of published content\nchanges through a revision, never in place.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModifyCasesRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ModifyCasesRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ModifyCasesRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/csaf/":{"get":{"operationId":"psirt_advisories_authored_csaf_retrieve","description":"Download the machine-readable CSAF 2.0 security-advisory document (FEAT-392).\n\nBuilt and validated on demand against the vendored CSAF + CVSS schemas; an\ninvalid document is refused rather than served.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/delivery_status/":{"get":{"operationId":"psirt_advisories_authored_delivery_status_retrieve","description":"Per-channel delivery state, with skipped and not-implemented kept distinct.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/lock/":{"post":{"operationId":"psirt_advisories_authored_lock_create","description":"Advisories, their review, and the one route that publishes them.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/publish_now/":{"post":{"operationId":"psirt_advisories_authored_publish_now_create","description":"Publish immediately and deliver.\n\nRuns synchronously rather than queueing: this is a person pressing a button on\none advisory and expecting to be told what happened. A refusal comes back as their\nown refusal rather than being folded into a batch summary nobody reads.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/recipient_preview/":{"get":{"operationId":"psirt_advisories_authored_recipient_preview_retrieve","description":"Who this would reach, by name, before anyone presses publish.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/redeliver/":{"post":{"operationId":"psirt_advisories_authored_redeliver_create","description":"Retry every channel on an already-published advisory.\n\nRefused on an unpublished one: re-delivering something that was never published\nwould tell people about an advisory that does not exist yet.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/request_rereview/":{"post":{"operationId":"psirt_advisories_authored_request_rereview_create","description":"Return every decided reviewer to pending, after addressing a rejection.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/revise/":{"post":{"operationId":"psirt_advisories_authored_revise_create","description":"Open a published advisory for revision. Resets the reviewer roster.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/run_preflight/":{"post":{"operationId":"psirt_advisories_authored_run_preflight_create","description":"Run every check and return the results.\n\nThe summary is read from a freshly-fetched advisory. ``get_queryset``\nprefetches ``preflight_results``, so the object ``get_object`` returns carries a\n*cached* relation from before the run — reading it would report \"ready\" because\nthe cache is empty, which is the one answer this endpoint must never get wrong.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/schedule/":{"post":{"operationId":"psirt_advisories_authored_schedule_create","description":"Arm or disarm a scheduled publish.\n\nArming checks the publish gates *now* as well, so an advisory cannot be armed in\na state that will certainly fail — a schedule that was always going to be refused\nis worse than no schedule, because nobody finds out until the window passes.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ScheduleRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ScheduleRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/signoffs/":{"get":{"operationId":"psirt_advisories_authored_signoffs_retrieve","description":"Advisories, their review, and the one route that publishes them.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/snapshots/":{"get":{"operationId":"psirt_advisories_authored_snapshots_list","description":"What was published, per version.","parameters":[{"in":"query","name":"advisory_id","schema":{"type":"string"}},{"in":"query","name":"audit_state","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"audit_state_not","schema":{"type":"string"}},{"in":"query","name":"author","schema":{"type":"integer"}},{"in":"query","name":"embargoed","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true},{"in":"query","name":"is_candidate","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-advisory_id","-created_at","-disclosure_date","-published_at","-scheduled_publish_at","-status","-title","-updated_at","advisory_id","created_at","disclosure_date","published_at","scheduled_publish_at","status","title","updated_at"]}},"description":"Ordering\n\n* `advisory_id` - Advisory id\n* `-advisory_id` - Advisory id (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `disclosure_date` - Disclosure date\n* `-disclosure_date` - Disclosure date (descending)\n* `published_at` - Published at\n* `-published_at` - Published at (descending)\n* `scheduled_publish_at` - Scheduled publish at\n* `-scheduled_publish_at` - Scheduled publish at (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"scheduled","schema":{"type":"boolean"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: advisory_id, title, summary"},{"in":"query","name":"staleness_state","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"staleness_state_not","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"status_not","schema":{"type":"string"}},{"in":"query","name":"title_contains","schema":{"type":"string"}},{"in":"query","name":"title_ends_with","schema":{"type":"string"}},{"in":"query","name":"title_exact","schema":{"type":"string"}},{"in":"query","name":"title_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_contains","schema":{"type":"string"}},{"in":"query","name":"title_not_exact","schema":{"type":"string"}},{"in":"query","name":"title_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_regex","schema":{"type":"string"}},{"in":"query","name":"title_regex","schema":{"type":"string"}},{"in":"query","name":"title_starts_with","schema":{"type":"string"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtAdvisorySnapshotList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/supersede/":{"post":{"operationId":"psirt_advisories_authored_supersede_create","description":"Advisories, their review, and the one route that publishes them.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/transition/":{"post":{"operationId":"psirt_advisories_authored_transition_create","description":"Move the advisory. The only route that changes ``status``.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransitionRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TransitionRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TransitionRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/unlock/":{"post":{"operationId":"psirt_advisories_authored_unlock_create","description":"Release the lock. ``force`` breaks somebody else's, deliberately explicitly.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories-authored/{id}/vex/":{"get":{"operationId":"psirt_advisories_authored_vex_retrieve","description":"Download the CSAF 2.0 VEX document, optionally scoped with ``?product_id=``.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories/{id}/":{"get":{"operationId":"psirt_advisories_retrieve","description":"The advisory queue. Read-only plus the analyst's overlay actions.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt source advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSourceAdvisoryDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories/{id}/exposure/":{"get":{"operationId":"psirt_advisories_exposure_retrieve","description":"\"Am I affected?\", on its own so a panel can refresh without the row.\n\nRecomputed on every call against the live inventory. An SBOM import\nbetween two reads is supposed to change this answer.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt source advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtExposure"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories/{id}/rematch/":{"post":{"operationId":"psirt_advisories_rematch_create","description":"Re-queue this advisory for the matching drain.\n\nQueues rather than runs: the drain owns matching, and a request thread\nthat did the work itself would bypass the lease, the attempt counter and\nthe run ledger. Re-queueing is idempotent — matches upsert.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt source advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSourceAdvisoryList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories/{id}/review/":{"post":{"operationId":"psirt_advisories_review_create","description":"Mark reviewed. Orthogonal to ``status`` — it never overwrites it.\n\nThe engine kept these separate deliberately: \"I have looked at this\" and\n\"where this sits in the pipeline\" are different facts, and folding the\nfirst into the second loses the pipeline state.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt source advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSourceAdvisoryList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories/{id}/revisions/":{"get":{"operationId":"psirt_advisories_revisions_list","description":"Detected material changes upstream, newest first.","parameters":[{"in":"query","name":"created_at_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at_during","schema":{"type":"string"}},{"in":"query","name":"created_at_on","schema":{"type":"string"}},{"in":"query","name":"created_at_past_days","schema":{"type":"number"}},{"in":"query","name":"cve","schema":{"type":"string"}},{"in":"query","name":"enrichment_status","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"enrichment_status_not","schema":{"type":"string"}},{"in":"query","name":"external_id_contains","schema":{"type":"string"}},{"in":"query","name":"external_id_ends_with","schema":{"type":"string"}},{"in":"query","name":"external_id_exact","schema":{"type":"string"}},{"in":"query","name":"external_id_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"external_id_not_contains","schema":{"type":"string"}},{"in":"query","name":"external_id_not_exact","schema":{"type":"string"}},{"in":"query","name":"external_id_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"external_id_not_regex","schema":{"type":"string"}},{"in":"query","name":"external_id_regex","schema":{"type":"string"}},{"in":"query","name":"external_id_starts_with","schema":{"type":"string"}},{"in":"query","name":"feed_source","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"feed_source_not","schema":{"type":"string"}},{"in":"query","name":"has_matches","schema":{"type":"boolean"}},{"in":"query","name":"has_verified_matches","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt source advisory.","required":true},{"in":"query","name":"is_exploited","schema":{"type":"boolean"}},{"in":"query","name":"is_reviewed","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"match_status","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"match_status_not","schema":{"type":"string"}},{"in":"query","name":"min_amplitude","schema":{"type":"number"}},{"in":"query","name":"min_cvss","schema":{"type":"number","format":"float"}},{"in":"query","name":"min_epss","schema":{"type":"number","format":"float"}},{"in":"query","name":"min_prefilter_score","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-amplitude","-created_at","-cvss_score","-epss_score","-external_id","-feed_source_name","-match_count","-prefilter_score","-published_at","-severity","-title","-verified_match_count","amplitude","created_at","cvss_score","epss_score","external_id","feed_source_name","match_count","prefilter_score","published_at","severity","title","verified_match_count"]}},"description":"Ordering\n\n* `published_at` - Published at\n* `-published_at` - Published at (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `external_id` - External id\n* `-external_id` - External id (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `severity` - Severity\n* `-severity` - Severity (descending)\n* `cvss_score` - Cvss score\n* `-cvss_score` - Cvss score (descending)\n* `epss_score` - Epss score\n* `-epss_score` - Epss score (descending)\n* `match_count` - Match count\n* `-match_count` - Match count (descending)\n* `amplitude` - Amplitude\n* `-amplitude` - Amplitude (descending)\n* `verified_match_count` - Verified match count\n* `-verified_match_count` - Verified match count (descending)\n* `prefilter_score` - Prefilter score\n* `-prefilter_score` - Prefilter score (descending)\n* `feed_source_name` - Feed source name\n* `-feed_source_name` - Feed source name (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefilter_favorite","schema":{"type":"boolean"}},{"in":"query","name":"prefilter_matched","schema":{"type":"boolean"}},{"in":"query","name":"prefilter_tag","schema":{"type":"string"}},{"in":"query","name":"published_at_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"published_at_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"published_at_during","schema":{"type":"string"}},{"in":"query","name":"published_at_on","schema":{"type":"string"}},{"in":"query","name":"published_at_past_days","schema":{"type":"number"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: external_id, title, description"},{"in":"query","name":"severity","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"severity_not","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"status_not","schema":{"type":"string"}},{"in":"query","name":"title_contains","schema":{"type":"string"}},{"in":"query","name":"title_ends_with","schema":{"type":"string"}},{"in":"query","name":"title_exact","schema":{"type":"string"}},{"in":"query","name":"title_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_contains","schema":{"type":"string"}},{"in":"query","name":"title_not_exact","schema":{"type":"string"}},{"in":"query","name":"title_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_regex","schema":{"type":"string"}},{"in":"query","name":"title_regex","schema":{"type":"string"}},{"in":"query","name":"title_starts_with","schema":{"type":"string"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtSourceAdvisoryRevisionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories/{id}/suppress/":{"post":{"operationId":"psirt_advisories_suppress_create","description":"Hide an advisory from the default queue, by hand.\n\nRefused once ``suppression_overridden`` is set: a manual unsuppress is\nsticky by design, so that an analyst's \"no, this one matters\" cannot be\nquietly undone by a later rule or a stray click.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt source advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSourceAdvisoryList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories/{id}/unreview/":{"post":{"operationId":"psirt_advisories_unreview_create","description":"The advisory queue. Read-only plus the analyst's overlay actions.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt source advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSourceAdvisoryList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories/{id}/unsuppress/":{"post":{"operationId":"psirt_advisories_unsuppress_create","description":"Bring an advisory back, permanently.\n\nSets the sticky override, which is the whole point: a rule that\nsuppressed it once must not suppress it again on the next drain.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt source advisory.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSourceAdvisoryList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisories/triage_summary/":{"get":{"operationId":"psirt_advisories_triage_summary_retrieve","description":"Counts over the advisories that arrived since ``since`` — the shape of a shift's queue.\n\nBuilt for a client that wants to answer \"what came in overnight and what\nneeds a human?\" without paging through the queue: an MCP agent, a\nmorning digest, a status board. Everything is an aggregate; the response\nis a few hundred bytes whether the window holds ten advisories or ten\nthousand.\n\nUnlike the list, suppressed advisories are **counted** here (with their\nown ``suppressed`` total) — a summary that silently omitted what the\npre-filter rules removed would misreport the feed's volume. Retracted\nmatches are excluded from the exposure buckets, as they are everywhere.","parameters":[{"in":"query","name":"feed_source","schema":{"type":"integer"},"description":"Restrict the counts to one feed source id."},{"in":"query","name":"since","schema":{"type":"string"},"description":"RFC 3339 / ISO 8601 timestamp. Counts cover advisories created at or after it. A naive value is read as UTC.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtTriageSummary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisory-comments/":{"get":{"operationId":"psirt_advisory_comments_list","description":"Review notes. ``kind`` decides whether one blocks publishing.","parameters":[{"in":"query","name":"advisory","schema":{"type":"integer"}},{"in":"query","name":"kind","schema":{"type":"string","x-spec-enum-id":"a12c23b8d766b4e7","enum":["approval","blocking_rejection","question"]},"description":"* `approval` - Approval Note\n* `question` - Question\n* `blocking_rejection` - Blocking Rejection"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"section","schema":{"type":"string"}},{"in":"query","name":"state","schema":{"type":"string","x-spec-enum-id":"776cb7e2f046dff8","enum":["addressed","resolved_by_revision","unaddressed"]},"description":"* `unaddressed` - Unaddressed\n* `addressed` - Addressed\n* `resolved_by_revision` - Resolved by Revision"}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtAdvisoryCommentList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_advisory_comments_create","description":"Review notes. ``kind`` decides whether one blocks publishing.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryCommentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryCommentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryCommentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryComment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisory-comments/{id}/":{"get":{"operationId":"psirt_advisory_comments_retrieve","description":"Review notes. ``kind`` decides whether one blocks publishing.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory comment.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryComment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_advisory_comments_update","description":"Review notes. ``kind`` decides whether one blocks publishing.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory comment.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryCommentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryCommentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryCommentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryComment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_advisory_comments_partial_update","description":"Review notes. ``kind`` decides whether one blocks publishing.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory comment.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtAdvisoryCommentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtAdvisoryCommentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtAdvisoryCommentRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryComment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_advisory_comments_destroy","description":"Review notes. ``kind`` decides whether one blocks publishing.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory comment.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisory-comments/{id}/address/":{"post":{"operationId":"psirt_advisory_comments_address_create","description":"Mark a comment addressed, which unblocks a blocking one.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory comment.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryCommentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryCommentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryCommentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryComment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisory-signoffs/{id}/":{"delete":{"operationId":"psirt_advisory_signoffs_destroy","description":"Unassign a reviewer who has not decided. Refuses a decided one.\n\nReturns the whole roster rather than a bare 204, so the panel can re-render\nwithout a second request — and so the caller sees the gate's new state, which is\nwhat removing a reviewer was for.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory signoff.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisory-signoffs/{id}/approve/":{"post":{"operationId":"psirt_advisory_signoffs_approve_create","description":"A reviewer's verdict. Recorded through actions, never by PATCHing a status.\n\nThe actions stamp the content fingerprint; a PATCH would produce an approval bound\nto nothing, which is the whole bug the fingerprint exists to close.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory signoff.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignoffVerdictRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SignoffVerdictRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SignoffVerdictRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisorySignoff"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisory-signoffs/{id}/recuse/":{"post":{"operationId":"psirt_advisory_signoffs_recuse_create","description":"A reviewer's verdict. Recorded through actions, never by PATCHing a status.\n\nThe actions stamp the content fingerprint; a PATCH would produce an approval bound\nto nothing, which is the whole bug the fingerprint exists to close.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory signoff.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignoffVerdictRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SignoffVerdictRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SignoffVerdictRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisorySignoff"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisory-signoffs/{id}/reject/":{"post":{"operationId":"psirt_advisory_signoffs_reject_create","description":"A reviewer's verdict. Recorded through actions, never by PATCHing a status.\n\nThe actions stamp the content fingerprint; a PATCH would produce an approval bound\nto nothing, which is the whole bug the fingerprint exists to close.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory signoff.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignoffVerdictRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SignoffVerdictRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SignoffVerdictRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisorySignoff"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisory-targets/":{"get":{"operationId":"psirt_advisory_targets_list","description":"Recipients added or excluded by hand. An exclusion beats every other route.","parameters":[{"in":"query","name":"advisory","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"product_type","schema":{"type":"integer"}},{"in":"query","name":"source","schema":{"type":"string","x-spec-enum-id":"8d02a220e0c06746","enum":["auto","excluded","manual"]},"description":"* `auto` - Derived\n* `manual` - Added by Hand\n* `excluded` - Excluded by Hand"}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtAdvisoryManualTargetList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_advisory_targets_create","description":"Recipients added or excluded by hand. An exclusion beats every other route.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryManualTargetRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryManualTargetRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryManualTargetRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryManualTarget"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/advisory-targets/{id}/":{"get":{"operationId":"psirt_advisory_targets_retrieve","description":"Recipients added or excluded by hand. An exclusion beats every other route.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory manual target.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryManualTarget"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_advisory_targets_update","description":"Recipients added or excluded by hand. An exclusion beats every other route.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory manual target.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryManualTargetRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryManualTargetRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryManualTargetRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryManualTarget"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_advisory_targets_partial_update","description":"Recipients added or excluded by hand. An exclusion beats every other route.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory manual target.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtAdvisoryManualTargetRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtAdvisoryManualTargetRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtAdvisoryManualTargetRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtAdvisoryManualTarget"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_advisory_targets_destroy","description":"Recipients added or excluded by hand. An exclusion beats every other route.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT advisory manual target.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/case-attachments/":{"get":{"operationId":"psirt_case_attachments_list","description":"Files on a case. Stored in the instance's own upload storage.","parameters":[{"in":"query","name":"case","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtCaseAttachmentList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_case_attachments_create","description":"Files on a case. Stored in the instance's own upload storage.","tags":["psirt"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtCaseAttachmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtCaseAttachmentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCaseAttachment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/case-attachments/{id}/":{"get":{"operationId":"psirt_case_attachments_retrieve","description":"Files on a case. Stored in the instance's own upload storage.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case attachment.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCaseAttachment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_case_attachments_update","description":"Files on a case. Stored in the instance's own upload storage.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case attachment.","required":true}],"tags":["psirt"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtCaseAttachmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtCaseAttachmentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCaseAttachment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_case_attachments_partial_update","description":"Files on a case. Stored in the instance's own upload storage.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case attachment.","required":true}],"tags":["psirt"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtCaseAttachmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtCaseAttachmentRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCaseAttachment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_case_attachments_destroy","description":"Files on a case. Stored in the instance's own upload storage.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case attachment.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/":{"get":{"operationId":"psirt_cases_list","description":"Cases: the analyst's work item.","parameters":[{"in":"query","name":"analyst","schema":{"type":"integer"}},{"in":"query","name":"disclosure_status","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"disclosure_status_not","schema":{"type":"string"}},{"in":"query","name":"is_open","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"mitigation_priority","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"mitigation_priority_not","schema":{"type":"string"}},{"in":"query","name":"mitigation_status","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"mitigation_status_not","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created_at","-max_cvss","-max_epss","-max_pcrss","-mitigation_priority","-mitigation_status","-oldest_ingestion_date","-reference_id","-title","-updated_at","created_at","max_cvss","max_epss","max_pcrss","mitigation_priority","mitigation_status","oldest_ingestion_date","reference_id","title","updated_at"]}},"description":"Ordering\n\n* `reference_id` - Reference id\n* `-reference_id` - Reference id (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `mitigation_priority` - Mitigation priority\n* `-mitigation_priority` - Mitigation priority (descending)\n* `mitigation_status` - Mitigation status\n* `-mitigation_status` - Mitigation status (descending)\n* `max_cvss` - Max cvss\n* `-max_cvss` - Max cvss (descending)\n* `max_epss` - Max epss\n* `-max_epss` - Max epss (descending)\n* `max_pcrss` - Max pcrss\n* `-max_pcrss` - Max pcrss (descending)\n* `oldest_ingestion_date` - Oldest ingestion date\n* `-oldest_ingestion_date` - Oldest ingestion date (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"reference_id","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: title, reference_id, analysis_notes"},{"in":"query","name":"title_contains","schema":{"type":"string"}},{"in":"query","name":"title_ends_with","schema":{"type":"string"}},{"in":"query","name":"title_exact","schema":{"type":"string"}},{"in":"query","name":"title_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_contains","schema":{"type":"string"}},{"in":"query","name":"title_not_exact","schema":{"type":"string"}},{"in":"query","name":"title_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_regex","schema":{"type":"string"}},{"in":"query","name":"title_regex","schema":{"type":"string"}},{"in":"query","name":"title_starts_with","schema":{"type":"string"}},{"in":"query","name":"unassigned","schema":{"type":"boolean"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtCaseList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_cases_create","description":"Cases: the analyst's work item.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/{id}/":{"get":{"operationId":"psirt_cases_retrieve","description":"Cases: the analyst's work item.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_cases_update","description":"Cases: the analyst's work item.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_cases_partial_update","description":"Cases: the analyst's work item.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtCaseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtCaseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtCaseRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_cases_destroy","description":"Cases: the analyst's work item.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/{id}/attach_advisories/":{"post":{"operationId":"psirt_cases_attach_advisories_create","description":"Cases: the analyst's work item.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachAdvisoriesRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AttachAdvisoriesRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AttachAdvisoriesRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/{id}/attach_matches/":{"post":{"operationId":"psirt_cases_attach_matches_create","description":"Cases: the analyst's work item.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachMatchesRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AttachMatchesRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AttachMatchesRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/{id}/close/":{"post":{"operationId":"psirt_cases_close_create","description":"Conclude a case.\n\nDoes not touch the SLA clocks. Those run on the advisories inside the case\nand stop on their own predicates, so closing a case cannot be used to make an\noutstanding triage obligation disappear.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/{id}/cra-suggestion-seen/":{"post":{"operationId":"psirt_cases_cra_suggestion_seen_create","description":"Record, once, that the CRA Article 14 suggestion appeared on this case.\n\nThe suggestion banner calls this the first time it renders, so the moment the\nobligation was surfaced to a person is on the case's audit trail even though the\nawareness anchor itself is a judgment the person enters by hand. Idempotent: the\nfirst call writes the ledger row and later calls return it unchanged; a case that\ndoes not (or no longer) qualifies records nothing.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/{id}/draft_advisory/":{"post":{"operationId":"psirt_cases_draft_advisory_create","description":"Open a DRAFT advisory covering this case — how authoring normally starts.\n\nThe workbench owns everything after this (content, review, publishing);\nthis route exists so a case can become an advisory without a detour\nthrough the ORM, which was previously the only way to link the two — and\nan advisory covering no case files no findings when it publishes.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftAdvisoryRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DraftAdvisoryRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DraftAdvisoryRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/{id}/recompute_scores/":{"post":{"operationId":"psirt_cases_recompute_scores_create","description":"Re-derive the rolled-up scores from the case's matches.\n\n``force`` is required to overwrite scores a human set, and the reply says\nwhich happened — a silent no-op on an overridden case reads as a broken\nbutton.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/{id}/reopen/":{"post":{"operationId":"psirt_cases_reopen_create","description":"Cases: the analyst's work item.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT case.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtCaseRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/from_advisories/":{"post":{"operationId":"psirt_cases_from_advisories_create","description":"Open a case on advisories straight from the triage queue.\n\nThe sibling ``from_matches`` can only escalate what the inventory already\nmatched. An advisory with no matches — no SBOM loaded yet, a component the\npublisher named differently, or one that arrived an hour ago — is precisely\nthe one somebody needs to open a case about, so the queue gets its own way\nin. Matches, where they exist, come along.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCaseFromAdvisoriesRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CreateCaseFromAdvisoriesRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreateCaseFromAdvisoriesRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/from_matches/":{"post":{"operationId":"psirt_cases_from_matches_create","description":"Group a set of matches into a new case — the normal way a case is born.\n\nReports how many matches actually landed, because retracted and\nfalse-positive rows are dropped rather than refused: acting on a suggestion\nbuilt a minute ago should not fail wholesale because one row moved.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCaseRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CreateCaseRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CreateCaseRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/cases/suggestions/":{"get":{"operationId":"psirt_cases_suggestions_retrieve","description":"Proposed groupings over the matches not yet in any case.\n\nRead-only: this suggests, it does not act. Each match appears in exactly one\nsuggestion — the most confident grouping that could claim it — because\noffering the same match under three headings makes the list longer without\nmaking the decision easier.","tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtCase"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/component-profiles/":{"get":{"operationId":"psirt_component_profiles_list","description":"Create, read, update and delete a dependency's PSIRT annotation.","parameters":[{"in":"query","name":"dependency","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"dependency_not","schema":{"type":"string"}},{"in":"query","name":"has_cpe","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"min_pcrss","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-dependency_name","-pcrss_score","-product_name","-updated_at","dependency_name","pcrss_score","product_name","updated_at"]}},"description":"Ordering\n\n* `pcrss_score` - Pcrss score\n* `-pcrss_score` - Pcrss score (descending)\n* `dependency_name` - Dependency name\n* `-dependency_name` - Dependency name (descending)\n* `product_name` - Product name\n* `-product_name` - Product name (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_not","schema":{"type":"string"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtComponentProfileList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_component_profiles_create","description":"Create, read, update and delete a dependency's PSIRT annotation.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfileRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/component-profiles/{id}/":{"get":{"operationId":"psirt_component_profiles_retrieve","description":"Create, read, update and delete a dependency's PSIRT annotation.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt component profile.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_component_profiles_update","description":"Create, read, update and delete a dependency's PSIRT annotation.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt component profile.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfileRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_component_profiles_partial_update","description":"Create, read, update and delete a dependency's PSIRT annotation.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt component profile.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtComponentProfileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtComponentProfileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtComponentProfileRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_component_profiles_destroy","description":"Create, read, update and delete a dependency's PSIRT annotation.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt component profile.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/component-profiles/{id}/rematch/":{"post":{"operationId":"psirt_component_profiles_rematch_create","description":"Re-queue every advisory whose matching this profile could change.\n\nSaving a CPE is only useful once something re-evaluates with it, and\nwaiting for the next natural pass would leave the analyst unsure whether\ntheir edit did anything. Scoped to advisories that already produced a\nmatch on this dependency plus those still queued, rather than the whole\nstore — a profile edit is not a reason to re-run history.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt component profile.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfileRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtComponentProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/components/":{"get":{"operationId":"psirt_components_list","description":"The SBOM inventory as PSIRT reads it: one row per (component, product).\n\nList-only on purpose. The rows are made by the SBOM importer and consumed by\nthe matcher; what an analyst owns is the *overlay* — pcrss, an authoritative\nCPE, tags — and that writes through the component-profiles CRUD, never here.","parameters":[{"in":"query","name":"has_profile","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"min_pcrss","schema":{"type":"number"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-match_count","-name","-pcrss_score","-product_name","-version","match_count","name","pcrss_score","product_name","version"]}},"description":"Ordering\n\n* `name` - Name\n* `-name` - Name (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `product_name` - Product name\n* `-product_name` - Product name (descending)\n* `pcrss_score` - Pcrss score\n* `-pcrss_score` - Pcrss score (descending)\n* `match_count` - Match count\n* `-match_count` - Match count (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_not","schema":{"type":"string"}},{"in":"query","name":"purl_type","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"purl_type_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtComponentInventoryRowList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/coverage/generate-rules/":{"post":{"operationId":"psirt_coverage_generate_rules_create","description":"Create a product-scoped group from the curated selection.\n\nConditions are regenerated here rather than accepted from the client: the\nclient chooses which components to cover, never what the rule says. A rule\nthe trust layer grades weak is created disabled, the same invariant the\nauthoring API enforces.","tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRulesRequest"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/coverage/product/{product_id}/":{"get":{"operationId":"psirt_coverage_product_retrieve","description":"The full coverage verdict for one product.","parameters":[{"in":"path","name":"product_id","schema":{"type":"string","pattern":"^[0-9]+$"},"required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRulesRequest"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/coverage/proposals/":{"get":{"operationId":"psirt_coverage_proposals_retrieve","description":"Proposed rules for the named products' inventory, badged and dedup-flagged.\n\nRead-only: this proposes, it does not create. A proposal already covered\nby an in-scope rule, or graded broad by the trust layer, comes back\npre-deselected rather than hidden — an analyst deciding what to watch\nshould see what is already watched.","tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRulesRequest"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/coverage/tree/":{"get":{"operationId":"psirt_coverage_tree_retrieve","description":"The organization → product coverage tree, batched.\n\n``products`` narrows it; omitted, the whole estate is graded. The grades\nare the point: a green product has a strong rule AND most of its\ninventory named by one, so \"covered\" cannot be earned by a single\nprecise rule beside a thousand unwatched components.","tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateRulesRequest"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-categories/":{"get":{"operationId":"psirt_feed_categories_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtFeedCategoryList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-categories/{id}/":{"get":{"operationId":"psirt_feed_categories_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed category.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedCategory"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-rule-subscriptions/":{"get":{"operationId":"psirt_feed_rule_subscriptions_list","description":"Where a feed rule applies: one feed, or every feed.","parameters":[{"in":"query","name":"feed_source","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"feed_source_not","schema":{"type":"string"}},{"in":"query","name":"group","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_not","schema":{"type":"string"}},{"in":"query","name":"is_default","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtFeedPrefilterSubscriptionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_feed_rule_subscriptions_create","description":"Where a feed rule applies: one feed, or every feed.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscriptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscriptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscriptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscription"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-rule-subscriptions/{id}/":{"get":{"operationId":"psirt_feed_rule_subscriptions_retrieve","description":"Where a feed rule applies: one feed, or every feed.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed prefilter subscription.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscription"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_feed_rule_subscriptions_update","description":"Where a feed rule applies: one feed, or every feed.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed prefilter subscription.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscriptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscriptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscriptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscription"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_feed_rule_subscriptions_partial_update","description":"Where a feed rule applies: one feed, or every feed.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed prefilter subscription.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtFeedPrefilterSubscriptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtFeedPrefilterSubscriptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtFeedPrefilterSubscriptionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscription"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_feed_rule_subscriptions_destroy","description":"Where a feed rule applies: one feed, or every feed.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed prefilter subscription.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-rules/":{"get":{"operationId":"psirt_feed_rules_list","description":"Feed rules: score, tag, favourite and suppress advisories from their own text.","parameters":[{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"feed_source","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"feed_source_not","schema":{"type":"string"}},{"in":"query","name":"is_default","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"min_priority","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-enabled","-name","-priority","-updated_at","enabled","name","priority","updated_at"]}},"description":"Ordering\n\n* `name` - Name\n* `-name` - Name (descending)\n* `priority` - Priority\n* `-priority` - Priority (descending)\n* `enabled` - Enabled\n* `-enabled` - Enabled (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtPrefilterGroupList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_feed_rules_create","description":"Feed rules: score, tag, favourite and suppress advisories from their own text.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-rules/{id}/":{"get":{"operationId":"psirt_feed_rules_retrieve","description":"Feed rules: score, tag, favourite and suppress advisories from their own text.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt prefilter group.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_feed_rules_update","description":"Feed rules: score, tag, favourite and suppress advisories from their own text.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt prefilter group.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_feed_rules_partial_update","description":"Feed rules: score, tag, favourite and suppress advisories from their own text.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt prefilter group.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtPrefilterGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtPrefilterGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtPrefilterGroupRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_feed_rules_destroy","description":"Feed rules: score, tag, favourite and suppress advisories from their own text.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt prefilter group.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-rules/{id}/disable/":{"post":{"operationId":"psirt_feed_rules_disable_create","description":"Feed rules: score, tag, favourite and suppress advisories from their own text.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt prefilter group.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-rules/{id}/enable/":{"post":{"operationId":"psirt_feed_rules_enable_create","description":"Enable a rule, refusing the two shapes that cannot do anything.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt prefilter group.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-rules/from_template/":{"post":{"operationId":"psirt_feed_rules_from_template_create","description":"Turn a starter into a real rule.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FromTemplateRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FromTemplateRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FromTemplateRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-rules/preview/":{"post":{"operationId":"psirt_feed_rules_preview_create","description":"How many of the recent advisories these conditions would catch, and which.\n\nRuns the drain's own evaluator over a window of real rows rather than a\nheuristic, because the question a rule author actually has — \"is this going\nto tag six things or six thousand?\" — has no answer that can be estimated.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrefilterPreviewRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PrefilterPreviewRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PrefilterPreviewRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-rules/rescore/":{"post":{"operationId":"psirt_feed_rules_rescore_create","description":"Apply the current rules to advisories already in the queue.\n\nRules run at ingest, so a rule written today would otherwise only ever\ntouch tomorrow's advisories — while the reason anyone writes one is the\nbacklog in front of them. Bounded rather than unbounded: this runs inline\non a request, and a whole-corpus rescore belongs to the drain.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RescoreRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RescoreRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RescoreRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-rules/templates/":{"get":{"operationId":"psirt_feed_rules_templates_retrieve","description":"The starter catalog. Code, not rows — see ``prefilter_library``.","tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtPrefilterGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-sources/":{"get":{"operationId":"psirt_feed_sources_list","description":"Feed sources: list/detail/create/update/delete + the enable ceremony.","parameters":[{"in":"query","name":"category","schema":{"type":"integer"}},{"in":"query","name":"clearance_state","schema":{"type":"string","x-spec-enum-id":"b3c1675786afb9b8","enum":["cleared","pending_agreement","pending_ruling"]},"description":"Legal-clearance gate: enablement refuses any source that is not 'cleared'. 'pending_agreement' means DefectDojo is pursuing a licensing agreement or consent with the publisher; 'pending_ruling' means the source's terms are with counsel. Neither is something a customer can accept their way past\n\n* `cleared` - Cleared\n* `pending_agreement` - Pending Agreement\n* `pending_ruling` - Pending Ruling"},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"is_shipped","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"source_type","schema":{"type":"string","x-spec-enum-id":"81077480c35ed8f5","enum":["cisa_api","csaf_github","direct_rss","euvd_api","exploitdb_gitlab","freshrss","git_vulns","nvd_api","ubuntu_security_api"]},"description":"Connector protocol used to poll this source\n\n* `freshrss` - FreshRSS\n* `cisa_api` - CISA API\n* `euvd_api` - EUVD API\n* `nvd_api` - NVD API\n* `direct_rss` - Direct RSS\n* `csaf_github` - CSAF GitHub\n* `ubuntu_security_api` - Ubuntu Security API\n* `exploitdb_gitlab` - Exploit-DB GitLab\n* `git_vulns` - Kernel vulns.git"}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtFeedSourceList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_feed_sources_create","description":"Feed sources: list/detail/create/update/delete + the enable ceremony.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedSource"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-sources/{id}/":{"get":{"operationId":"psirt_feed_sources_retrieve","description":"Feed sources: list/detail/create/update/delete + the enable ceremony.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed source.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedSource"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_feed_sources_update","description":"Feed sources: list/detail/create/update/delete + the enable ceremony.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed source.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedSource"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_feed_sources_partial_update","description":"Feed sources: list/detail/create/update/delete + the enable ceremony.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed source.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtFeedSourceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtFeedSourceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtFeedSourceRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedSource"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_feed_sources_destroy","description":"Feed sources: list/detail/create/update/delete + the enable ceremony.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed source.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-sources/{id}/acceptances/":{"get":{"operationId":"psirt_feed_sources_acceptances_list","description":"The append-only acceptance ledger for this source, newest first.","parameters":[{"in":"query","name":"category","schema":{"type":"integer"}},{"in":"query","name":"clearance_state","schema":{"type":"string","x-spec-enum-id":"b3c1675786afb9b8","enum":["cleared","pending_agreement","pending_ruling"]},"description":"Legal-clearance gate: enablement refuses any source that is not 'cleared'. 'pending_agreement' means DefectDojo is pursuing a licensing agreement or consent with the publisher; 'pending_ruling' means the source's terms are with counsel. Neither is something a customer can accept their way past\n\n* `cleared` - Cleared\n* `pending_agreement` - Pending Agreement\n* `pending_ruling` - Pending Ruling"},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed source.","required":true},{"in":"query","name":"is_shipped","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"source_type","schema":{"type":"string","x-spec-enum-id":"81077480c35ed8f5","enum":["cisa_api","csaf_github","direct_rss","euvd_api","exploitdb_gitlab","freshrss","git_vulns","nvd_api","ubuntu_security_api"]},"description":"Connector protocol used to poll this source\n\n* `freshrss` - FreshRSS\n* `cisa_api` - CISA API\n* `euvd_api` - EUVD API\n* `nvd_api` - NVD API\n* `direct_rss` - Direct RSS\n* `csaf_github` - CSAF GitHub\n* `ubuntu_security_api` - Ubuntu Security API\n* `exploitdb_gitlab` - Exploit-DB GitLab\n* `git_vulns` - Kernel vulns.git"}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtLicenceAcceptanceList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-sources/{id}/disable/":{"post":{"operationId":"psirt_feed_sources_disable_create","description":"Turn a source off. Gate-free by design.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed source.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedSource"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-sources/{id}/enable/":{"post":{"operationId":"psirt_feed_sources_enable_create","description":"Run the enable transaction; 409 {code, message} on any refusal.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed source.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedEnableRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtFeedEnableRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtFeedEnableRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtLicenceAcceptance"}}},"description":""},"409":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-sources/{id}/poll/":{"post":{"operationId":"psirt_feed_sources_poll_create","description":"Queue an immediate poll for one source (the skip-locked lease in the\ntask makes a double-click harmless).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed source.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtFeedSourceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedSource"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/feed-sources/{id}/terms/":{"get":{"operationId":"psirt_feed_sources_terms_retrieve","description":"The acceptance-modal payload: exact terms text + hash to echo back.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt feed source.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtFeedTerms"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/ingest-runs/":{"get":{"operationId":"psirt_ingest_runs_list","description":"Run-ledger polling surface (the run models replace the engine's SSE).","parameters":[{"in":"query","name":"feed_source","schema":{"type":"integer"}},{"in":"query","name":"kind","schema":{"type":"string","x-spec-enum-id":"2ccb29b7973a21fb","enum":["detail","enrich","match","poll"]},"description":"What kind of pipeline work this run performed\n\n* `poll` - Poll\n* `enrich` - Enrich\n* `match` - Match\n* `detail` - Detail Enhance"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"state","schema":{"type":"string","x-spec-enum-id":"b2c0c6a6315c0998","enum":["failed","partial","running","succeeded"]},"description":"Where this run sits in its lifecycle\n\n* `running` - Running\n* `succeeded` - Succeeded\n* `partial` - Partial\n* `failed` - Failed"}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtIngestRunList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/ingest-runs/{id}/":{"get":{"operationId":"psirt_ingest_runs_retrieve","description":"Run-ledger polling surface (the run models replace the engine's SSE).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt ingest run.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtIngestRun"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/matches/":{"get":{"operationId":"psirt_matches_list","description":"Matches, and the analyst's judgement on them.\n\n``status`` and ``analyst_notes`` are the only writable fields — everything\nelse is the engine's account of why the row exists, and an editable\nprovenance record is not a provenance record.","parameters":[{"in":"query","name":"dependency","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"dependency_not","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"match_source","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"match_source_not","schema":{"type":"string"}},{"in":"query","name":"min_confidence","schema":{"type":"number","format":"float"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-confidence","-created_at","-dependency_name","-status","-version_verified","confidence","created_at","dependency_name","status","version_verified"]}},"description":"Ordering\n\n* `confidence` - Confidence\n* `-confidence` - Confidence (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `version_verified` - Version verified\n* `-version_verified` - Version verified (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `dependency_name` - Dependency name\n* `-dependency_name` - Dependency name (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"product_not","schema":{"type":"string"}},{"in":"query","name":"source_advisory","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"source_advisory_not","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"status_not","schema":{"type":"string"}},{"in":"query","name":"version_verified","schema":{"type":"boolean"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtMatchList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/matches/{id}/":{"get":{"operationId":"psirt_matches_retrieve","description":"Matches, and the analyst's judgement on them.\n\n``status`` and ``analyst_notes`` are the only writable fields — everything\nelse is the engine's account of why the row exists, and an editable\nprovenance record is not a provenance record.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatch"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_matches_update","description":"Matches, and the analyst's judgement on them.\n\n``status`` and ``analyst_notes`` are the only writable fields — everything\nelse is the engine's account of why the row exists, and an editable\nprovenance record is not a provenance record.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtMatchRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtMatchRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatch"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_matches_partial_update","description":"Matches, and the analyst's judgement on them.\n\n``status`` and ``analyst_notes`` are the only writable fields — everything\nelse is the engine's account of why the row exists, and an editable\nprovenance record is not a provenance record.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtMatchRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtMatchRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtMatchRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatch"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/matches/{id}/export/":{"post":{"operationId":"psirt_matches_export_create","description":"File the Dojo Pro finding(s) for this match.\n\nSynchronous rather than queued, unlike ``rematch``: this is a human\npressing a button on one row and expecting to be told what happened, and\nthe work is a handful of writes. Queueing it would trade an immediate,\nlegible answer for a spinner.\n\nThe reply names every product touched, because a dependency-leg match\nimplicates every product carrying that component — one click can\nlegitimately produce eight findings, and a bare \"exported\" would hide that.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtMatchRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtMatchRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatch"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-groups/":{"get":{"operationId":"psirt_rule_groups_list","description":"Rule groups, their scope, and the enable/disable controls.","parameters":[{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"is_default","schema":{"type":"boolean"}},{"in":"query","name":"is_subscribed","schema":{"type":"boolean"}},{"in":"query","name":"is_template","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-name","-operator","-priority","-rule_count","-updated_at","name","operator","priority","rule_count","updated_at"]}},"description":"Ordering\n\n* `name` - Name\n* `-name` - Name (descending)\n* `operator` - Operator\n* `-operator` - Operator (descending)\n* `priority` - Priority\n* `-priority` - Priority (descending)\n* `rule_count` - Rule count\n* `-rule_count` - Rule count (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"operator","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"operator_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtRuleGroupList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_rule_groups_create","description":"Rule groups, their scope, and the enable/disable controls.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-groups/{id}/":{"get":{"operationId":"psirt_rule_groups_retrieve","description":"Rule groups, their scope, and the enable/disable controls.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_rule_groups_update","description":"Rule groups, their scope, and the enable/disable controls.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_rule_groups_partial_update","description":"Rule groups, their scope, and the enable/disable controls.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtRuleGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtRuleGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtRuleGroupRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_rule_groups_destroy","description":"Delete a group and disable the rules it orphans.\n\n``PsirtMatchRule.group`` is ``SET_NULL``, so the rules survive as standalone\nrules — which carry no subscription of their own and would therefore keep\nmatching, unscoped, after their group was deleted. Disabling them is what\nmakes \"delete this group\" mean what a user reading the button expects.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-groups/{id}/applies_to/":{"get":{"operationId":"psirt_rule_groups_applies_to_retrieve","description":"The products this group actually reaches, after opt-out precedence.\n\nResolved server-side through the same resolver the drain uses, because\nworking it out from the subscription rows is exactly where a UI would get\nthe precedence wrong and tell someone a group is running where it is not.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-groups/{id}/copy/":{"post":{"operationId":"psirt_rule_groups_copy_create","description":"Copy this group — usually a template — into a group you own.\n\nThe only way a shipped template library is reachable: a template is not run\ndirectly, so without this the curated groups are inert rows. The copy is\nauto-paired on the way through, so a clone of a one-sided template cannot\nbecome a running rule that matches every advisory.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopyGroupRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CopyGroupRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CopyGroupRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-groups/{id}/disable/":{"post":{"operationId":"psirt_rule_groups_disable_create","description":"Rule groups, their scope, and the enable/disable controls.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-groups/{id}/effectiveness/":{"get":{"operationId":"psirt_rule_groups_effectiveness_retrieve","description":"Per-rule effectiveness for every enabled rule in this group.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-groups/{id}/enable/":{"post":{"operationId":"psirt_rule_groups_enable_create","description":"Rule groups, their scope, and the enable/disable controls.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-groups/{id}/preview/":{"post":{"operationId":"psirt_rule_groups_preview_create","description":"Dry-run every enabled rule in this group, composed by its operator.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PreviewRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PreviewRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-groups/{id}/subscriptions/":{"get":{"operationId":"psirt_rule_groups_subscriptions_list","description":"Rule groups, their scope, and the enable/disable controls.","parameters":[{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group.","required":true},{"in":"query","name":"is_default","schema":{"type":"boolean"}},{"in":"query","name":"is_subscribed","schema":{"type":"boolean"}},{"in":"query","name":"is_template","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-name","-operator","-priority","-rule_count","-updated_at","name","operator","priority","rule_count","updated_at"]}},"description":"Ordering\n\n* `name` - Name\n* `-name` - Name (descending)\n* `operator` - Operator\n* `-operator` - Operator (descending)\n* `priority` - Priority\n* `-priority` - Priority (descending)\n* `rule_count` - Rule count\n* `-rule_count` - Rule count (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"operator","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"operator_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtRuleGroupSubscriptionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-groups/templates/":{"get":{"operationId":"psirt_rule_groups_templates_retrieve","description":"The catalog of groups available to copy.","tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroup"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-subscriptions/":{"get":{"operationId":"psirt_rule_subscriptions_list","description":"Where groups apply: subscriptions, the global default, and opt-outs.","parameters":[{"in":"query","name":"group","schema":{"type":"integer"}},{"in":"query","name":"is_default","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"opted_out","schema":{"type":"boolean"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"product_type","schema":{"type":"integer"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtRuleGroupSubscriptionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_rule_subscriptions_create","description":"Where groups apply: subscriptions, the global default, and opt-outs.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupSubscriptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupSubscriptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupSubscriptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupSubscription"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rule-subscriptions/{id}/":{"get":{"operationId":"psirt_rule_subscriptions_retrieve","description":"Where groups apply: subscriptions, the global default, and opt-outs.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group subscription.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupSubscription"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_rule_subscriptions_update","description":"Where groups apply: subscriptions, the global default, and opt-outs.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group subscription.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupSubscriptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupSubscriptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupSubscriptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupSubscription"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_rule_subscriptions_partial_update","description":"Where groups apply: subscriptions, the global default, and opt-outs.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group subscription.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtRuleGroupSubscriptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtRuleGroupSubscriptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtRuleGroupSubscriptionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRuleGroupSubscription"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_rule_subscriptions_destroy","description":"Where groups apply: subscriptions, the global default, and opt-outs.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt rule group subscription.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rules/":{"get":{"operationId":"psirt_rules_list","description":"Rules, their nested conditions and actions, and the trust gate.","parameters":[{"in":"query","name":"condition_type","schema":{"type":"string"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"group","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"group_not","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-group_name","-name","-priority","-rule_type","-updated_at","group_name","name","priority","rule_type","updated_at"]}},"description":"Ordering\n\n* `name` - Name\n* `-name` - Name (descending)\n* `priority` - Priority\n* `-priority` - Priority (descending)\n* `rule_type` - Rule type\n* `-rule_type` - Rule type (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)\n* `group_name` - Group name\n* `-group_name` - Group name (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"rule_type","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"rule_type_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description, pattern"},{"in":"query","name":"standalone","schema":{"type":"boolean"}},{"in":"query","name":"target_mode","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"target_mode_not","schema":{"type":"string"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtMatchRuleList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_rules_create","description":"Rules, their nested conditions and actions, and the trust gate.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rules/{id}/":{"get":{"operationId":"psirt_rules_retrieve","description":"Rules, their nested conditions and actions, and the trust gate.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match rule.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_rules_update","description":"Rules, their nested conditions and actions, and the trust gate.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match rule.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_rules_partial_update","description":"Rules, their nested conditions and actions, and the trust gate.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match rule.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtMatchRuleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtMatchRuleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtMatchRuleRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_rules_destroy","description":"Rules, their nested conditions and actions, and the trust gate.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match rule.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rules/{id}/disable/":{"post":{"operationId":"psirt_rules_disable_create","description":"Rules, their nested conditions and actions, and the trust gate.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match rule.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rules/{id}/effectiveness/":{"get":{"operationId":"psirt_rules_effectiveness_retrieve","description":"What this rule has actually produced, and whether it looks noisy or dead.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match rule.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rules/{id}/enable/":{"post":{"operationId":"psirt_rules_enable_create","description":"Enable a rule, or refuse with the reason.\n\nRouted through the serializer rather than flipping the column, so this\ncontrol and a PATCH cannot enforce different rules.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match rule.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rules/{id}/preview/":{"post":{"operationId":"psirt_rules_preview_create","description":"Dry-run this rule against the recent corpus. Writes nothing.\n\n``conditions`` in the body previews an unsaved edit instead of the stored\nrule, which is what makes \"will this be better?\" answerable before saving.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match rule.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PreviewRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PreviewRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rules/{id}/repair/":{"post":{"operationId":"psirt_rules_repair_create","description":"Pair *this* rule with the advisory-side condition it is missing.\n\nThe common authoring mistake is gating only the component side, which\nover-matches. Rather than only reporting it, offer the fix — the repair is\nidempotent, so pressing it twice changes nothing.\n\nScoped to one rule on purpose. The ported sweep repairs every one-sided\nrule in the instance, which is the right shape for a management command and\nthe wrong shape entirely for a button on one row: it would rewrite\nconditions on rules the person pressing it has never seen.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this psirt match rule.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtMatchRuleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rules/assess/":{"post":{"operationId":"psirt_rules_assess_create","description":"Trust verdict for conditions that have not been saved yet.\n\nThis is what lets the editor tell an author their rule is heading for\n``weak`` while they are still typing, instead of refusing it on save. It is\nthe same function as the gate — deliberately, so the two cannot disagree.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssessRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssessRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssessRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/rules/preview-conditions/":{"post":{"operationId":"psirt_rules_preview_conditions_create","description":"Dry-run a condition set that has never been saved — the authoring preview.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreviewRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PreviewRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PreviewRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMatchRule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/settings/material-change/":{"get":{"operationId":"psirt_settings_material_change_retrieve","description":"Which upstream advisory changes count as material.","tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMaterialChangePolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_settings_material_change_partial_update","description":"Which upstream advisory changes count as material.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtMaterialChangePolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtMaterialChangePolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtMaterialChangePolicyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtMaterialChangePolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/settings/recency/":{"get":{"operationId":"psirt_settings_recency_retrieve","description":"The persistent default \"new\"-item window for feed counts.","tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRecencyConfig"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_settings_recency_partial_update","description":"The persistent default \"new\"-item window for feed counts.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtRecencyConfigRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtRecencyConfigRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtRecencyConfigRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtRecencyConfig"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/settings/worthiness/":{"get":{"operationId":"psirt_settings_worthiness_retrieve","description":"The case-worthiness fusion weights and risk bands.","tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtWorthinessConfig"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_settings_worthiness_partial_update","description":"The case-worthiness fusion weights and risk bands.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtWorthinessConfigRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtWorthinessConfigRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtWorthinessConfigRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtWorthinessConfig"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/sla-clock-definitions/":{"get":{"operationId":"psirt_sla_clock_definitions_list","description":"Clock definitions. Editable, but not their predicate wiring.","parameters":[{"in":"query","name":"can_pause","schema":{"type":"boolean"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"subject_kind","schema":{"type":"string","x-spec-enum-id":"658da167dc8550af","enum":["advisory","regulatory_stage","source_advisory"]},"description":"What this clock runs on\n\n* `source_advisory` - Source Advisory\n* `advisory` - Advisory\n* `regulatory_stage` - Regulatory Report Stage"}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtSlaClockDefinitionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/sla-clock-definitions/{id}/":{"get":{"operationId":"psirt_sla_clock_definitions_retrieve","description":"Clock definitions. Editable, but not their predicate wiring.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT SLA clock definition.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaClockDefinition"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_sla_clock_definitions_update","description":"Clock definitions. Editable, but not their predicate wiring.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT SLA clock definition.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaClockDefinitionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtSlaClockDefinitionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtSlaClockDefinitionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaClockDefinition"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_sla_clock_definitions_partial_update","description":"Clock definitions. Editable, but not their predicate wiring.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT SLA clock definition.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtSlaClockDefinitionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtSlaClockDefinitionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtSlaClockDefinitionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaClockDefinition"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/sla-clocks/":{"get":{"operationId":"psirt_sla_clocks_list","description":"SLA clocks: read-only, plus pause and resume.\n\nNo create, no update, no delete. A clock is a record of an obligation and how it\nwas met; an editable one would let a team decide retroactively that nothing was\nlate, which is precisely what this framework is for preventing.","parameters":[{"in":"query","name":"breached","schema":{"type":"boolean"}},{"in":"query","name":"clock_code","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"clock_code_not","schema":{"type":"string"}},{"in":"query","name":"clock_definition","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"clock_definition_not","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"live","schema":{"type":"boolean"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-deadline_at","-started_at","-state","-tier","deadline_at","started_at","state","tier"]}},"description":"Ordering\n\n* `deadline_at` - Deadline at\n* `-deadline_at` - Deadline at (descending)\n* `started_at` - Started at\n* `-started_at` - Started at (descending)\n* `state` - State\n* `-state` - State (descending)\n* `tier` - Tier\n* `-tier` - Tier (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"state","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"state_not","schema":{"type":"string"}},{"in":"query","name":"subject_id","schema":{"type":"integer"}},{"in":"query","name":"subject_kind","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"subject_kind_not","schema":{"type":"string"}},{"in":"query","name":"tier","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"tier_not","schema":{"type":"string"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtSlaClockList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/sla-clocks/{id}/":{"get":{"operationId":"psirt_sla_clocks_retrieve","description":"SLA clocks: read-only, plus pause and resume.\n\nNo create, no update, no delete. A clock is a record of an obligation and how it\nwas met; an editable one would let a team decide retroactively that nothing was\nlate, which is precisely what this framework is for preventing.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT SLA clock.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaClock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/sla-clocks/{id}/pause/":{"post":{"operationId":"psirt_sla_clocks_pause_create","description":"Stop the count, with a category and a reason.\n\nRefusals come back as 409 with the engine's own code and sentence, so the UI\ncan show why rather than inventing an explanation — and the codes are stable,\nso a client can special-case one without parsing prose.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT SLA clock.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PauseRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PauseRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PauseRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaClock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/sla-clocks/{id}/resume/":{"post":{"operationId":"psirt_sla_clocks_resume_create","description":"Start counting again, and push the deadline out by the pause.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT SLA clock.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaClock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/sla-policies/":{"get":{"operationId":"psirt_sla_policies_list","description":"Tier durations. The one part of the SLA an operator is meant to tune.","parameters":[{"in":"query","name":"clock_definition","schema":{"type":"integer"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"tier","schema":{"type":"string"}}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedPsirtSlaPolicyList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"psirt_sla_policies_create","description":"Tier durations. The one part of the SLA an operator is meant to tune.","tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtSlaPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtSlaPolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/psirt/sla-policies/{id}/":{"get":{"operationId":"psirt_sla_policies_retrieve","description":"Tier durations. The one part of the SLA an operator is meant to tune.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT SLA policy.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"psirt_sla_policies_update","description":"Tier durations. The one part of the SLA an operator is meant to tune.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT SLA policy.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PsirtSlaPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PsirtSlaPolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"psirt_sla_policies_partial_update","description":"Tier durations. The one part of the SLA an operator is meant to tune.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT SLA policy.","required":true}],"tags":["psirt"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedPsirtSlaPolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedPsirtSlaPolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedPsirtSlaPolicyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PsirtSlaPolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"psirt_sla_policies_destroy","description":"Refuse to delete a policy a live clock is running under.\n\nIts durations are what produced that clock's deadline, and deleting it would\nleave a running obligation whose terms nobody can look up.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this PSIRT SLA policy.","required":true}],"tags":["psirt"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/reachability/verdicts/":{"post":{"operationId":"reachability_verdicts_create","description":"Provider-facing reachability endpoints (token auth): external or\nfirst-party engines submit verdict batches that are matched onto existing\nfindings per the pinned R2 contract.","tags":["reachability"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerdictBatchRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/VerdictBatchRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/VerdictBatchRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReachabilityIngestResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/":{"get":{"operationId":"recommendations_list","description":"Read recommendations; start/cancel runs; apply, revert and dismiss recommendations.\n\nRead-only base plus explicit action endpoints: a recommendation is generated and then\ntransitioned through its lifecycle, never written field-by-field through the API.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["recommendations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRecommendationListList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/{id}/":{"get":{"operationId":"recommendations_retrieve","description":"Read recommendations; start/cancel runs; apply, revert and dismiss recommendations.\n\nRead-only base plus explicit action endpoints: a recommendation is generated and then\ntransitioned through its lifecycle, never written field-by-field through the API.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this recommendation.","required":true}],"tags":["recommendations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/{id}/apply/":{"post":{"operationId":"recommendations_apply_create","description":"Apply a proposed recommendation through the existing settings write path.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this recommendation.","required":true}],"tags":["recommendations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ApplyRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ApplyRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/{id}/dismiss/":{"post":{"operationId":"recommendations_dismiss_create","description":"Dismiss a proposed recommendation so it stops appearing as open.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this recommendation.","required":true}],"tags":["recommendations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DismissRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DismissRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DismissRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/{id}/revert/":{"post":{"operationId":"recommendations_revert_create","description":"Revert a previously applied recommendation to its captured previous value.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this recommendation.","required":true}],"tags":["recommendations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ApplyRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ApplyRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/capacity/":{"get":{"operationId":"recommendations_capacity_retrieve","description":"The capacity questionnaire: the stored answers, the scan sources observed on this instance to pre-fill it with, and the available cadence and coverage choices.","tags":["recommendations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapacityQuestionnaire"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"recommendations_capacity_update","description":"Replace the stored capacity answers.","tags":["recommendations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapacityAnswersRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CapacityAnswersRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CapacityAnswersRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapacityQuestionnaire"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/capacity/projection/":{"get":{"operationId":"recommendations_capacity_projection_retrieve","description":"Project this instance's annual findings-processed volume from the stored answers and observed usage, and match it against the published tier ladder. A live preview of what a capacity-planning Advisor run would produce; it starts no run.","tags":["recommendations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapacityProjection"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/overview/":{"get":{"operationId":"recommendations_overview_retrieve","description":"Per-domain recommendation counts and the latest run.","tags":["recommendations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdvisorOverview"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/quota/":{"get":{"operationId":"recommendations_quota_retrieve","description":"Where this instance stands against its licensed Sensei Advisor runs: used, limit, analyses queued or running, and whether a new one may start.","tags":["recommendations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeteredRunQuota"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/runs/":{"get":{"operationId":"recommendations_runs_list","description":"List analysis runs.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["recommendations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRecommendationRunList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"recommendations_runs_create","description":"Start a new analysis over the given domains (or all of them).","tags":["recommendations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartRunRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/StartRunRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/StartRunRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationRun"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/runs/{run_id}/":{"get":{"operationId":"recommendations_runs_retrieve","description":"Poll one run's status and progress.","parameters":[{"in":"path","name":"run_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true}],"tags":["recommendations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationRun"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/recommendations/runs/{run_id}/cancel/":{"post":{"operationId":"recommendations_runs_cancel_create","description":"Cancel a queued or running analysis.","parameters":[{"in":"path","name":"run_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true}],"tags":["recommendations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationRun"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulations/":{"get":{"operationId":"regulations_list","parameters":[{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["regulations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRegulationList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"regulations_create","tags":["regulations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Regulation"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulations/{id}/":{"get":{"operationId":"regulations_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulation.","required":true}],"tags":["regulations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Regulation"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"regulations_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulation.","required":true}],"tags":["regulations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Regulation"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"regulations_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulation.","required":true}],"tags":["regulations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedRegulationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedRegulationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedRegulationRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Regulation"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"regulations_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulation.","required":true}],"tags":["regulations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulations/{id}/delete_preview/":{"get":{"operationId":"regulations_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulation.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["regulations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_assessments/":{"get":{"operationId":"regulatory_assessments_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"catalog","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"period_end","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_end__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_end__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_start","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_start__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_start__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"6a2167955947f373","enum":["draft","final","in_review"]},"description":"Assessment workflow status\n\n* `draft` - Draft\n* `in_review` - In review\n* `final` - Final"}],"tags":["regulatory_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRegulatoryAssessmentList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"regulatory_assessments_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["regulatory_assessments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessmentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_assessments/{id}/":{"get":{"operationId":"regulatory_assessments_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory assessment.","required":true}],"tags":["regulatory_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"regulatory_assessments_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory assessment.","required":true}],"tags":["regulatory_assessments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessmentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"regulatory_assessments_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory assessment.","required":true}],"tags":["regulatory_assessments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryAssessmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryAssessmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryAssessmentRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"regulatory_assessments_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory assessment.","required":true}],"tags":["regulatory_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_assessments/{id}/history/":{"get":{"operationId":"regulatory_assessments_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"catalog","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory assessment.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"period_end","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_end__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_end__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_start","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_start__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_start__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"6a2167955947f373","enum":["draft","final","in_review"]},"description":"Assessment workflow status\n\n* `draft` - Draft\n* `in_review` - In review\n* `final` - Final"}],"tags":["regulatory_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_assessments/{id}/history/legacy/":{"get":{"operationId":"regulatory_assessments_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"catalog","schema":{"type":"integer"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory assessment.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"period_end","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_end__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_end__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_start","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_start__gte","schema":{"type":"string","format":"date"}},{"in":"query","name":"period_start__lte","schema":{"type":"string","format":"date"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"6a2167955947f373","enum":["draft","final","in_review"]},"description":"Assessment workflow status\n\n* `draft` - Draft\n* `in_review` - In review\n* `final` - Final"}],"tags":["regulatory_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_assessments/{id}/history/legacy/count/":{"get":{"operationId":"regulatory_assessments_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory assessment.","required":true}],"tags":["regulatory_assessments"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_assessments/{id}/recompute/":{"post":{"operationId":"regulatory_assessments_recompute_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory assessment.","required":true}],"tags":["regulatory_assessments"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessmentRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessmentRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessmentRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryAssessment"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_profiles/":{"get":{"operationId":"regulatory_profiles_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"pci_component_kind","schema":{"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","enum":["bespoke_or_custom_software","payment_page","system_component","third_party_software","unspecified"]},"description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},{"in":"query","name":"pci_public_facing_web_app","schema":{"type":"boolean"}},{"in":"query","name":"pci_scope","schema":{"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","enum":["cde","connected_or_security_impacting","not_assessed","out_of_scope"]},"description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},{"in":"query","name":"product","schema":{"type":"integer"}}],"tags":["regulatory_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRegulatoryProfileList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"regulatory_profiles_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["regulatory_profiles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryProfileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulatoryProfileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulatoryProfileRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_profiles/{id}/":{"get":{"operationId":"regulatory_profiles_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory profile.","required":true}],"tags":["regulatory_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"regulatory_profiles_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory profile.","required":true}],"tags":["regulatory_profiles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryProfileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulatoryProfileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulatoryProfileRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"regulatory_profiles_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory profile.","required":true}],"tags":["regulatory_profiles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryProfileRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryProfileRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryProfileRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"regulatory_profiles_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory profile.","required":true}],"tags":["regulatory_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_profiles/{id}/confirm_scope/":{"post":{"operationId":"regulatory_profiles_confirm_scope_create","description":"Record that this product's PCI DSS scope was confirmed today by the requesting user.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory profile.","required":true}],"tags":["regulatory_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_profiles/{id}/history/":{"get":{"operationId":"regulatory_profiles_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory profile.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"pci_component_kind","schema":{"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","enum":["bespoke_or_custom_software","payment_page","system_component","third_party_software","unspecified"]},"description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},{"in":"query","name":"pci_public_facing_web_app","schema":{"type":"boolean"}},{"in":"query","name":"pci_scope","schema":{"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","enum":["cde","connected_or_security_impacting","not_assessed","out_of_scope"]},"description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},{"in":"query","name":"product","schema":{"type":"integer"}}],"tags":["regulatory_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_profiles/{id}/history/legacy/":{"get":{"operationId":"regulatory_profiles_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory profile.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"pci_component_kind","schema":{"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","enum":["bespoke_or_custom_software","payment_page","system_component","third_party_software","unspecified"]},"description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},{"in":"query","name":"pci_public_facing_web_app","schema":{"type":"boolean"}},{"in":"query","name":"pci_scope","schema":{"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","enum":["cde","connected_or_security_impacting","not_assessed","out_of_scope"]},"description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},{"in":"query","name":"product","schema":{"type":"integer"}}],"tags":["regulatory_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_profiles/{id}/history/legacy/count/":{"get":{"operationId":"regulatory_profiles_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory profile.","required":true}],"tags":["regulatory_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_profiles/inventory/":{"get":{"operationId":"regulatory_profiles_inventory_retrieve","description":"Download the PCI scope inventory (Requirement 12.5.1) as CSV: every product the user can view, with its scope, component kind, public-facing flag, business criticality, SLA configuration, owner and last scope-confirmation date.","tags":["regulatory_profiles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"text/csv":{"schema":{"type":"string","format":"binary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/":{"get":{"operationId":"regulatory_reports_list","description":"CRA Article 14 regulatory reports.\n\nA person starts a report (POST), and every later change to a statutory fact goes through a\ndedicated, audited action: ``awareness`` (PATCH), ``corrective-measure`` (POST) and\n``stages/<stage>/submission`` (POST). ``package`` renders what the person takes to the\nreporting platform; ``audit-events`` is the report's append-only ledger. Nothing here\nsubmits anything to a regulator.\n\nThere is no DELETE and no PUT: a statutory record is corrected through the audited\nactions, never rewritten or removed through the API. Reads need Product_View on the\nreport's product, writes Product_Edit, and list/retrieve are scoped by product.","parameters":[{"in":"query","name":"advisory","schema":{"type":"integer"}},{"in":"query","name":"created_at__gte","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_at__lte","schema":{"type":"string","format":"date-time"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"open","schema":{"type":"boolean"},"description":"true: at least one stage is still pending; false: every stage is submitted."},{"in":"query","name":"overdue","schema":{"type":"boolean"},"description":"true: at least one pending stage is past its statutory deadline."},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"reference_code","schema":{"type":"string"}},{"in":"query","name":"reference_code__icontains","schema":{"type":"string"}},{"in":"query","name":"regime","schema":{"type":"string","x-spec-enum-id":"dba0969d08d6cd4a","enum":["exploited_vulnerability","severe_incident"]},"description":"Which Article 14 reporting regime this report falls under.\n\n* `exploited_vulnerability` - Actively exploited vulnerability\n* `severe_incident` - Severe incident"},{"in":"query","name":"sensitivity","schema":{"type":"string","x-spec-enum-id":"57fcd6a05eeafea4","enum":["restricted","standard"]},"description":"Sensitivity classification of this report's contents.\n\n* `standard` - Standard\n* `restricted` - Restricted"}],"tags":["regulatory_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRegulatoryReportList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"regulatory_reports_create","description":"CRA Article 14 regulatory reports.\n\nA person starts a report (POST), and every later change to a statutory fact goes through a\ndedicated, audited action: ``awareness`` (PATCH), ``corrective-measure`` (POST) and\n``stages/<stage>/submission`` (POST). ``package`` renders what the person takes to the\nreporting platform; ``audit-events`` is the report's append-only ledger. Nothing here\nsubmits anything to a regulator.\n\nThere is no DELETE and no PUT: a statutory record is corrected through the audited\nactions, never rewritten or removed through the API. Reads need Product_View on the\nreport's product, writes Product_Edit, and list/retrieve are scoped by product.","tags":["regulatory_reports"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/{id}/":{"get":{"operationId":"regulatory_reports_retrieve","description":"CRA Article 14 regulatory reports.\n\nA person starts a report (POST), and every later change to a statutory fact goes through a\ndedicated, audited action: ``awareness`` (PATCH), ``corrective-measure`` (POST) and\n``stages/<stage>/submission`` (POST). ``package`` renders what the person takes to the\nreporting platform; ``audit-events`` is the report's append-only ledger. Nothing here\nsubmits anything to a regulator.\n\nThere is no DELETE and no PUT: a statutory record is corrected through the audited\nactions, never rewritten or removed through the API. Reads need Product_View on the\nreport's product, writes Product_Edit, and list/retrieve are scoped by product.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory report.","required":true}],"tags":["regulatory_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"regulatory_reports_partial_update","description":"CRA Article 14 regulatory reports.\n\nA person starts a report (POST), and every later change to a statutory fact goes through a\ndedicated, audited action: ``awareness`` (PATCH), ``corrective-measure`` (POST) and\n``stages/<stage>/submission`` (POST). ``package`` renders what the person takes to the\nreporting platform; ``audit-events`` is the report's append-only ledger. Nothing here\nsubmits anything to a regulator.\n\nThere is no DELETE and no PUT: a statutory record is corrected through the audited\nactions, never rewritten or removed through the API. Reads need Product_View on the\nreport's product, writes Product_Edit, and list/retrieve are scoped by product.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory report.","required":true}],"tags":["regulatory_reports"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryReportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryReportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryReportRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/{id}/audit-events/":{"get":{"operationId":"regulatory_reports_audit_events_retrieve","description":"CRA Article 14 regulatory reports.\n\nA person starts a report (POST), and every later change to a statutory fact goes through a\ndedicated, audited action: ``awareness`` (PATCH), ``corrective-measure`` (POST) and\n``stages/<stage>/submission`` (POST). ``package`` renders what the person takes to the\nreporting platform; ``audit-events`` is the report's append-only ledger. Nothing here\nsubmits anything to a regulator.\n\nThere is no DELETE and no PUT: a statutory record is corrected through the audited\nactions, never rewritten or removed through the API. Reads need Product_View on the\nreport's product, writes Product_Edit, and list/retrieve are scoped by product.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory report.","required":true}],"tags":["regulatory_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/{id}/awareness/":{"patch":{"operationId":"regulatory_reports_awareness_partial_update","description":"CRA Article 14 regulatory reports.\n\nA person starts a report (POST), and every later change to a statutory fact goes through a\ndedicated, audited action: ``awareness`` (PATCH), ``corrective-measure`` (POST) and\n``stages/<stage>/submission`` (POST). ``package`` renders what the person takes to the\nreporting platform; ``audit-events`` is the report's append-only ledger. Nothing here\nsubmits anything to a regulator.\n\nThere is no DELETE and no PUT: a statutory record is corrected through the audited\nactions, never rewritten or removed through the API. Reads need Product_View on the\nreport's product, writes Product_Edit, and list/retrieve are scoped by product.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory report.","required":true}],"tags":["regulatory_reports"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryReportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryReportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedRegulatoryReportRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/{id}/corrective-measure/":{"post":{"operationId":"regulatory_reports_corrective_measure_create","description":"CRA Article 14 regulatory reports.\n\nA person starts a report (POST), and every later change to a statutory fact goes through a\ndedicated, audited action: ``awareness`` (PATCH), ``corrective-measure`` (POST) and\n``stages/<stage>/submission`` (POST). ``package`` renders what the person takes to the\nreporting platform; ``audit-events`` is the report's append-only ledger. Nothing here\nsubmits anything to a regulator.\n\nThere is no DELETE and no PUT: a statutory record is corrected through the audited\nactions, never rewritten or removed through the API. Reads need Product_View on the\nreport's product, writes Product_Edit, and list/retrieve are scoped by product.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory report.","required":true}],"tags":["regulatory_reports"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/{id}/history/":{"get":{"operationId":"regulatory_reports_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"advisory","schema":{"type":"integer"}},{"in":"query","name":"created_at__gte","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_at__lte","schema":{"type":"string","format":"date-time"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory report.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"open","schema":{"type":"boolean"},"description":"true: at least one stage is still pending; false: every stage is submitted."},{"in":"query","name":"overdue","schema":{"type":"boolean"},"description":"true: at least one pending stage is past its statutory deadline."},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"reference_code","schema":{"type":"string"}},{"in":"query","name":"reference_code__icontains","schema":{"type":"string"}},{"in":"query","name":"regime","schema":{"type":"string","x-spec-enum-id":"dba0969d08d6cd4a","enum":["exploited_vulnerability","severe_incident"]},"description":"Which Article 14 reporting regime this report falls under.\n\n* `exploited_vulnerability` - Actively exploited vulnerability\n* `severe_incident` - Severe incident"},{"in":"query","name":"sensitivity","schema":{"type":"string","x-spec-enum-id":"57fcd6a05eeafea4","enum":["restricted","standard"]},"description":"Sensitivity classification of this report's contents.\n\n* `standard` - Standard\n* `restricted` - Restricted"}],"tags":["regulatory_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/{id}/history/legacy/":{"get":{"operationId":"regulatory_reports_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"advisory","schema":{"type":"integer"}},{"in":"query","name":"created_at__gte","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_at__lte","schema":{"type":"string","format":"date-time"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory report.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"open","schema":{"type":"boolean"},"description":"true: at least one stage is still pending; false: every stage is submitted."},{"in":"query","name":"overdue","schema":{"type":"boolean"},"description":"true: at least one pending stage is past its statutory deadline."},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"reference_code","schema":{"type":"string"}},{"in":"query","name":"reference_code__icontains","schema":{"type":"string"}},{"in":"query","name":"regime","schema":{"type":"string","x-spec-enum-id":"dba0969d08d6cd4a","enum":["exploited_vulnerability","severe_incident"]},"description":"Which Article 14 reporting regime this report falls under.\n\n* `exploited_vulnerability` - Actively exploited vulnerability\n* `severe_incident` - Severe incident"},{"in":"query","name":"sensitivity","schema":{"type":"string","x-spec-enum-id":"57fcd6a05eeafea4","enum":["restricted","standard"]},"description":"Sensitivity classification of this report's contents.\n\n* `standard` - Standard\n* `restricted` - Restricted"}],"tags":["regulatory_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/{id}/history/legacy/count/":{"get":{"operationId":"regulatory_reports_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory report.","required":true}],"tags":["regulatory_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/{id}/package/":{"get":{"operationId":"regulatory_reports_package_retrieve","description":"CRA Article 14 regulatory reports.\n\nA person starts a report (POST), and every later change to a statutory fact goes through a\ndedicated, audited action: ``awareness`` (PATCH), ``corrective-measure`` (POST) and\n``stages/<stage>/submission`` (POST). ``package`` renders what the person takes to the\nreporting platform; ``audit-events`` is the report's append-only ledger. Nothing here\nsubmits anything to a regulator.\n\nThere is no DELETE and no PUT: a statutory record is corrected through the audited\nactions, never rewritten or removed through the API. Reads need Product_View on the\nreport's product, writes Product_Edit, and list/retrieve are scoped by product.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory report.","required":true}],"tags":["regulatory_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/{id}/stages/{stage}/submission/":{"post":{"operationId":"regulatory_reports_stages_submission_create","description":"CRA Article 14 regulatory reports.\n\nA person starts a report (POST), and every later change to a statutory fact goes through a\ndedicated, audited action: ``awareness`` (PATCH), ``corrective-measure`` (POST) and\n``stages/<stage>/submission`` (POST). ``package`` renders what the person takes to the\nreporting platform; ``audit-events`` is the report's append-only ledger. Nothing here\nsubmits anything to a regulator.\n\nThere is no DELETE and no PUT: a statutory record is corrected through the audited\nactions, never rewritten or removed through the API. Reads need Product_View on the\nreport's product, writes Product_Edit, and list/retrieve are scoped by product.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this regulatory report.","required":true},{"in":"path","name":"stage","schema":{"type":"string","pattern":"^[a-z_]+$"},"required":true}],"tags":["regulatory_reports"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/exploited-findings/":{"get":{"operationId":"regulatory_reports_exploited_findings_retrieve","description":"Findings that warrant a CRA Article 14 early warning: ``?product=<id>`` or ``?finding=<id>``.\n\n``{count, results}``: open, known-exploited findings on a product in CRA scope (the first\n``suggestions.EXPLOITED_LIMIT``), each with the exploited-vulnerability reports already naming one of\nits ids. Works with or without PSIRT. Needs Product_View on the product.","tags":["regulatory_reports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/regulatory_reports/exploited-findings/seen/":{"post":{"operationId":"regulatory_reports_exploited_findings_seen_create","description":"Record, once per finding, that the Article 14 suggestion was shown: ``{\"finding_ids\": [...]}``.\n\nOne request for everything a page lists. Ids the caller cannot view, and findings that do not qualify,\nare left out of the answer and get nothing written: ``{\"recorded\": {\"<finding_id>\": \"<first seen>\"}}``.","tags":["regulatory_reports"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RegulatoryReportRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegulatoryReport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/reimport-scan/":{"post":{"operationId":"reimport_scan_create","description":"Answers a successful import that resolved a former name with the warning, and records it.\n\nThe permission class sets ``import_name_resolution`` (``pro/importers/api/permissions.py``,\n``pro/importers/sbom/permissions.py``) before anything else reads the names.","tags":["reimport-scan"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AsyncReImportScanRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AsyncReImportScan"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/reimport-scan/preview/":{"post":{"operationId":"reimport_scan_preview_create","description":"Parse a scan file against an existing test (by test id or engagement + scan_type) and return top-level reimport outcome counts without modifying the database.","summary":"Preview reimport scan","tags":["reimport-scan"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReImportPreviewRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReImportPreviewResponse"}}},"description":""},"400":{"description":"Invalid payload, test/product not found, or engagement criteria could not be resolved."},"401":{"description":"Not authenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Import preview is disabled for this site or the user lacks access.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/":{"get":{"operationId":"remediation_actions_list","parameters":[{"in":"query","name":"action_type","schema":{"type":"string"},"description":"Comma-separated action types."},{"in":"query","name":"action_type_not","schema":{"type":"string"}},{"in":"query","name":"assigned_to_me","schema":{"type":"boolean"},"description":"Only actions assigned to me."},{"in":"query","name":"assignee","schema":{"type":"array","items":{"type":"number"}},"description":"Assignee user ids.","explode":false,"style":"form"},{"in":"query","name":"assignee_not","schema":{"type":"string"}},{"in":"query","name":"campaign","schema":{"type":"array","items":{"type":"number"}},"description":"Campaign ids.","explode":false,"style":"form"},{"in":"query","name":"campaign_not","schema":{"type":"string"}},{"in":"query","name":"component_name_contains","schema":{"type":"string"}},{"in":"query","name":"component_name_ends_with","schema":{"type":"string"}},{"in":"query","name":"component_name_exact","schema":{"type":"string"}},{"in":"query","name":"component_name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"component_name_not_contains","schema":{"type":"string"}},{"in":"query","name":"component_name_not_exact","schema":{"type":"string"}},{"in":"query","name":"component_name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"component_name_not_regex","schema":{"type":"string"}},{"in":"query","name":"component_name_regex","schema":{"type":"string"}},{"in":"query","name":"component_name_starts_with","schema":{"type":"string"}},{"in":"query","name":"created_at_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_at_during","schema":{"type":"string"}},{"in":"query","name":"created_at_on","schema":{"type":"string"}},{"in":"query","name":"created_at_past_days","schema":{"type":"number"}},{"in":"query","name":"cve_count_equals","schema":{"type":"integer"}},{"in":"query","name":"cve_count_greater_than","schema":{"type":"integer"}},{"in":"query","name":"cve_count_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"cve_count_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"cve_count_less_than","schema":{"type":"integer"}},{"in":"query","name":"cve_count_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"cve_count_not_equals","schema":{"type":"integer"}},{"in":"query","name":"cve_count_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"due_date_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"due_date_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"due_date_during","schema":{"type":"string"}},{"in":"query","name":"due_date_on","schema":{"type":"string"}},{"in":"query","name":"due_date_past_days","schema":{"type":"number"}},{"in":"query","name":"finding","schema":{"type":"number"},"description":"The action that resolves this finding."},{"in":"query","name":"has_ticket","schema":{"type":"boolean"},"description":"Only actions with a linked ticket."},{"in":"query","name":"is_manual","schema":{"type":"boolean"}},{"in":"query","name":"known_exploited","schema":{"type":"boolean"},"description":"Only actions with KEV findings."},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"max_priority_equals","schema":{"type":"number","format":"float"}},{"in":"query","name":"max_priority_greater_than","schema":{"type":"number","format":"float"}},{"in":"query","name":"max_priority_greater_than_equal_to","schema":{"type":"number","format":"float"}},{"in":"query","name":"max_priority_in","schema":{"type":"array","items":{"type":"number","format":"float"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"max_priority_less_than","schema":{"type":"number","format":"float"}},{"in":"query","name":"max_priority_less_than_equal_to","schema":{"type":"number","format":"float"}},{"in":"query","name":"max_priority_not_equals","schema":{"type":"number","format":"float"}},{"in":"query","name":"max_priority_not_in","schema":{"type":"array","items":{"type":"number","format":"float"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"max_risk","schema":{"type":"string"},"description":"Comma-separated risk levels."},{"in":"query","name":"max_risk_not","schema":{"type":"string"}},{"in":"query","name":"max_severity","schema":{"type":"string"},"description":"Comma-separated severities."},{"in":"query","name":"max_severity_not","schema":{"type":"string"}},{"in":"query","name":"my_teams","schema":{"type":"boolean"},"description":"Actions assigned to me or owned by my teams."},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-action_type","-assignee","-created_at","-cve_count","-due_date","-max_priority","-max_risk","-max_risk_score","-max_severity","-open_findings","-owner_team","-product","-scope_label","-source_category","-status","-title","-total_findings","-updated_at","action_type","assignee","created_at","cve_count","due_date","max_priority","max_risk","max_risk_score","max_severity","open_findings","owner_team","product","scope_label","source_category","status","title","total_findings","updated_at"]}},"description":"Sort order. Sorting by title follows the stored title (the instance language), which can differ from the title rendered in the reader's language.\n\n* `due_date` - Due date\n* `-due_date` - Due date (descending)\n* `title` - Title\n* `-title` - Title (descending)\n* `open_findings` - Open findings\n* `-open_findings` - Open findings (descending)\n* `total_findings` - Total findings\n* `-total_findings` - Total findings (descending)\n* `cve_count` - Cve count\n* `-cve_count` - Cve count (descending)\n* `max_priority` - Max priority\n* `-max_priority` - Max priority (descending)\n* `max_severity` - Max severity\n* `-max_severity` - Max severity (descending)\n* `max_risk` - Max risk\n* `-max_risk` - Max risk (descending)\n* `max_risk_score` - Max risk score\n* `-max_risk_score` - Max risk score (descending)\n* `status` - Status\n* `-status` - Status (descending)\n* `action_type` - Action type\n* `-action_type` - Action type (descending)\n* `source_category` - Source category\n* `-source_category` - Source category (descending)\n* `scope_label` - Scope label\n* `-scope_label` - Scope label (descending)\n* `product` - Product\n* `-product` - Product (descending)\n* `assignee` - Assignee\n* `-assignee` - Assignee (descending)\n* `owner_team` - Owner team\n* `-owner_team` - Owner team (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"open_findings_equals","schema":{"type":"integer"}},{"in":"query","name":"open_findings_greater_than","schema":{"type":"integer"}},{"in":"query","name":"open_findings_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"open_findings_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"open_findings_less_than","schema":{"type":"integer"}},{"in":"query","name":"open_findings_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"open_findings_not_equals","schema":{"type":"integer"}},{"in":"query","name":"open_findings_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"owner_team","schema":{"type":"array","items":{"type":"number"}},"description":"Owning team (group) ids.","explode":false,"style":"form"},{"in":"query","name":"owner_team_not","schema":{"type":"string"}},{"in":"query","name":"prod_type","schema":{"type":"array","items":{"type":"number"}},"description":"Comma-separated ids, matched against organization.id.","explode":false,"style":"form"},{"in":"query","name":"prod_type_not","schema":{"type":"string"}},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"number"}},"description":"Comma-separated ids, matched against product.id.","explode":false,"style":"form"},{"in":"query","name":"product_not","schema":{"type":"string"}},{"in":"query","name":"scope_detail_contains","schema":{"type":"string"}},{"in":"query","name":"scope_detail_ends_with","schema":{"type":"string"}},{"in":"query","name":"scope_detail_exact","schema":{"type":"string"}},{"in":"query","name":"scope_detail_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"scope_detail_not_contains","schema":{"type":"string"}},{"in":"query","name":"scope_detail_not_exact","schema":{"type":"string"}},{"in":"query","name":"scope_detail_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"scope_detail_not_regex","schema":{"type":"string"}},{"in":"query","name":"scope_detail_regex","schema":{"type":"string"}},{"in":"query","name":"scope_detail_starts_with","schema":{"type":"string"}},{"in":"query","name":"scope_label_contains","schema":{"type":"string"}},{"in":"query","name":"scope_label_ends_with","schema":{"type":"string"}},{"in":"query","name":"scope_label_exact","schema":{"type":"string"}},{"in":"query","name":"scope_label_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"scope_label_not_contains","schema":{"type":"string"}},{"in":"query","name":"scope_label_not_exact","schema":{"type":"string"}},{"in":"query","name":"scope_label_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"scope_label_not_regex","schema":{"type":"string"}},{"in":"query","name":"scope_label_regex","schema":{"type":"string"}},{"in":"query","name":"scope_label_starts_with","schema":{"type":"string"}},{"in":"query","name":"scope_type","schema":{"type":"string"},"description":"Comma-separated scope types."},{"in":"query","name":"scope_type_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Keyword search across the title (stored and the words of the rendered title), location, component, ticket and the name of the parent product."},{"in":"query","name":"sla_state","schema":{"type":"string"},"description":"Comma-separated SLA states."},{"in":"query","name":"sla_state_not","schema":{"type":"string"}},{"in":"query","name":"source_category","schema":{"type":"string"},"description":"Comma-separated sources."},{"in":"query","name":"source_category_not","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"string"},"description":"Comma-separated statuses."},{"in":"query","name":"status_not","schema":{"type":"string"}},{"in":"query","name":"suppressed","schema":{"type":"boolean"}},{"in":"query","name":"target_version_contains","schema":{"type":"string"}},{"in":"query","name":"target_version_ends_with","schema":{"type":"string"}},{"in":"query","name":"target_version_exact","schema":{"type":"string"}},{"in":"query","name":"target_version_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"target_version_not_contains","schema":{"type":"string"}},{"in":"query","name":"target_version_not_exact","schema":{"type":"string"}},{"in":"query","name":"target_version_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"target_version_not_regex","schema":{"type":"string"}},{"in":"query","name":"target_version_regex","schema":{"type":"string"}},{"in":"query","name":"target_version_starts_with","schema":{"type":"string"}},{"in":"query","name":"ticket_contains","schema":{"type":"string"}},{"in":"query","name":"ticket_ends_with","schema":{"type":"string"}},{"in":"query","name":"ticket_exact","schema":{"type":"string"}},{"in":"query","name":"ticket_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"ticket_not_contains","schema":{"type":"string"}},{"in":"query","name":"ticket_not_exact","schema":{"type":"string"}},{"in":"query","name":"ticket_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"ticket_not_regex","schema":{"type":"string"}},{"in":"query","name":"ticket_regex","schema":{"type":"string"}},{"in":"query","name":"ticket_starts_with","schema":{"type":"string"}},{"in":"query","name":"title_contains","schema":{"type":"string"},"description":"Title contains, matching the stored title and the words of the rendered title."},{"in":"query","name":"title_ends_with","schema":{"type":"string"}},{"in":"query","name":"title_exact","schema":{"type":"string"}},{"in":"query","name":"title_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_contains","schema":{"type":"string"}},{"in":"query","name":"title_not_exact","schema":{"type":"string"}},{"in":"query","name":"title_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_regex","schema":{"type":"string"}},{"in":"query","name":"title_regex","schema":{"type":"string"}},{"in":"query","name":"title_starts_with","schema":{"type":"string"}},{"in":"query","name":"unassigned","schema":{"type":"boolean"},"description":"Only unassigned actions."}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedActionListList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/":{"get":{"operationId":"remediation_actions_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/activity/":{"get":{"operationId":"remediation_actions_activity_list","description":"The timeline, newest first. Paginated (``limit``/``offset``, with ``count``).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedActivityList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/assign/":{"post":{"operationId":"remediation_actions_assign_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssignRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssignRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/comment/":{"post":{"operationId":"remediation_actions_comment_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/CommentRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/CommentRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Activity"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/edit/":{"post":{"operationId":"remediation_actions_edit_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EditRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EditRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/findings/":{"get":{"operationId":"remediation_actions_findings_list","description":"The findings this action resolves: ``state`` open (default), closed or all.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"state","schema":{"type":"string","enum":["all","closed","open"]}}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedMemberFindingList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/merge/":{"post":{"operationId":"remediation_actions_merge_create","description":"Fold other actions on the same asset into this one.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/MergeRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/MergeRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/move/":{"post":{"operationId":"remediation_actions_move_create","description":"Move findings (from any action on the same asset) into this one.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingsRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingsRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingsRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationMoveResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/regroup/":{"post":{"operationId":"remediation_actions_regroup_create","description":"Hand this action's findings back to the grouping rules.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationRegroupResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/reset/":{"post":{"operationId":"remediation_actions_reset_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ResetRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ResetRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/siblings/":{"get":{"operationId":"remediation_actions_siblings_list","description":"Other open actions on the same asset: the targets a merge or a move can choose from.\n\nOnly work that is still to do: not complete, not suppressed, with open findings.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Keyword search over title and location."}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedActionListList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/split/":{"post":{"operationId":"remediation_actions_split_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingsRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FindingsRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FindingsRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationSplitResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/status/":{"post":{"operationId":"remediation_actions_status_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/StatusRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/StatusRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/suppress/":{"post":{"operationId":"remediation_actions_suppress_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuppressRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SuppressRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SuppressRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/team/":{"post":{"operationId":"remediation_actions_team_create","description":"Set the owning team by hand (``null`` hands it back to the owners of the findings).\n\nThe team must be one the caller can see and one whose role lets it see the asset. Every\nfailure gets the same answer and no group name, so the endpoint cannot be used to list\ngroups or to learn which groups have access to what.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TeamRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TeamRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/ticket/":{"post":{"operationId":"remediation_actions_ticket_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TicketRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TicketRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/ticket_text/":{"get":{"operationId":"remediation_actions_ticket_text_retrieve","description":"A ticket body for this action, ready to paste into any tracker.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationTicketText"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/{id}/unsuppress/":{"post":{"operationId":"remediation_actions_unsuppress_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation action.","required":true}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/bulk_assign/":{"post":{"operationId":"remediation_actions_bulk_assign_create","tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkAssignRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BulkAssignRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BulkAssignRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationBulkUpdateResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/bulk_status/":{"post":{"operationId":"remediation_actions_bulk_status_create","tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkStatusRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BulkStatusRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BulkStatusRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationBulkUpdateResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/export/":{"get":{"operationId":"remediation_actions_export_retrieve","description":"The filtered queue as CSV, XLSX or JSON, one row per action and finding, in the queue's order.\n\nSorted like the queue: by ``o`` when given, else the queue's natural order. A limit that cuts\nthe export short is marked (a final row in CSV and XLSX, ``\"truncated\": true`` in JSON).","parameters":[{"in":"query","name":"export_format","schema":{"type":"string","enum":["csv","json","xlsx"]}},{"in":"query","name":"include_closed","schema":{"type":"boolean"},"description":"Also export the closed findings."}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"text/csv":{"schema":{"type":"string","format":"binary"}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/meta/":{"get":{"operationId":"remediation_actions_meta_retrieve","description":"Choice lists (in the reader's language), the SLA windows, and what this user may manage.","tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/recompute/":{"post":{"operationId":"remediation_actions_recompute_create","description":"Regroup now: one asset (``product``), or every asset for someone who manages them all.","tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecomputeRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RecomputeRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RecomputeRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationRecomputeResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_actions/summary/":{"get":{"operationId":"remediation_actions_summary_retrieve","description":"Overview numbers and charts over the filtered open queue.","parameters":[{"in":"query","name":"sankey_target","schema":{"type":"string","enum":["asset","organization","risk","sla_state","status","team"]}},{"in":"query","name":"sections","schema":{"type":"string"},"description":"kpis: only the numbers, no charts."}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_campaigns/":{"get":{"operationId":"remediation_campaigns_list","parameters":[{"in":"query","name":"action_count_equals","schema":{"type":"number"}},{"in":"query","name":"action_count_greater_than","schema":{"type":"number"}},{"in":"query","name":"action_count_greater_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"action_count_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"action_count_less_than","schema":{"type":"number"}},{"in":"query","name":"action_count_less_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"action_count_not_equals","schema":{"type":"number"}},{"in":"query","name":"action_count_not_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"action_type","schema":{"type":"string"},"description":"Comma-separated action types."},{"in":"query","name":"action_type_not","schema":{"type":"string"}},{"in":"query","name":"active","schema":{"type":"boolean"},"description":"Only campaigns with open actions."},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-action_count","-asset_count","-created_at","-due_date","-max_risk","-open_action_count","-open_findings","-overdue_count","-title","action_count","asset_count","created_at","due_date","max_risk","open_action_count","open_findings","overdue_count","title"]}},"description":"Sort order. Sorting by title follows the stored title (the instance language), which can differ from the title rendered in the reader's language.\n\n* `title` - Title\n* `-title` - Title (descending)\n* `action_count` - Action count\n* `-action_count` - Action count (descending)\n* `open_action_count` - Open action count\n* `-open_action_count` - Open action count (descending)\n* `asset_count` - Asset count\n* `-asset_count` - Asset count (descending)\n* `open_findings` - Open findings\n* `-open_findings` - Open findings (descending)\n* `due_date` - Due date\n* `-due_date` - Due date (descending)\n* `overdue_count` - Overdue count\n* `-overdue_count` - Overdue count (descending)\n* `max_risk` - Max risk\n* `-max_risk` - Max risk (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"open_findings_equals","schema":{"type":"number"}},{"in":"query","name":"open_findings_greater_than","schema":{"type":"number"}},{"in":"query","name":"open_findings_greater_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"open_findings_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"open_findings_less_than","schema":{"type":"number"}},{"in":"query","name":"open_findings_less_than_equal_to","schema":{"type":"number"}},{"in":"query","name":"open_findings_not_equals","schema":{"type":"number"}},{"in":"query","name":"open_findings_not_in","schema":{"type":"array","items":{"type":"number"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"},"description":"Keyword search across the title (stored and the words of the rendered title) and subject."},{"in":"query","name":"title_contains","schema":{"type":"string"}},{"in":"query","name":"title_ends_with","schema":{"type":"string"}},{"in":"query","name":"title_exact","schema":{"type":"string"}},{"in":"query","name":"title_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_contains","schema":{"type":"string"}},{"in":"query","name":"title_not_exact","schema":{"type":"string"}},{"in":"query","name":"title_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"title_not_regex","schema":{"type":"string"}},{"in":"query","name":"title_regex","schema":{"type":"string"}},{"in":"query","name":"title_starts_with","schema":{"type":"string"}}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedCampaignList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_campaigns/{id}/":{"get":{"operationId":"remediation_campaigns_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this remediation campaign.","required":true}],"tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Campaign"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_center_settings/":{"get":{"operationId":"remediation_center_settings_list","description":"Instance settings: SLA windows and due-date alerts. Anyone may read; administrators edit.","tags":["Remediation Center"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Settings"}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_center_settings/update/":{"patch":{"operationId":"remediation_center_settings_update_partial_update","description":"Instance settings: SLA windows and due-date alerts. Anyone may read; administrators edit.","tags":["Remediation Center"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedSettingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedSettingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedSettingsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_insights/average_time_to_remediation/":{"get":{"operationId":"remediation_insights_average_time_to_remediation_retrieve","description":"the average time taken for a finding to go from open to mitigated by date","tags":["remediation_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_insights/open_over_time/":{"get":{"operationId":"remediation_insights_open_over_time_retrieve","description":"the total number of findings opened by day since first finding creation","tags":["remediation_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_insights/past_sla_by_product/":{"get":{"operationId":"remediation_insights_past_sla_by_product_retrieve","description":"total number of non-mitigated findings past sla, grouped by product/product manager","tags":["remediation_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_insights/past_sla_by_product_type/":{"get":{"operationId":"remediation_insights_past_sla_by_product_type_retrieve","description":"total number of non-mitigated findings past sla, grouped by product type","tags":["remediation_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_insights/past_sla_by_severity_by_product/":{"get":{"operationId":"remediation_insights_past_sla_by_severity_by_product_retrieve","description":"total number of non-mitigated findings past sla by severity, grouped by product","tags":["remediation_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_insights/risk_accepted_over_time/":{"get":{"operationId":"remediation_insights_risk_accepted_over_time_retrieve","description":"total number of findings risk accepted over time by severity","tags":["remediation_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/remediation_insights/summary/":{"get":{"operationId":"remediation_insights_summary_retrieve","description":"basic metrics counts","tags":["remediation_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/":{"get":{"operationId":"report_blocks_list","parameters":[{"in":"query","name":"block_type","schema":{"type":"string"}},{"in":"query","name":"block_type_not","schema":{"type":"string"}},{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"created_by_not","schema":{"type":"string"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"header","schema":{"type":"string"}},{"in":"query","name":"header_contains","schema":{"type":"string"}},{"in":"query","name":"header_ends_with","schema":{"type":"string"}},{"in":"query","name":"header_exact","schema":{"type":"string"}},{"in":"query","name":"header_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"header_not_contains","schema":{"type":"string"}},{"in":"query","name":"header_not_exact","schema":{"type":"string"}},{"in":"query","name":"header_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"header_not_regex","schema":{"type":"string"}},{"in":"query","name":"header_regex","schema":{"type":"string"}},{"in":"query","name":"header_starts_with","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"is_system","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-block_type","-created","-created_by","-id","-name","-updated","block_type","created","created_by","id","name","updated"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `block_type` - Block type\n* `-block_type` - Block type (descending)\n* `created_by` - Created by\n* `-created_by` - Created by (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, block_type, created_by__username, created_by__first_name, created_by__last_name"},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["report_blocks"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProReportBlockListList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"report_blocks_create","tags":["report_blocks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/{id}/":{"get":{"operationId":"report_blocks_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Block.","required":true}],"tags":["report_blocks"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"report_blocks_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Block.","required":true}],"tags":["report_blocks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"report_blocks_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Block.","required":true}],"tags":["report_blocks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProReportBlockRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProReportBlockRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProReportBlockRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"report_blocks_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Block.","required":true}],"tags":["report_blocks"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/{id}/chart_data/":{"post":{"operationId":"report_blocks_chart_data_existing_create","description":"Aggregated series for a saved chart block — used to capture fresh snapshots at\ngeneration / template-preview time. Body may carry runtime_filters (Quick Report) and\nvariables (the template variables the report is being generated with).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Block.","required":true}],"tags":["report_blocks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/{id}/duplicate/":{"post":{"operationId":"report_blocks_duplicate_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Block.","required":true}],"tags":["report_blocks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/{id}/preview/":{"post":{"operationId":"report_blocks_preview_existing_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Block.","required":true}],"tags":["report_blocks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/{id}/widget_data/":{"post":{"operationId":"report_blocks_widget_data_existing_create","description":"Render-ready data for a saved widget block.\n\nBody may carry ``runtime_filters`` (Quick Report) and ``variables`` (the\ntemplate variables the report is generated with). The effective config\ntravels back with the data because after a runtime-filter merge or a\nvariable fill it is no longer the config the caller holds. Without\nvariables, a block whose filters wait on one returns ``data: null`` and\n``needs_variables`` rather than a figure over everything.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Block.","required":true}],"tags":["report_blocks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/chart_data/":{"post":{"operationId":"report_blocks_chart_data_create","description":"Aggregated series for a transient (unsaved) chart config — drives the config-form\nlive preview. Body: {model_choice, chart_key, filter_entries, runtime_filters?, variables?}.","tags":["report_blocks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/chart_options/":{"get":{"operationId":"report_blocks_chart_options_retrieve","description":"The catalog of available graphs for the chart-block config form.","tags":["report_blocks"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/field_options/":{"get":{"operationId":"report_blocks_field_options_retrieve","tags":["report_blocks"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/preview/":{"post":{"operationId":"report_blocks_preview_create","tags":["report_blocks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/widget_data/":{"post":{"operationId":"report_blocks_widget_data_create","description":"Render-ready data for a transient (unsaved) widget config.\n\nBody: ``{widget_configuration: {widget_type, config}, runtime_filters?, variables?}``.\nThe config arrives straight from a request body here, so unlike the\nsaved-block path it has not been through the widget's validator yet;\n``compute_widget_data`` runs it, which also fills defaults and clamps\nbounds exactly as saving a dashboard layout would.\n\n``variables`` fills template-variable tokens in the widget's filters.\nWithout them, a config whose filters wait on a variable is not computed:\nthe response carries ``data: null`` and ``needs_variables`` naming the\ntokens, which is what the block editor shows.","tags":["report_blocks"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportBlockRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_blocks/widget_options/":{"get":{"operationId":"report_blocks_widget_options_retrieve","description":"The dashboard widget kinds a report can contain.\n\nDrives the Widget-block picker. Each entry carries the widget's catalog\nlabel and description plus how a report draws it, so the picker can say\nwhat the reader will get.","tags":["report_blocks"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportBlock"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_schedules/":{"get":{"operationId":"report_schedules_list","description":"Standing report requests (``report_schedules/``).\n\nA schedule is what to run (template, format, filters) plus the cadence (a\n``SchedulingServiceSchedule`` registered with dd-orch, nested as ``schedule``). Each tick\ncreates an ordinary generated report as the schedule's creator, so the results appear in\n``generated_reports/`` like any other.\n\nNot gated on the ``scheduling_service`` feature flag: that flag only shows the All\nSchedules page, the Rules Engine attaches inline schedules without it, and the worker that\nfires triggers runs regardless. Gating here would make the flag a second, hidden switch on\nreporting.","parameters":[{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"created_by_not","schema":{"type":"string"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"file_format","schema":{"type":"string"}},{"in":"query","name":"file_format_not","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-created_by","-id","-name","-template_name","-updated","created","created_by","id","name","template_name","updated"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `template_name` - Template name\n* `-template_name` - Template name (descending)\n* `created_by` - Created by\n* `-created_by` - Created by (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, template__name"},{"in":"query","name":"template","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"template_name_contains","schema":{"type":"string"}},{"in":"query","name":"template_name_ends_with","schema":{"type":"string"}},{"in":"query","name":"template_name_exact","schema":{"type":"string"}},{"in":"query","name":"template_name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"template_name_not_contains","schema":{"type":"string"}},{"in":"query","name":"template_name_not_exact","schema":{"type":"string"}},{"in":"query","name":"template_name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"template_name_not_regex","schema":{"type":"string"}},{"in":"query","name":"template_name_regex","schema":{"type":"string"}},{"in":"query","name":"template_name_starts_with","schema":{"type":"string"}},{"in":"query","name":"template_not","schema":{"type":"string"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["report_schedules"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProReportScheduleList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"report_schedules_create","description":"Standing report requests (``report_schedules/``).\n\nA schedule is what to run (template, format, filters) plus the cadence (a\n``SchedulingServiceSchedule`` registered with dd-orch, nested as ``schedule``). Each tick\ncreates an ordinary generated report as the schedule's creator, so the results appear in\n``generated_reports/`` like any other.\n\nNot gated on the ``scheduling_service`` feature flag: that flag only shows the All\nSchedules page, the Rules Engine attaches inline schedules without it, and the worker that\nfires triggers runs regardless. Gating here would make the flag a second, hidden switch on\nreporting.","tags":["report_schedules"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportScheduleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportScheduleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportScheduleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportSchedule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_schedules/{id}/":{"get":{"operationId":"report_schedules_retrieve","description":"Standing report requests (``report_schedules/``).\n\nA schedule is what to run (template, format, filters) plus the cadence (a\n``SchedulingServiceSchedule`` registered with dd-orch, nested as ``schedule``). Each tick\ncreates an ordinary generated report as the schedule's creator, so the results appear in\n``generated_reports/`` like any other.\n\nNot gated on the ``scheduling_service`` feature flag: that flag only shows the All\nSchedules page, the Rules Engine attaches inline schedules without it, and the worker that\nfires triggers runs regardless. Gating here would make the flag a second, hidden switch on\nreporting.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Schedule.","required":true}],"tags":["report_schedules"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportSchedule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"report_schedules_partial_update","description":"Standing report requests (``report_schedules/``).\n\nA schedule is what to run (template, format, filters) plus the cadence (a\n``SchedulingServiceSchedule`` registered with dd-orch, nested as ``schedule``). Each tick\ncreates an ordinary generated report as the schedule's creator, so the results appear in\n``generated_reports/`` like any other.\n\nNot gated on the ``scheduling_service`` feature flag: that flag only shows the All\nSchedules page, the Rules Engine attaches inline schedules without it, and the worker that\nfires triggers runs regardless. Gating here would make the flag a second, hidden switch on\nreporting.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Schedule.","required":true}],"tags":["report_schedules"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProReportScheduleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProReportScheduleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProReportScheduleRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportSchedule"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"report_schedules_destroy","description":"Standing report requests (``report_schedules/``).\n\nA schedule is what to run (template, format, filters) plus the cadence (a\n``SchedulingServiceSchedule`` registered with dd-orch, nested as ``schedule``). Each tick\ncreates an ordinary generated report as the schedule's creator, so the results appear in\n``generated_reports/`` like any other.\n\nNot gated on the ``scheduling_service`` feature flag: that flag only shows the All\nSchedules page, the Rules Engine attaches inline schedules without it, and the worker that\nfires triggers runs regardless. Gating here would make the flag a second, hidden switch on\nreporting.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Schedule.","required":true}],"tags":["report_schedules"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_templates/":{"get":{"operationId":"report_templates_list","parameters":[{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"created_by_not","schema":{"type":"string"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"is_system","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-created_by","-description","-id","-name","-updated","created","created_by","description","id","name","updated"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `description` - Description\n* `-description` - Description (descending)\n* `created_by` - Created by\n* `-created_by` - Created by (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description, created_by__username, created_by__first_name, created_by__last_name"},{"in":"query","name":"theme","schema":{"type":"integer"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["report_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProReportTemplateListList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"report_templates_create","tags":["report_templates"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTemplate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_templates/{id}/":{"get":{"operationId":"report_templates_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Template.","required":true}],"tags":["report_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTemplate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"report_templates_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Template.","required":true}],"tags":["report_templates"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTemplate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"report_templates_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Template.","required":true}],"tags":["report_templates"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProReportTemplateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProReportTemplateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProReportTemplateRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTemplate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"report_templates_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Template.","required":true}],"tags":["report_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_templates/{id}/duplicate/":{"post":{"operationId":"report_templates_duplicate_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Template.","required":true}],"tags":["report_templates"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTemplate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_templates/{id}/preview/":{"post":{"operationId":"report_templates_preview_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Template.","required":true}],"tags":["report_templates"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportTemplateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTemplate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_templates/{id}/variables/":{"get":{"operationId":"report_templates_variables_retrieve","description":"The template variables a generation of this template has to supply.\n\n``{\"variables\": [\"finding\", \"vulnerability_id\"]}``, in catalog order. Empty for a template\nthat references none, which generates exactly as before. Computed on request rather than\non the list, since it reads every block's filters and text.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Template.","required":true}],"tags":["report_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTemplate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_templates/classic-migration-status/":{"get":{"operationId":"report_templates_classic_migration_status_retrieve","description":"How many classic templates exist, and how many have not been carried across.\n\nDrives both the deprecation banner's count and whether the migrate button is\nworth showing at all. `unmigrated` is name-based, matching what the migration\nitself considers already done.","tags":["report_templates"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassicMigrationStatus"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_templates/migrate-from-classic/":{"post":{"operationId":"report_templates_migrate_from_classic_create","description":"Convert saved classic report-engine templates into this engine. Omit template_ids to convert all of them. Safe to re-run: a classic template whose name already exists here is reported as already_migrated, not duplicated.","tags":["report_templates"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassicMigrationRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ClassicMigrationRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ClassicMigrationRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClassicMigrationSummary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_themes/":{"get":{"operationId":"report_themes_list","parameters":[{"in":"query","name":"accent_color","schema":{"type":"string"}},{"in":"query","name":"background_color","schema":{"type":"string"}},{"in":"query","name":"base_font_size","schema":{"type":"integer"}},{"in":"query","name":"created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_by","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"created_by_not","schema":{"type":"string"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"footer_image","schema":{"type":"integer"}},{"in":"query","name":"footer_text","schema":{"type":"string"}},{"in":"query","name":"footer_text_contains","schema":{"type":"string"}},{"in":"query","name":"footer_text_ends_with","schema":{"type":"string"}},{"in":"query","name":"footer_text_exact","schema":{"type":"string"}},{"in":"query","name":"footer_text_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"footer_text_not_contains","schema":{"type":"string"}},{"in":"query","name":"footer_text_not_exact","schema":{"type":"string"}},{"in":"query","name":"footer_text_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"footer_text_not_regex","schema":{"type":"string"}},{"in":"query","name":"footer_text_regex","schema":{"type":"string"}},{"in":"query","name":"footer_text_starts_with","schema":{"type":"string"}},{"in":"query","name":"header_image","schema":{"type":"integer"}},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-created_by","-footer_text","-id","-name","-updated","created","created_by","footer_text","id","name","updated"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `footer_text` - Footer text\n* `-footer_text` - Footer text (descending)\n* `created_by` - Created by\n* `-created_by` - Created by (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"primary_color","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, footer_text"},{"in":"query","name":"secondary_color","schema":{"type":"string"}},{"in":"query","name":"show_page_numbers","schema":{"type":"boolean"}},{"in":"query","name":"text_color","schema":{"type":"string"}},{"in":"query","name":"updated","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["report_themes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProReportThemeList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"report_themes_create","tags":["report_themes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportThemeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportThemeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportThemeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTheme"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/report_themes/{id}/":{"get":{"operationId":"report_themes_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Theme.","required":true}],"tags":["report_themes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTheme"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"report_themes_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Theme.","required":true}],"tags":["report_themes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportThemeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProReportThemeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProReportThemeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTheme"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"report_themes_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Theme.","required":true}],"tags":["report_themes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProReportThemeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProReportThemeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProReportThemeRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProReportTheme"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"report_themes_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Report Theme.","required":true}],"tags":["report_themes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/request_response_pairs/":{"get":{"operationId":"request_response_pairs_list","parameters":[{"in":"query","name":"finding","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["request_response_pairs"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedBurpRawRequestResponseMultiList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"request_response_pairs_create","tags":["request_response_pairs"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseMultiRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseMultiRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseMultiRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseMulti"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/request_response_pairs/{id}/":{"get":{"operationId":"request_response_pairs_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this burp raw request response.","required":true}],"tags":["request_response_pairs"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseMulti"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"request_response_pairs_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this burp raw request response.","required":true}],"tags":["request_response_pairs"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseMultiRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseMultiRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseMultiRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseMulti"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"request_response_pairs_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this burp raw request response.","required":true}],"tags":["request_response_pairs"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedBurpRawRequestResponseMultiRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedBurpRawRequestResponseMultiRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedBurpRawRequestResponseMultiRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BurpRawRequestResponseMulti"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"request_response_pairs_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this burp raw request response.","required":true}],"tags":["request_response_pairs"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/request_response_pairs/{id}/delete_preview/":{"get":{"operationId":"request_response_pairs_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this burp raw request response.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["request_response_pairs"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/response_evidence/":{"get":{"operationId":"response_evidence_list","description":"One row per finding showing the three response-policy facts with their sources, the dates, the resolved deadline and the outcome, plus a summary derived from the same rows. Set export=true to additionally freeze the payload to the artifact store with a SHA-256 digest.","summary":"Vulnerability response evidence","parameters":[{"in":"query","name":"end","schema":{"type":"string","format":"date"},"description":"Last detection date to include. Defaults to today."},{"in":"query","name":"export","schema":{"type":"boolean"},"description":"Freeze the payload to the artifact store and return its path, size and digest."},{"in":"query","name":"product","schema":{"type":"integer"},"description":"Limit to one asset."},{"in":"query","name":"product_type","schema":{"type":"integer"},"description":"Limit to one organization."},{"in":"query","name":"start","schema":{"type":"string","format":"date"},"description":"First detection date to include. Defaults to 1 January of the current year."}],"tags":["response_evidence"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/response_policies/":{"get":{"operationId":"response_policies_list","description":"Published response standards, as data a compliance owner can read and adjust.\n\nWritable, because a customer whose assessor reads the table differently has to be able to\ncorrect a cell without waiting for a release. Seeding never overwrites, so an edit survives\nupgrades.","parameters":[{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"standard","schema":{"type":"string"}},{"in":"query","name":"version","schema":{"type":"string"}}],"tags":["response_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedVulnerabilityResponsePolicyList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"response_policies_create","description":"Published response standards, as data a compliance owner can read and adjust.\n\nWritable, because a customer whose assessor reads the table differently has to be able to\ncorrect a cell without waiting for a release. Seeding never overwrites, so an edit survives\nupgrades.","tags":["response_policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VulnerabilityResponsePolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/VulnerabilityResponsePolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/VulnerabilityResponsePolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VulnerabilityResponsePolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/response_policies/{id}/":{"get":{"operationId":"response_policies_retrieve","description":"Published response standards, as data a compliance owner can read and adjust.\n\nWritable, because a customer whose assessor reads the table differently has to be able to\ncorrect a cell without waiting for a release. Seeding never overwrites, so an edit survives\nupgrades.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Vulnerability Response Policy.","required":true}],"tags":["response_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VulnerabilityResponsePolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"response_policies_update","description":"Published response standards, as data a compliance owner can read and adjust.\n\nWritable, because a customer whose assessor reads the table differently has to be able to\ncorrect a cell without waiting for a release. Seeding never overwrites, so an edit survives\nupgrades.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Vulnerability Response Policy.","required":true}],"tags":["response_policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VulnerabilityResponsePolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/VulnerabilityResponsePolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/VulnerabilityResponsePolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VulnerabilityResponsePolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"response_policies_partial_update","description":"Published response standards, as data a compliance owner can read and adjust.\n\nWritable, because a customer whose assessor reads the table differently has to be able to\ncorrect a cell without waiting for a release. Seeding never overwrites, so an edit survives\nupgrades.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Vulnerability Response Policy.","required":true}],"tags":["response_policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedVulnerabilityResponsePolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedVulnerabilityResponsePolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedVulnerabilityResponsePolicyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VulnerabilityResponsePolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"response_policies_destroy","description":"Published response standards, as data a compliance owner can read and adjust.\n\nWritable, because a customer whose assessor reads the table differently has to be able to\ncorrect a cell without waiting for a release. Seeding never overwrites, so an edit survives\nupgrades.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Vulnerability Response Policy.","required":true}],"tags":["response_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/response_timeframes/":{"get":{"operationId":"response_timeframes_list","parameters":[{"in":"query","name":"authorization_level","schema":{"type":"string"}},{"in":"query","name":"impact_level","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"policy","schema":{"type":"integer"}}],"tags":["response_timeframes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResponseTimeframeList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"response_timeframes_create","tags":["response_timeframes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseTimeframeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ResponseTimeframeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ResponseTimeframeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseTimeframe"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/response_timeframes/{id}/":{"get":{"operationId":"response_timeframes_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Response Timeframe.","required":true}],"tags":["response_timeframes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseTimeframe"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"response_timeframes_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Response Timeframe.","required":true}],"tags":["response_timeframes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseTimeframeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ResponseTimeframeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ResponseTimeframeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseTimeframe"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"response_timeframes_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Response Timeframe.","required":true}],"tags":["response_timeframes"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedResponseTimeframeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedResponseTimeframeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedResponseTimeframeRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseTimeframe"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"response_timeframes_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Response Timeframe.","required":true}],"tags":["response_timeframes"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/":{"get":{"operationId":"risk_acceptance_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"accepted_by","schema":{"type":"string"}},{"in":"query","name":"accepted_findings","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"decision","schema":{"type":"string","x-spec-enum-id":"8690fff015f0d4c3","enum":["A","F","M","T","V"]},"description":"Risk treatment decision by risk owner\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},{"in":"query","name":"decision_details","schema":{"type":"string"}},{"in":"query","name":"expiration_date","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiration_date_handled","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiration_date_warned","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiring_within_days","schema":{"type":"number"},"description":"Risk acceptances whose expiration date falls within this many days from now. Already-expired acceptances are excluded -- they are no longer expiring, they have expired, which is what workflow_state=expired finds."},{"in":"query","name":"finding_host","schema":{"type":"string"},"description":"Risk acceptances covering at least one finding whose host contains this value. Matches the host of the finding's location, or of its endpoint on installs that have not moved to locations."},{"in":"query","name":"is_global","schema":{"type":"boolean"},"description":"is_global"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"notes","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-expiration_date","-name","expiration_date","name"]}},"description":"Ordering\n\n* `name` - Name\n* `-name` - Name (descending)\n* `expiration_date` - Expiration date\n* `-expiration_date` - Expiration date (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"owner","schema":{"type":"integer"}},{"in":"query","name":"reactivate_expired","schema":{"type":"boolean"}},{"in":"query","name":"recommendation","schema":{"type":"string","x-spec-enum-id":"8690fff015f0d4c3","title":"Security Recommendation","enum":["A","F","M","T","V"]},"description":"Recommendation from the security team.\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},{"in":"query","name":"recommendation_details","schema":{"type":"string"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"restart_sla_expired","schema":{"type":"boolean"}},{"in":"query","name":"workflow_state","schema":{"type":"array","items":{"type":"string","enum":["active","approved","expired","proposed","rejected","under_review"]}},"description":"workflow_state\n\n* `proposed` - Proposed\n* `under_review` - Under Review\n* `approved` - Approved\n* `rejected` - Rejected\n* `active` - Active\n* `expired` - Expired","explode":true,"style":"form"}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedRiskAcceptanceList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"risk_acceptance_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["risk_acceptance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptanceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptanceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptanceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/":{"get":{"operationId":"risk_acceptance_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"risk_acceptance_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptanceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptanceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptanceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"risk_acceptance_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedRiskAcceptanceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedRiskAcceptanceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedRiskAcceptanceRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"risk_acceptance_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/delete_preview/":{"get":{"operationId":"risk_acceptance_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/download_proof/":{"get":{"operationId":"risk_acceptance_download_proof_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceProof"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/expire/":{"post":{"operationId":"risk_acceptance_expire_create","description":"Expire a risk acceptance now, instead of waiting for its expiration date.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceExpireRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceExpireRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceExpireRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAcceptance"}}},"description":""},"400":{"description":"Returned if the risk acceptance has already expired"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/finding_records/":{"get":{"operationId":"risk_acceptance_finding_records_list","description":"What this acceptance has covered, including findings that have since left it.\n\nNot the same list as the membership: that only holds what is covered *now*, and the\nfindings an expiry or a re-import removed are exactly the ones somebody asks about.\n\n**Paginated**, unlike the transitions endpoint beside it. A transition list is bounded by how\nmany times somebody moved one acceptance through its review; this one carries a row per\nfinding, and ``ledger.py`` batches its writes in thousands precisely because an acceptance\ncan cover tens of thousands of them. Returning the whole set made opening the Acceptance\nHistory tab on one of those a multi-megabyte response.","parameters":[{"in":"query","name":"accepted_by","schema":{"type":"string"}},{"in":"query","name":"accepted_findings","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"decision","schema":{"type":"string","x-spec-enum-id":"8690fff015f0d4c3","enum":["A","F","M","T","V"]},"description":"Risk treatment decision by risk owner\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},{"in":"query","name":"decision_details","schema":{"type":"string"}},{"in":"query","name":"expiration_date","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiration_date_handled","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiration_date_warned","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiring_within_days","schema":{"type":"number"},"description":"Risk acceptances whose expiration date falls within this many days from now. Already-expired acceptances are excluded -- they are no longer expiring, they have expired, which is what workflow_state=expired finds."},{"in":"query","name":"finding_host","schema":{"type":"string"},"description":"Risk acceptances covering at least one finding whose host contains this value. Matches the host of the finding's location, or of its endpoint on installs that have not moved to locations."},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true},{"in":"query","name":"is_global","schema":{"type":"boolean"},"description":"is_global"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"notes","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-expiration_date","-name","expiration_date","name"]}},"description":"Ordering\n\n* `name` - Name\n* `-name` - Name (descending)\n* `expiration_date` - Expiration date\n* `-expiration_date` - Expiration date (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"owner","schema":{"type":"integer"}},{"in":"query","name":"reactivate_expired","schema":{"type":"boolean"}},{"in":"query","name":"recommendation","schema":{"type":"string","x-spec-enum-id":"8690fff015f0d4c3","title":"Security Recommendation","enum":["A","F","M","T","V"]},"description":"Recommendation from the security team.\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},{"in":"query","name":"recommendation_details","schema":{"type":"string"}},{"in":"query","name":"restart_sla_expired","schema":{"type":"boolean"}},{"in":"query","name":"workflow_state","schema":{"type":"array","items":{"type":"string","enum":["active","approved","expired","proposed","rejected","under_review"]}},"description":"workflow_state\n\n* `proposed` - Proposed\n* `under_review` - Under Review\n* `approved` - Approved\n* `rejected` - Rejected\n* `active` - Active\n* `expired` - Expired","explode":true,"style":"form"}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRiskAcceptanceFindingRecordList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/history/":{"get":{"operationId":"risk_acceptance_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"accepted_by","schema":{"type":"string"}},{"in":"query","name":"accepted_findings","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"decision","schema":{"type":"string","x-spec-enum-id":"8690fff015f0d4c3","enum":["A","F","M","T","V"]},"description":"Risk treatment decision by risk owner\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},{"in":"query","name":"decision_details","schema":{"type":"string"}},{"in":"query","name":"expiration_date","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiration_date_handled","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiration_date_warned","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiring_within_days","schema":{"type":"number"},"description":"Risk acceptances whose expiration date falls within this many days from now. Already-expired acceptances are excluded -- they are no longer expiring, they have expired, which is what workflow_state=expired finds."},{"in":"query","name":"finding_host","schema":{"type":"string"},"description":"Risk acceptances covering at least one finding whose host contains this value. Matches the host of the finding's location, or of its endpoint on installs that have not moved to locations."},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true},{"in":"query","name":"is_global","schema":{"type":"boolean"},"description":"is_global"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"notes","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-expiration_date","-name","expiration_date","name"]}},"description":"Ordering\n\n* `name` - Name\n* `-name` - Name (descending)\n* `expiration_date` - Expiration date\n* `-expiration_date` - Expiration date (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"owner","schema":{"type":"integer"}},{"in":"query","name":"reactivate_expired","schema":{"type":"boolean"}},{"in":"query","name":"recommendation","schema":{"type":"string","x-spec-enum-id":"8690fff015f0d4c3","title":"Security Recommendation","enum":["A","F","M","T","V"]},"description":"Recommendation from the security team.\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},{"in":"query","name":"recommendation_details","schema":{"type":"string"}},{"in":"query","name":"restart_sla_expired","schema":{"type":"boolean"}},{"in":"query","name":"workflow_state","schema":{"type":"array","items":{"type":"string","enum":["active","approved","expired","proposed","rejected","under_review"]}},"description":"workflow_state\n\n* `proposed` - Proposed\n* `under_review` - Under Review\n* `approved` - Approved\n* `rejected` - Rejected\n* `active` - Active\n* `expired` - Expired","explode":true,"style":"form"}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/history/legacy/":{"get":{"operationId":"risk_acceptance_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"accepted_by","schema":{"type":"string"}},{"in":"query","name":"accepted_findings","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"decision","schema":{"type":"string","x-spec-enum-id":"8690fff015f0d4c3","enum":["A","F","M","T","V"]},"description":"Risk treatment decision by risk owner\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},{"in":"query","name":"decision_details","schema":{"type":"string"}},{"in":"query","name":"expiration_date","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiration_date_handled","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiration_date_warned","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiring_within_days","schema":{"type":"number"},"description":"Risk acceptances whose expiration date falls within this many days from now. Already-expired acceptances are excluded -- they are no longer expiring, they have expired, which is what workflow_state=expired finds."},{"in":"query","name":"finding_host","schema":{"type":"string"},"description":"Risk acceptances covering at least one finding whose host contains this value. Matches the host of the finding's location, or of its endpoint on installs that have not moved to locations."},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true},{"in":"query","name":"is_global","schema":{"type":"boolean"},"description":"is_global"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"notes","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-expiration_date","-name","expiration_date","name"]}},"description":"Ordering\n\n* `name` - Name\n* `-name` - Name (descending)\n* `expiration_date` - Expiration date\n* `-expiration_date` - Expiration date (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"owner","schema":{"type":"integer"}},{"in":"query","name":"reactivate_expired","schema":{"type":"boolean"}},{"in":"query","name":"recommendation","schema":{"type":"string","x-spec-enum-id":"8690fff015f0d4c3","title":"Security Recommendation","enum":["A","F","M","T","V"]},"description":"Recommendation from the security team.\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},{"in":"query","name":"recommendation_details","schema":{"type":"string"}},{"in":"query","name":"restart_sla_expired","schema":{"type":"boolean"}},{"in":"query","name":"workflow_state","schema":{"type":"array","items":{"type":"string","enum":["active","approved","expired","proposed","rejected","under_review"]}},"description":"workflow_state\n\n* `proposed` - Proposed\n* `under_review` - Under Review\n* `approved` - Approved\n* `rejected` - Rejected\n* `active` - Active\n* `expired` - Expired","explode":true,"style":"form"}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/history/legacy/count/":{"get":{"operationId":"risk_acceptance_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/notes/":{"get":{"operationId":"risk_acceptance_notes_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceToNotes"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"risk_acceptance_notes_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Note"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/reinstate/":{"post":{"operationId":"risk_acceptance_reinstate_create","description":"Reinstating puts suppression back in place, so with the lifecycle on it needs an approver.\n\nOpen source treats reinstating as an edit, which is right when there is no review to\nrespect. With Risk Acceptances 2.0 on there is: EXPIRED -> ACTIVE requires the approve verb\nthrough the transition endpoint, and leaving this path edit-gated would make it the way\nround it. Somebody could then reinstate an acceptance they could not have approved.\n\nThe lifecycle state still converges either way -- see workflow.sync_with_expiry -- so this\nguards who may do it, not whether it is recorded.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptanceRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptanceRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptanceRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptance"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/state/":{"get":{"operationId":"risk_acceptance_state_retrieve","description":"Report the current workflow state and which moves are available from it.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceState"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/transition/":{"post":{"operationId":"risk_acceptance_transition_create","description":"Move a risk acceptance through its review.\n\nOne endpoint rather than six verb-shaped ones: which moves are legal already lives in\nthe state machine, so per-verb endpoints would restate it in a second place that could\ndisagree. Authorization still varies by target state -- see TRANSITION_PERMISSIONS.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceTransitionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceTransitionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceTransitionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceState"}}},"description":""},"400":{"description":"The move is not allowed from the risk acceptance's current state"},"403":{"description":"The user may not make this particular move","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/transitions/":{"get":{"operationId":"risk_acceptance_transitions_list","description":"The recorded moves, oldest first -- the approval chain an auditor reads.\n\nA separate read from ``state``: that one answers \"what can I do now\" and is fetched again\nafter every move, while this is the history and grows. Model ordering puts them\noldest-first, which is the order a decision history is read in.","parameters":[{"in":"query","name":"accepted_by","schema":{"type":"string"}},{"in":"query","name":"accepted_findings","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"decision","schema":{"type":"string","x-spec-enum-id":"8690fff015f0d4c3","enum":["A","F","M","T","V"]},"description":"Risk treatment decision by risk owner\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},{"in":"query","name":"decision_details","schema":{"type":"string"}},{"in":"query","name":"expiration_date","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiration_date_handled","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiration_date_warned","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"expiring_within_days","schema":{"type":"number"},"description":"Risk acceptances whose expiration date falls within this many days from now. Already-expired acceptances are excluded -- they are no longer expiring, they have expired, which is what workflow_state=expired finds."},{"in":"query","name":"finding_host","schema":{"type":"string"},"description":"Risk acceptances covering at least one finding whose host contains this value. Matches the host of the finding's location, or of its endpoint on installs that have not moved to locations."},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true},{"in":"query","name":"is_global","schema":{"type":"boolean"},"description":"is_global"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"notes","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-expiration_date","-name","expiration_date","name"]}},"description":"Ordering\n\n* `name` - Name\n* `-name` - Name (descending)\n* `expiration_date` - Expiration date\n* `-expiration_date` - Expiration date (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"owner","schema":{"type":"integer"}},{"in":"query","name":"reactivate_expired","schema":{"type":"boolean"}},{"in":"query","name":"recommendation","schema":{"type":"string","x-spec-enum-id":"8690fff015f0d4c3","title":"Security Recommendation","enum":["A","F","M","T","V"]},"description":"Recommendation from the security team.\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},{"in":"query","name":"recommendation_details","schema":{"type":"string"}},{"in":"query","name":"restart_sla_expired","schema":{"type":"boolean"}},{"in":"query","name":"workflow_state","schema":{"type":"array","items":{"type":"string","enum":["active","approved","expired","proposed","rejected","under_review"]}},"description":"workflow_state\n\n* `proposed` - Proposed\n* `under_review` - Under Review\n* `approved` - Approved\n* `rejected` - Rejected\n* `active` - Active\n* `expired` - Expired","explode":true,"style":"form"}],"tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRiskAcceptanceStateTransitionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/{id}/upload_proof/":{"post":{"operationId":"risk_acceptance_upload_proof_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this risk_ acceptance.","required":true}],"tags":["risk_acceptance"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptanceProofRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptanceProof"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/exception_metrics/":{"get":{"operationId":"risk_acceptance_exception_metrics_retrieve","description":"Report whether the exception backlog is being managed, for the acceptances you can see.\n\nA list-level action rather than a dashboard widget: the same numbers answer an auditor's\nquestion, feed a report and drive a panel, and computing them in one place is what stops\nthree surfaces quoting three different figures for \"how many are waiting\".","tags":["risk_acceptance"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"Counts and ages for the exception backlog"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/risk_acceptance/request/":{"post":{"operationId":"risk_acceptance_request_create","description":"Ask for findings to be accepted, without accepting them.\n\nIts own endpoint rather than create-then-transition, for two reasons. Creating a risk\nacceptance the ordinary way accepts its findings immediately -- which is the thing a\nrequest must not do -- and an ACTIVE acceptance deliberately cannot move back to PROPOSED,\nso there is no transition that would undo it.\n\nThe findings stay active and counted. What they gain is a pending record, so they can be\ntold apart from work nobody has looked at.","tags":["risk_acceptance"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RiskAcceptanceRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedRiskAcceptance"}}},"description":""},"400":{"description":"The request could not be created"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/roles/":{"get":{"operationId":"roles_list","description":"RBAC roles. Reads are open to any authenticated user (clients need the role\nlist for member dropdowns); writes (create/update/delete/clone) require a\nsuperuser or a global Owner. Built-in (is_system) roles are immutable.\n\n``ObjectHistoryMixin`` adds ``roles/{id}/history`` (pghistory): the role's own\nfield changes plus events of every tracked model that references it -- its\npermission grants (Role_Permission) and its assignments (Global_Role, members,\ngroups).","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"is_owner","schema":{"type":"boolean"}},{"in":"query","name":"is_system","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRoleList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"roles_create","description":"RBAC roles. Reads are open to any authenticated user (clients need the role\nlist for member dropdowns); writes (create/update/delete/clone) require a\nsuperuser or a global Owner. Built-in (is_system) roles are immutable.\n\n``ObjectHistoryMixin`` adds ``roles/{id}/history`` (pghistory): the role's own\nfield changes plus events of every tracked model that references it -- its\npermission grants (Role_Permission) and its assignments (Global_Role, members,\ngroups).","tags":["roles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RoleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RoleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/roles/{id}/":{"get":{"operationId":"roles_retrieve","description":"RBAC roles. Reads are open to any authenticated user (clients need the role\nlist for member dropdowns); writes (create/update/delete/clone) require a\nsuperuser or a global Owner. Built-in (is_system) roles are immutable.\n\n``ObjectHistoryMixin`` adds ``roles/{id}/history`` (pghistory): the role's own\nfield changes plus events of every tracked model that references it -- its\npermission grants (Role_Permission) and its assignments (Global_Role, members,\ngroups).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this role.","required":true}],"tags":["roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"roles_update","description":"RBAC roles. Reads are open to any authenticated user (clients need the role\nlist for member dropdowns); writes (create/update/delete/clone) require a\nsuperuser or a global Owner. Built-in (is_system) roles are immutable.\n\n``ObjectHistoryMixin`` adds ``roles/{id}/history`` (pghistory): the role's own\nfield changes plus events of every tracked model that references it -- its\npermission grants (Role_Permission) and its assignments (Global_Role, members,\ngroups).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this role.","required":true}],"tags":["roles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RoleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RoleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"roles_partial_update","description":"RBAC roles. Reads are open to any authenticated user (clients need the role\nlist for member dropdowns); writes (create/update/delete/clone) require a\nsuperuser or a global Owner. Built-in (is_system) roles are immutable.\n\n``ObjectHistoryMixin`` adds ``roles/{id}/history`` (pghistory): the role's own\nfield changes plus events of every tracked model that references it -- its\npermission grants (Role_Permission) and its assignments (Global_Role, members,\ngroups).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this role.","required":true}],"tags":["roles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedRoleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedRoleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedRoleRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"roles_destroy","description":"RBAC roles. Reads are open to any authenticated user (clients need the role\nlist for member dropdowns); writes (create/update/delete/clone) require a\nsuperuser or a global Owner. Built-in (is_system) roles are immutable.\n\n``ObjectHistoryMixin`` adds ``roles/{id}/history`` (pghistory): the role's own\nfield changes plus events of every tracked model that references it -- its\npermission grants (Role_Permission) and its assignments (Global_Role, members,\ngroups).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this role.","required":true}],"tags":["roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/roles/{id}/clone/":{"post":{"operationId":"roles_clone_create","description":"RBAC roles. Reads are open to any authenticated user (clients need the role\nlist for member dropdowns); writes (create/update/delete/clone) require a\nsuperuser or a global Owner. Built-in (is_system) roles are immutable.\n\n``ObjectHistoryMixin`` adds ``roles/{id}/history`` (pghistory): the role's own\nfield changes plus events of every tracked model that references it -- its\npermission grants (Role_Permission) and its assignments (Global_Role, members,\ngroups).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this role.","required":true}],"tags":["roles"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RoleRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RoleRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/roles/{id}/history/":{"get":{"operationId":"roles_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this role.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"is_owner","schema":{"type":"boolean"}},{"in":"query","name":"is_system","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/roles/{id}/history/legacy/":{"get":{"operationId":"roles_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this role.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"is_owner","schema":{"type":"boolean"}},{"in":"query","name":"is_system","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/roles/{id}/history/legacy/count/":{"get":{"operationId":"roles_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this role.","required":true}],"tags":["roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/roles/permissions_catalog/":{"get":{"operationId":"roles_permissions_catalog_retrieve","description":"RBAC roles. Reads are open to any authenticated user (clients need the role\nlist for member dropdowns); writes (create/update/delete/clone) require a\nsuperuser or a global Owner. Built-in (is_system) roles are immutable.\n\n``ObjectHistoryMixin`` adds ``roles/{id}/history`` (pghistory): the role's own\nfield changes plus events of every tracked model that references it -- its\npermission grants (Role_Permission) and its assignments (Global_Role, members,\ngroups).","tags":["roles"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/root_causes/":{"get":{"operationId":"root_causes_list","description":"Root causes visible to the requesting principal, ranked by risk and blast radius.\n\nCounts are authorization-scoped, so two tokens with different product access legitimately\nreport different numbers for the same root cause.","parameters":[{"in":"query","name":"cause_type","schema":{"type":"string","x-spec-enum-id":"920ce49358619366","enum":["component","cve","endpoint","image","resource"]},"description":"What kind of root cause this is: a software component, a CVE, an infrastructure resource, a container image, or a weakness class at a web endpoint.\n\n* `component` - Component\n* `cve` - CVE\n* `resource` - Resource\n* `endpoint` - Endpoint\n* `image` - Container Image"},{"in":"query","name":"cause_type__in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"display_name__icontains","schema":{"type":"string"}},{"in":"query","name":"identity_key","schema":{"type":"string"}},{"in":"query","name":"identity_key__icontains","schema":{"type":"string"}},{"in":"query","name":"include_subsumed","schema":{"type":"boolean","default":false},"description":"Include CVE root causes that another cause already covers entirely. They are excluded by default because fixing the covering cause clears them, so they are not independent work. A subsumed cause is always retrievable by id regardless of this parameter."},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"muted","schema":{"type":"boolean"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prod_type","schema":{"type":"array","items":{"type":"number"}},"description":"Organization (product type) ids the cause must reach.","explode":false,"style":"form"},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"number"}},"description":"Asset (product) ids the cause must reach.","explode":false,"style":"form"}],"tags":["correlation"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRootCauseList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/root_causes/{id}/":{"get":{"operationId":"root_causes_retrieve","description":"Root causes visible to the requesting principal, ranked by risk and blast radius.\n\nCounts are authorization-scoped, so two tokens with different product access legitimately\nreport different numbers for the same root cause.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this root cause.","required":true}],"tags":["correlation"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RootCauseDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/root_causes/{id}/findings/":{"get":{"operationId":"root_causes_findings_list","description":"The findings this root cause explains, worst-first, with the evidence for each link.","parameters":[{"in":"query","name":"cause_type","schema":{"type":"string","x-spec-enum-id":"920ce49358619366","enum":["component","cve","endpoint","image","resource"]},"description":"What kind of root cause this is: a software component, a CVE, an infrastructure resource, a container image, or a weakness class at a web endpoint.\n\n* `component` - Component\n* `cve` - CVE\n* `resource` - Resource\n* `endpoint` - Endpoint\n* `image` - Container Image"},{"in":"query","name":"cause_type__in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"display_name__icontains","schema":{"type":"string"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this root cause.","required":true},{"in":"query","name":"identity_key","schema":{"type":"string"}},{"in":"query","name":"identity_key__icontains","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"muted","schema":{"type":"boolean"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prod_type","schema":{"type":"array","items":{"type":"number"}},"description":"Organization (product type) ids the cause must reach.","explode":false,"style":"form"},{"in":"query","name":"product","schema":{"type":"integer"},"description":"Restrict the member findings to a single product id, so a caller that has already read /products/ can fetch one product's findings without paging through the others."}],"tags":["correlation"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRootCauseMemberList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/root_causes/{id}/organizations/":{"get":{"operationId":"root_causes_organizations_list","description":"Which organizations (product types) this root cause affects, most-affected first.\n\nThe cause's ``organization_count`` says how many; this says which, one row per\norganization with its own finding count and how many of its assets the cause reaches.","parameters":[{"in":"query","name":"cause_type","schema":{"type":"string","x-spec-enum-id":"920ce49358619366","enum":["component","cve","endpoint","image","resource"]},"description":"What kind of root cause this is: a software component, a CVE, an infrastructure resource, a container image, or a weakness class at a web endpoint.\n\n* `component` - Component\n* `cve` - CVE\n* `resource` - Resource\n* `endpoint` - Endpoint\n* `image` - Container Image"},{"in":"query","name":"cause_type__in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"display_name__icontains","schema":{"type":"string"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this root cause.","required":true},{"in":"query","name":"identity_key","schema":{"type":"string"}},{"in":"query","name":"identity_key__icontains","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"muted","schema":{"type":"boolean"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prod_type","schema":{"type":"array","items":{"type":"number"}},"description":"Organization (product type) ids the cause must reach.","explode":false,"style":"form"},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"number"}},"description":"Asset (product) ids the cause must reach.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"},"description":"Case-insensitive substring match on the organization (product type) name."}],"tags":["correlation"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRootCauseOrganizationList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/root_causes/{id}/products/":{"get":{"operationId":"root_causes_products_list","description":"Which products this root cause affects, most-affected first.\n\nThe cause's ``product_count`` says how many; this says which, one row per product with\nthat product's own finding count and worst scores.","parameters":[{"in":"query","name":"cause_type","schema":{"type":"string","x-spec-enum-id":"920ce49358619366","enum":["component","cve","endpoint","image","resource"]},"description":"What kind of root cause this is: a software component, a CVE, an infrastructure resource, a container image, or a weakness class at a web endpoint.\n\n* `component` - Component\n* `cve` - CVE\n* `resource` - Resource\n* `endpoint` - Endpoint\n* `image` - Container Image"},{"in":"query","name":"cause_type__in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"display_name__icontains","schema":{"type":"string"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this root cause.","required":true},{"in":"query","name":"identity_key","schema":{"type":"string"}},{"in":"query","name":"identity_key__icontains","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"muted","schema":{"type":"boolean"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prod_type","schema":{"type":"array","items":{"type":"number"}},"description":"Organization (product type) ids the cause must reach.","explode":false,"style":"form"},{"in":"query","name":"product","schema":{"type":"array","items":{"type":"number"}},"description":"Asset (product) ids the cause must reach.","explode":false,"style":"form"},{"in":"query","name":"search","schema":{"type":"string"},"description":"Case-insensitive substring match on the product name."}],"tags":["correlation"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedRootCauseProductList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/":{"get":{"operationId":"rules_engine_v2_rules_list","description":"CRUD for rule graphs, plus validate, replay, preview, export/import, versions, and run history.","parameters":[{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-enabled","-id","-name","-next_run","-trigger_type","-updated","-version","created","enabled","id","name","next_run","trigger_type","updated","version"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `enabled` - Enabled\n* `-enabled` - Enabled (descending)\n* `trigger_type` - Trigger type\n* `-trigger_type` - Trigger type (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `next_run` - Next run\n* `-next_run` - Next run (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"owner","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"owner_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"},{"in":"query","name":"trigger_event","schema":{"type":"string"}},{"in":"query","name":"trigger_event_not","schema":{"type":"string"}},{"in":"query","name":"trigger_type","schema":{"type":"string"}},{"in":"query","name":"trigger_type_not","schema":{"type":"string"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedGraphRuleListList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"rules_engine_v2_rules_create","description":"Create a rule, reporting anything worth reading about its graph. See :meth:`_with_warnings`.","tags":["rules_engine_v2"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphProblems"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/":{"get":{"operationId":"rules_engine_v2_rules_retrieve","description":"CRUD for rule graphs, plus validate, replay, preview, export/import, versions, and run history.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"rules_engine_v2_rules_update","description":"Update a rule, reporting anything worth reading about its graph. See :meth:`_with_warnings`.\n\nA rule a webhook receiver manages keeps its graph: the receiver rebuilds it on every save, so\nan edit here would be silently thrown away the next time. Anything else about the rule\n(enabled, mode, name) stays editable.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphProblems"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"rules_engine_v2_rules_partial_update","description":"CRUD for rule graphs, plus validate, replay, preview, export/import, versions, and run history.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedGraphRuleRetrieveRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedGraphRuleRetrieveRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedGraphRuleRetrieveRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphProblems"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"rules_engine_v2_rules_destroy","description":"Delete a rule, unless it has run history.\n\nRuns, node traces and provenance all cascade off the rule, so deleting one with history\ndeletes the record of what it did. Disabling keeps both.\n\n:param request: The request.\n:return: 204, or 409 with the run count.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleDeleteConflict"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/detach/":{"post":{"operationId":"rules_engine_v2_rules_detach_create","description":"Stop a webhook receiver managing this rule, so its graph can be edited here.\n\n:param request: The request.\n:return: The rule, now ordinary.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/export/":{"get":{"operationId":"rules_engine_v2_rules_export_retrieve","description":"The rule as a portable export file, optionally as one of its past versions.\n\nReferences to instance objects are written by name beside their ids so another instance can\nresolve them, credentials are stripped, and the rule's schedule travels with it. Exporting a\npast version is how a rollback is carried to another instance.\n\n:param request: The request. ``?event_id=`` picks a version from ``versions/``.\n:return: The bundle, as an attachment.","parameters":[{"in":"query","name":"event_id","schema":{"type":"integer"},"description":"Export this past version of the rule instead of its current graph"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/history/":{"get":{"operationId":"rules_engine_v2_rules_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-enabled","-id","-name","-next_run","-trigger_type","-updated","-version","created","enabled","id","name","next_run","trigger_type","updated","version"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `enabled` - Enabled\n* `-enabled` - Enabled (descending)\n* `trigger_type` - Trigger type\n* `-trigger_type` - Trigger type (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `next_run` - Next run\n* `-next_run` - Next run (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"owner","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"owner_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"},{"in":"query","name":"trigger_event","schema":{"type":"string"}},{"in":"query","name":"trigger_event_not","schema":{"type":"string"}},{"in":"query","name":"trigger_type","schema":{"type":"string"}},{"in":"query","name":"trigger_type_not","schema":{"type":"string"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/history/legacy/":{"get":{"operationId":"rules_engine_v2_rules_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-enabled","-id","-name","-next_run","-trigger_type","-updated","-version","created","enabled","id","name","next_run","trigger_type","updated","version"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `enabled` - Enabled\n* `-enabled` - Enabled (descending)\n* `trigger_type` - Trigger type\n* `-trigger_type` - Trigger type (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `next_run` - Next run\n* `-next_run` - Next run (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"owner","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"owner_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"},{"in":"query","name":"trigger_event","schema":{"type":"string"}},{"in":"query","name":"trigger_event_not","schema":{"type":"string"}},{"in":"query","name":"trigger_type","schema":{"type":"string"}},{"in":"query","name":"trigger_type_not","schema":{"type":"string"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/history/legacy/count/":{"get":{"operationId":"rules_engine_v2_rules_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/restore/":{"post":{"operationId":"rules_engine_v2_rules_restore_create","description":"Put a past version's graph and description back, as a new version.\n\nNothing else comes back: the name, mode, enabled state, owner and schedule stay as they are\nnow. Credentials are never taken from history; each node keeps what the current graph holds\nfor it, so a version from before a change of owner does not bring back the old owner's\nsecrets. A reference the restorer may not use any more is left empty, and then the rule is\nalso disabled until somebody fills it in.\n\n:param request: The request. Its body carries ``event_id`` and, optionally, the\n    ``expected_version`` the caller last saw.\n:return: The rule as it now stands, with ``warnings`` and ``restored_from``.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleRestoreRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RuleRestoreRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RuleRestoreRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphProblems"}}},"description":""},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConflictDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/run/":{"post":{"operationId":"rules_engine_v2_rules_run_create","description":"Replay a rule now.\n\nThe run happens on a worker, never in this request: that is the point of V2's transport, and\nit is why the response carries no run id. The run row does not exist yet. The UI polls\n``rules/{id}/runs/`` for the newest run.\n\n:param request: The request.\n:param pk: The rule.\n:return: 202 with a queued marker, or 400 when the graph has no trigger node.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleRunQueued"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphProblems"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/runs/":{"get":{"operationId":"rules_engine_v2_rules_runs_list","description":"This rule's runs, newest first.\n\n:param request: The request.\n:param pk: The rule.\n:return: A paginated page of run briefs.","parameters":[{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-enabled","-id","-name","-next_run","-trigger_type","-updated","-version","created","enabled","id","name","next_run","trigger_type","updated","version"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `enabled` - Enabled\n* `-enabled` - Enabled (descending)\n* `trigger_type` - Trigger type\n* `-trigger_type` - Trigger type (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `next_run` - Next run\n* `-next_run` - Next run (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"owner","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"owner_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"},{"in":"query","name":"trigger_event","schema":{"type":"string"}},{"in":"query","name":"trigger_event_not","schema":{"type":"string"}},{"in":"query","name":"trigger_type","schema":{"type":"string"}},{"in":"query","name":"trigger_type_not","schema":{"type":"string"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedGraphRuleRunBriefList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/schedule/":{"get":{"operationId":"rules_engine_v2_rules_schedule_retrieve","description":"The rule's schedule, owner-only for the methods that change it.\n\n``SchedulableObjectMixin.schedule`` deliberately never calls ``check_object_permissions``\n(its comment says so): scheduling is gated on the scheduling permissions rather than on the\nobject, which is right for the resources that mixin was written for. For a rule it is not.\nA rule runs under ``impersonate(rule.owner)``, so putting a cron expression on somebody\nelse's enabled rule makes it sweep every fifteen minutes with their finding visibility, and\nthe ownership boundary this viewset added for ``run`` was reachable straight past through a\ndifferent verb: ``POST rules/{id}/run/`` answered 403 while ``POST rules/{id}/schedule/``\nanswered 201. PATCH retimed another owner's automation and DELETE silently stopped it.\n\nReads stay open to any ``Rule_View`` holder, matching the rest of the viewset: seeing when a\nrule is scheduled carries no finding data.\n\n:param request: The request.\n:param pk: The rule.\n:raises PermissionDenied: When a non-owner tries to set, change or remove the schedule.\n:return: The mixin's response.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"rules_engine_v2_rules_schedule_create","description":"The rule's schedule, owner-only for the methods that change it.\n\n``SchedulableObjectMixin.schedule`` deliberately never calls ``check_object_permissions``\n(its comment says so): scheduling is gated on the scheduling permissions rather than on the\nobject, which is right for the resources that mixin was written for. For a rule it is not.\nA rule runs under ``impersonate(rule.owner)``, so putting a cron expression on somebody\nelse's enabled rule makes it sweep every fifteen minutes with their finding visibility, and\nthe ownership boundary this viewset added for ``run`` was reachable straight past through a\ndifferent verb: ``POST rules/{id}/run/`` answered 403 while ``POST rules/{id}/schedule/``\nanswered 201. PATCH retimed another owner's automation and DELETE silently stopped it.\n\nReads stay open to any ``Rule_View`` holder, matching the rest of the viewset: seeing when a\nrule is scheduled carries no finding data.\n\n:param request: The request.\n:param pk: The rule.\n:raises PermissionDenied: When a non-owner tries to set, change or remove the schedule.\n:return: The mixin's response.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"rules_engine_v2_rules_schedule_update","description":"The rule's schedule, owner-only for the methods that change it.\n\n``SchedulableObjectMixin.schedule`` deliberately never calls ``check_object_permissions``\n(its comment says so): scheduling is gated on the scheduling permissions rather than on the\nobject, which is right for the resources that mixin was written for. For a rule it is not.\nA rule runs under ``impersonate(rule.owner)``, so putting a cron expression on somebody\nelse's enabled rule makes it sweep every fifteen minutes with their finding visibility, and\nthe ownership boundary this viewset added for ``run`` was reachable straight past through a\ndifferent verb: ``POST rules/{id}/run/`` answered 403 while ``POST rules/{id}/schedule/``\nanswered 201. PATCH retimed another owner's automation and DELETE silently stopped it.\n\nReads stay open to any ``Rule_View`` holder, matching the rest of the viewset: seeing when a\nrule is scheduled carries no finding data.\n\n:param request: The request.\n:param pk: The rule.\n:raises PermissionDenied: When a non-owner tries to set, change or remove the schedule.\n:return: The mixin's response.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieveRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"rules_engine_v2_rules_schedule_partial_update","description":"The rule's schedule, owner-only for the methods that change it.\n\n``SchedulableObjectMixin.schedule`` deliberately never calls ``check_object_permissions``\n(its comment says so): scheduling is gated on the scheduling permissions rather than on the\nobject, which is right for the resources that mixin was written for. For a rule it is not.\nA rule runs under ``impersonate(rule.owner)``, so putting a cron expression on somebody\nelse's enabled rule makes it sweep every fifteen minutes with their finding visibility, and\nthe ownership boundary this viewset added for ``run`` was reachable straight past through a\ndifferent verb: ``POST rules/{id}/run/`` answered 403 while ``POST rules/{id}/schedule/``\nanswered 201. PATCH retimed another owner's automation and DELETE silently stopped it.\n\nReads stay open to any ``Rule_View`` holder, matching the rest of the viewset: seeing when a\nrule is scheduled carries no finding data.\n\n:param request: The request.\n:param pk: The rule.\n:raises PermissionDenied: When a non-owner tries to set, change or remove the schedule.\n:return: The mixin's response.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedGraphRuleRetrieveRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedGraphRuleRetrieveRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedGraphRuleRetrieveRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"rules_engine_v2_rules_schedule_destroy","description":"The rule's schedule, owner-only for the methods that change it.\n\n``SchedulableObjectMixin.schedule`` deliberately never calls ``check_object_permissions``\n(its comment says so): scheduling is gated on the scheduling permissions rather than on the\nobject, which is right for the resources that mixin was written for. For a rule it is not.\nA rule runs under ``impersonate(rule.owner)``, so putting a cron expression on somebody\nelse's enabled rule makes it sweep every fifteen minutes with their finding visibility, and\nthe ownership boundary this viewset added for ``run`` was reachable straight past through a\ndifferent verb: ``POST rules/{id}/run/`` answered 403 while ``POST rules/{id}/schedule/``\nanswered 201. PATCH retimed another owner's automation and DELETE silently stopped it.\n\nReads stay open to any ``Rule_View`` holder, matching the rest of the viewset: seeing when a\nrule is scheduled carries no finding data.\n\n:param request: The request.\n:param pk: The rule.\n:raises PermissionDenied: When a non-owner tries to set, change or remove the schedule.\n:return: The mixin's response.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/take_ownership/":{"post":{"operationId":"rules_engine_v2_rules_take_ownership_create","description":"Become the owner of a rule, so it runs as you and you can edit it.\n\nEditing, enabling, and running are owner-only, because a run impersonates the owner. This is\nthe way past that for a rule somebody else wrote: take it, then change it.\n\nTaking is unconditional for a ``Rule_Edit`` holder, and safe to be *for finding visibility*,\nbecause it can only ever move a rule to the taker's own visibility. It cannot widen what a\nrule sees, and a taker who happens to be more privileged than the previous owner could have\nwritten the same rule under their own name anyway.\n\nVisibility was not the whole story, though. Ownership also confers edit rights over a graph\nthat may hold a credential the taker cannot read: the webhook signing secret is masked on\nread and restored on write, so taking a rule, then PATCHing its URL and body while sending\nthe mask back, signed the taker's payload with a secret they never saw. So credentials do\nnot travel with the rule. They are cleared on transfer and the new owner re-enters them,\nwhich is the one thing that cannot be done with a value you cannot read.\n\nThe rule is disabled on the way over. Its scope changes the moment the owner does, so leaving\nit running would silently be a different rule than the one that was enabled.\n\n:param request: The request.\n:param pk: The rule.\n:return: The rule, as retrieve serves it.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/versions/":{"get":{"operationId":"rules_engine_v2_rules_versions_retrieve","description":"The rule's past versions, newest first, read from its audit history.\n\nEach says who saved it, when, and what changed, never the graph itself; fetch one version\nto see its graph. Empty, with ``history_enabled: false``, while the audit log is off.\n\n:param request: The request. ``limit`` and ``offset`` page the list.\n:return: One page of versions.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true},{"in":"query","name":"limit","schema":{"type":"integer"}},{"in":"query","name":"offset","schema":{"type":"integer"}}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleVersionPage"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/{id}/versions/{event_id}/":{"get":{"operationId":"rules_engine_v2_rules_version_detail","description":"One past version of the rule, with its graph. Credentials are masked, as on every read.\n\n:param request: The request.\n:param event_id: The version, from ``versions/``.\n:return: The version.","parameters":[{"in":"path","name":"event_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this graph rule.","required":true}],"tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleVersionDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/convert_from_v1/":{"post":{"operationId":"rules_engine_v2_rules_convert_from_v1_create","description":"Convert V1 rules into disabled V2 rules, and report on every one of them.\n\nThe same library the ``convert_rules_to_v2`` command calls, so the dialog and the CLI cannot\ndisagree about what a rule converts to. Always 200: an unconvertible rule is a row in the\nreport with its problems named, not an error, because a batch usually mixes the two.\n\nSchedule activation and dropping invalid filters are deliberately not exposed here. Both\nchange more than the rule being converted (one takes over a live schedule, the other silently\nwidens a rule's scope), so they stay on the command where an operator opts into them\nexplicitly.\n\n:param request: The request. Its body carries the rule ids and the two mode flags.\n:return: One report row per rule.","parameters":[{"in":"query","name":"created_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"created_during","schema":{"type":"string"}},{"in":"query","name":"created_on","schema":{"type":"string"}},{"in":"query","name":"created_past_days","schema":{"type":"number"}},{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created","-enabled","-id","-name","-next_run","-trigger_type","-updated","-version","created","enabled","id","name","next_run","trigger_type","updated","version"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `enabled` - Enabled\n* `-enabled` - Enabled (descending)\n* `trigger_type` - Trigger type\n* `-trigger_type` - Trigger type (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)\n* `next_run` - Next run\n* `-next_run` - Next run (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"owner","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"owner_not","schema":{"type":"string"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"},{"in":"query","name":"trigger_event","schema":{"type":"string"}},{"in":"query","name":"trigger_event_not","schema":{"type":"string"}},{"in":"query","name":"trigger_type","schema":{"type":"string"}},{"in":"query","name":"trigger_type_not","schema":{"type":"string"}},{"in":"query","name":"updated_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"updated_during","schema":{"type":"string"}},{"in":"query","name":"updated_on","schema":{"type":"string"}},{"in":"query","name":"updated_past_days","schema":{"type":"number"}}],"tags":["rules_engine_v2"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConvertFromV1RequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ConvertFromV1RequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ConvertFromV1RequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedConvertFromV1RowList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/export/":{"get":{"operationId":"rules_engine_v2_rules_export_bundle","description":"Several rules as one export file, selected with the list filters (``?id=1,2``, ``?owner=``).\n\n:param request: The request.\n:return: The bundle, as an attachment, or 400 when the filters select too many rules.","tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/from-template/":{"post":{"operationId":"rules_engine_v2_rules_from_template_create","description":"Create a rule from a template, owned by the caller.\n\nOwnership is the whole reason templates exist rather than seeded rules: a rule with no owner\nmatches nothing, and a migration has nobody to assign. The caller becomes the owner here, so\nthe rule runs as them and is scoped by what they can see.\n\nThe model's own defaults are left alone deliberately -- the new rule is disabled and in\nsimulate mode -- so adopting a template that tickets and notifies cannot do either until the\nadopter has read it, set its scope and turned it on.\n\n:param request: The request. Its body carries the template ``slug`` and an optional ``name``.\n:return: 201 with the new rule, or 400 for an unknown slug.","tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRetrieve"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/import/":{"post":{"operationId":"rules_engine_v2_rules_import_create","description":"Import rules from an export file, reporting on every one of them.\n\nDefaults to a dry run. Each rule's references are resolved by name on this instance, and\nwhatever does not resolve is left empty and named in its row's warnings. The rule is then\nvalidated exactly as a save from the editor would be. If any row has a problem nothing is\nwritten and the answer is 400 with the whole report, so a bundle never lands half-imported\nbecause one rule in it was bad.\n\nEvery imported rule is created disabled, in simulate mode, and owned by the importer. With\n``conflict=overwrite`` an existing rule of the same name that the importer owns has its graph\nand description replaced (a new version, recorded like any edit) and is disabled.\n\n:param request: The request. Its body carries the bundle, ``dry_run`` and ``conflict``.\n:return: The report.","tags":["rules_engine_v2"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleImportRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RuleImportRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RuleImportRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleImportResponse"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleImportResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/preview/":{"post":{"operationId":"rules_engine_v2_rules_preview_create","description":"Dry-run a graph and report what it would do, changing nothing.\n\nThe real engine runs, inside a transaction this method then rolls back, so a preview exercises\nexactly the production code path for every node instead of a parallel no-persist branch that\nwould have to be maintained per node type. Egress is forced to simulate by ``ex.preview``, and\nthe simulated rows are never inserted at all.\n\n:param request: The request. Its body carries the graph and an optional item limit.\n:return: A run detail shape (never persisted), or 400 with the graph's problems.","tags":["rules_engine_v2"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphPreviewRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GraphPreviewRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GraphPreviewRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphRuleRunDetail"}}},"description":""},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphProblems"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/templates/":{"get":{"operationId":"rules_engine_v2_rules_templates_retrieve","description":"The shipped rule templates, graphs included.\n\nThe graph is served rather than summarized: a picker that could not show what it is about to\ncreate would be asking somebody to adopt a compliance rule sight unseen.\n\n:param request: The request.\n:return: The templates.","tags":["rules_engine_v2"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/rules_engine_v2/rules/validate/":{"post":{"operationId":"rules_engine_v2_rules_validate_create","description":"Check a graph without saving it. Always 200: an invalid graph is an answer, not an error.\n\nThis is what the editor calls as somebody wires nodes together, so the problems array is the\nresponse body rather than an exception.\n\nWarnings ride along in the same response and are deliberately separate from problems: a\nproblem is a reason the graph cannot be saved, a warning is something worth reading that\nnever blocks. Nothing in the warnings array may ever become blocking.\n\n:param request: The request. Its body carries the graph.\n:return: ``{problems: [...], warnings: [...]}``, both empty when there is nothing to say.","tags":["rules_engine_v2"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphValidationRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/GraphValidationRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/GraphValidationRequestRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GraphProblems"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sbom-import/":{"post":{"operationId":"sbom_import_create","description":"Imports an SBOM or dependency manifest into a product.\n\nParses the file using the specified scan type parser, extracts all\ncomponent/dependency locations, and associates them with the product.\nNo findings, tests, or engagements are created.","tags":["sbom-import"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SbomImportRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SbomImport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sbom-import/status/{task_id}/":{"get":{"operationId":"sbom_import_status_retrieve","description":"Imports an SBOM or dependency manifest into a product.\n\nParses the file using the specified scan type parser, extracts all\ncomponent/dependency locations, and associates them with the product.\nNo findings, tests, or engagements are created.","parameters":[{"in":"path","name":"task_id","schema":{"type":"string"},"required":true}],"tags":["sbom-import"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SbomImport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sbom/{id}/":{"get":{"operationId":"sbom_retrieve","description":"The product's dependency inventory as a CycloneDX 1.6 or SPDX 2.3 SBOM. With ``version``, the inventory comes from that version's BOM snapshot and the CycloneDX document reproduces the recorded dependency graph.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"in":"query","name":"profile","schema":{"type":"string","enum":["ai"]},"description":"ai: export only the asset's AI components (coding assistants, MCP servers, models, AI packages, AI services, agent skills) as a CycloneDX 1.6 AI bill of materials, each with its AI category, evidence and authorization decision. CycloneDX only. Requires the AI Inventory and Governance feature."},{"in":"query","name":"spec","schema":{"type":"string","enum":["cyclonedx","spdx"],"default":"cyclonedx"},"description":"SBOM specification to emit."},{"in":"query","name":"version","schema":{"type":"string"},"description":"Export the asset at this version instead of its current aggregate state, using the BOM snapshot recorded for that version. Omitted, the document describes the current inventory exactly as before. An unknown version 404s."}],"tags":["sbom"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sbom/{id}/vex/":{"get":{"operationId":"sbom_vex_retrieve","description":"A CycloneDX 1.6 (default) or OpenVEX 0.2.0 VEX document built from the product's finding statuses. Component refs (OpenVEX product ids) are purls, matching the SBOM export of the same product. With ``version``, findings carrying a fixed_in record for that version are reported resolved there. OpenVEX requires at least one statement, so ``spec=openvex`` answers 400 when there is nothing to state. SPDX has no VEX profile.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product.","required":true},{"in":"query","name":"spec","schema":{"type":"string","enum":["cyclonedx","openvex"],"default":"cyclonedx"},"description":"VEX specification to emit: CycloneDX 1.6 VEX or OpenVEX 0.2.0."},{"in":"query","name":"version","schema":{"type":"string"},"description":"Export the asset at this version instead of its current aggregate state, using the BOM snapshot recorded for that version. Omitted, the document describes the current inventory exactly as before. An unknown version 404s."}],"tags":["sbom"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/scan_cadence_policies/":{"get":{"operationId":"scan_cadence_policies_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name__icontains","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["scan_cadence_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedScanCadencePolicyList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"scan_cadence_policies_create","tags":["scan_cadence_policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanCadencePolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ScanCadencePolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ScanCadencePolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanCadencePolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/scan_cadence_policies/{id}/":{"get":{"operationId":"scan_cadence_policies_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this scan cadence policy.","required":true}],"tags":["scan_cadence_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanCadencePolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"scan_cadence_policies_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this scan cadence policy.","required":true}],"tags":["scan_cadence_policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanCadencePolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ScanCadencePolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ScanCadencePolicyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanCadencePolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"scan_cadence_policies_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this scan cadence policy.","required":true}],"tags":["scan_cadence_policies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedScanCadencePolicyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedScanCadencePolicyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedScanCadencePolicyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanCadencePolicy"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"scan_cadence_policies_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this scan cadence policy.","required":true}],"tags":["scan_cadence_policies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/scan_cadence_status/":{"get":{"operationId":"scan_cadence_status_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"policy","schema":{"type":"integer"}},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"product_type","schema":{"type":"number"}},{"in":"query","name":"regulation","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"a57afa4f30880245","enum":["compliant","due","never_scanned","overdue"]},"description":"* `compliant` - Compliant\n* `due` - Due\n* `overdue` - Overdue\n* `never_scanned` - Never scanned"}],"tags":["scan_cadence_status"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProductCadenceStatusList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/scan_cadence_status/{id}/":{"get":{"operationId":"scan_cadence_status_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this product cadence status.","required":true}],"tags":["scan_cadence_status"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCadenceStatus"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/scan_cadence_status/attestation/":{"get":{"operationId":"scan_cadence_status_attestation_retrieve","parameters":[{"in":"query","name":"end","schema":{"type":"string"},"required":true},{"in":"query","name":"format","schema":{"type":"string","enum":["csv","xlsx"]}},{"in":"query","name":"policy","schema":{"type":"integer"},"required":true},{"in":"query","name":"start","schema":{"type":"string"},"required":true}],"tags":["scan_cadence_status"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/security_controls/":{"get":{"operationId":"security_controls_list","parameters":[{"in":"query","name":"catalog","schema":{"type":"integer"}},{"in":"query","name":"control_id","schema":{"type":"string"}},{"in":"query","name":"control_id__icontains","schema":{"type":"string"}},{"in":"query","name":"enabled","schema":{"type":"boolean"}},{"in":"query","name":"family","schema":{"type":"string"}},{"in":"query","name":"family__icontains","schema":{"type":"string"}},{"in":"query","name":"label__icontains","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"title__icontains","schema":{"type":"string"}}],"tags":["security_controls"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSecurityControlList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/security_controls/{id}/":{"get":{"operationId":"security_controls_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this security control.","required":true}],"tags":["security_controls"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecurityControl"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sensei/fix_quota/":{"get":{"operationId":"sensei_fix_quota_retrieve","description":"Token-authenticated Sensei usage endpoints called by the\n``DefectDojo-Inc/defectdojo-scan-and-fix`` GitHub action — NOT the Vue UI.\n\nMounted on the public-facing ``/api/v2/`` API so the action authenticates\nwith the ``DEFECTDOJO_TOKEN`` it was configured with (same auth as\n``/api/v2/reimport-scan/``). Gated behind the ``sensei`` licensed feature.\n\n- ``GET  /api/v2/sensei/fix_quota/`` — pre-``/fix`` hard-block gate; returns\n  fix accounting so the action can refuse to run when the quota is spent.\n- ``POST /api/v2/sensei/fix_usage/`` — records the findings fixed by a ``/fix``\n  command (the billable unit) and echoes the refreshed quota.\n- ``GET  /api/v2/sensei/push_token/?repo=owner/name`` — mints a short-lived\n  GitHub App installation token so the workflow can ``git push`` a ``/fix``\n  commit. Replaces the stored ``PAT_TOKEN`` secret (Sensei is App-only); an\n  App-token push re-triggers the PR scan, which is the only thing the PAT did.\n- ``POST /api/v2/sensei/scan_status/`` and ``/remediation_callback/``: the\n  engine's terminal reports for a dispatched run or direct cloud remediation.\n\nEverything past the license gate is scoped to the object the call names: see\n``pro.sensei.api.engine_identity`` for which callers each endpoint accepts.","tags":["sensei"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sensei/fix_usage/":{"post":{"operationId":"sensei_fix_usage_create","description":"Token-authenticated Sensei usage endpoints called by the\n``DefectDojo-Inc/defectdojo-scan-and-fix`` GitHub action — NOT the Vue UI.\n\nMounted on the public-facing ``/api/v2/`` API so the action authenticates\nwith the ``DEFECTDOJO_TOKEN`` it was configured with (same auth as\n``/api/v2/reimport-scan/``). Gated behind the ``sensei`` licensed feature.\n\n- ``GET  /api/v2/sensei/fix_quota/`` — pre-``/fix`` hard-block gate; returns\n  fix accounting so the action can refuse to run when the quota is spent.\n- ``POST /api/v2/sensei/fix_usage/`` — records the findings fixed by a ``/fix``\n  command (the billable unit) and echoes the refreshed quota.\n- ``GET  /api/v2/sensei/push_token/?repo=owner/name`` — mints a short-lived\n  GitHub App installation token so the workflow can ``git push`` a ``/fix``\n  commit. Replaces the stored ``PAT_TOKEN`` secret (Sensei is App-only); an\n  App-token push re-triggers the PR scan, which is the only thing the PAT did.\n- ``POST /api/v2/sensei/scan_status/`` and ``/remediation_callback/``: the\n  engine's terminal reports for a dispatched run or direct cloud remediation.\n\nEverything past the license gate is scoped to the object the call names: see\n``pro.sensei.api.engine_identity`` for which callers each endpoint accepts.","tags":["sensei"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FixUsageReportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/FixUsageReportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/FixUsageReportRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sensei/push_token/":{"get":{"operationId":"sensei_push_token_retrieve","description":"Return a short-lived App installation token for the ``?repo=`` repository.\n\nOnly a caller who may act on that repository gets one (see\n``engine_identity.may_use_repo``); the token itself is limited to the one\nrepository rather than the whole App installation.","tags":["sensei"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sensei/remediation_callback/":{"post":{"operationId":"sensei_remediation_callback_create","description":"Record a direct cloud remediation's terminal result (engine callback).\n\nThe orchestrator applies/reverts the live change, then the scan-server POSTs\nthe parsed ``cloud-remediation-result=`` marker here. On ``applied`` we persist\nthe captured prior state + drift fingerprints on the CloudRemediation (so a\nlater revert can restore the prior config and refuse on drift) and flip the fix\nrecord to APPLIED; ``reverted`` closes it REVERTED; the failure states surface\nthe reason on the record. Token-authenticated like ``scan_status`` — the acting\nuser's token rides the dispatched job.","tags":["sensei"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationCallbackRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/RemediationCallbackRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/RemediationCallbackRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sensei/scan_status/":{"post":{"operationId":"sensei_scan_status_create","description":"Record a server-side run's terminal status. The engine POSTs this when\na job finishes; ``scan_run_id`` echoes the id carried on the job so we can\nflip the right ``SenseiScanRun`` to SUCCEEDED/FAILED (with root cause).","tags":["sensei"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanStatusReportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ScanStatusReportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ScanStatusReportRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/service_users/":{"get":{"operationId":"service_users_list","description":"API-only service users. The token is returned once, by create and by regenerate_token.\n\nMemberships and groups are not fields here: a service user's are managed through the same\nendpoints as any user's.","parameters":[{"in":"query","name":"expired","schema":{"type":"boolean"}},{"in":"query","name":"is_active","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-created_at","-expires_at","-label","-last_used_at","-username","created_at","expires_at","label","last_used_at","username"]}},"description":"Ordering\n\n* `label` - Label\n* `-label` - Label (descending)\n* `username` - Username\n* `-username` - Username (descending)\n* `expires_at` - Expires at\n* `-expires_at` - Expires at (descending)\n* `last_used_at` - Last used at\n* `-last_used_at` - Last used at (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"}}],"tags":["Service Users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedServiceUserList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"service_users_create","description":"API-only service users. The token is returned once, by create and by regenerate_token.\n\nMemberships and groups are not fields here: a service user's are managed through the same\nendpoints as any user's.","tags":["Service Users"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceUserCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ServiceUserCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ServiceUserCreateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceUserTokenResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/service_users/{id}/":{"get":{"operationId":"service_users_retrieve","description":"API-only service users. The token is returned once, by create and by regenerate_token.\n\nMemberships and groups are not fields here: a service user's are managed through the same\nendpoints as any user's.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this service user.","required":true}],"tags":["Service Users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceUser"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"service_users_partial_update","description":"API-only service users. The token is returned once, by create and by regenerate_token.\n\nMemberships and groups are not fields here: a service user's are managed through the same\nendpoints as any user's.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this service user.","required":true}],"tags":["Service Users"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedServiceUserUpdateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedServiceUserUpdateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedServiceUserUpdateRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceUser"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"service_users_destroy","description":"API-only service users. The token is returned once, by create and by regenerate_token.\n\nMemberships and groups are not fields here: a service user's are managed through the same\nendpoints as any user's.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this service user.","required":true}],"tags":["Service Users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/service_users/{id}/regenerate_token/":{"post":{"operationId":"service_users_regenerate_token_create","description":"API-only service users. The token is returned once, by create and by regenerate_token.\n\nMemberships and groups are not fields here: a service user's are managed through the same\nendpoints as any user's.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this service user.","required":true}],"tags":["Service Users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServiceUserTokenResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/service_users/manageable_targets/":{"get":{"operationId":"service_users_manageable_targets_retrieve","description":"Assets or Organizations the viewer may add members to, for the service user page's picker.\n\nA read for the picker only: the membership itself is created through the standard member\nendpoints, which check Manage Members (and Add Owner) again.","parameters":[{"in":"query","name":"exclude_user","schema":{"type":"integer"},"description":"Leave out targets this user is already a member of."},{"in":"query","name":"search","schema":{"type":"string"}},{"in":"query","name":"type","schema":{"type":"string","enum":["asset","organization"]}}],"tags":["Service Users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]},{"basicAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sla_configurations/":{"get":{"operationId":"sla_configurations_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["sla_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSLAConfigurationList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"sla_configurations_create","tags":["sla_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLAConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SLAConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SLAConfigurationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLAConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sla_configurations/{id}/":{"get":{"operationId":"sla_configurations_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this enhanced sl a_ configuration.","required":true}],"tags":["sla_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLAConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"sla_configurations_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this enhanced sl a_ configuration.","required":true}],"tags":["sla_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLAConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SLAConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SLAConfigurationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLAConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"sla_configurations_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this enhanced sl a_ configuration.","required":true}],"tags":["sla_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedSLAConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedSLAConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedSLAConfigurationRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SLAConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"sla_configurations_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this enhanced sl a_ configuration.","required":true}],"tags":["sla_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sla_configurations/{id}/delete_preview/":{"get":{"operationId":"sla_configurations_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this sl a_ configuration.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["sla_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/smart_upload_import/":{"post":{"operationId":"smart_upload_import_create","tags":["smart_upload_import"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SmartUploadRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmartUpload"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/smart_upload_import/unassigned_findings/":{"get":{"operationId":"smart_upload_import_unassigned_findings_list","parameters":[{"in":"query","name":"date","schema":{"type":"string","format":"date"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["reporter","test_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"severity","schema":{"type":"string"}},{"in":"query","name":"title","schema":{"type":"string"}}],"tags":["smart_upload_import"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedUnassignedFindingList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/smart_upload_import/unassigned_findings/{id}/":{"get":{"operationId":"smart_upload_import_unassigned_findings_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this unassigned finding.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["reporter","test_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["smart_upload_import"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnassignedFinding"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"smart_upload_import_unassigned_findings_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this unassigned finding.","required":true}],"tags":["smart_upload_import"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/smart_upload_import/unassigned_findings/assign_existing_product/":{"post":{"operationId":"smart_upload_import_unassigned_findings_assign_existing_product_create","tags":["smart_upload_import"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignExistingProductRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssignExistingProductRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssignExistingProductRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignExistingProduct"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/smart_upload_import/unassigned_findings/assign_new_product/":{"post":{"operationId":"smart_upload_import_unassigned_findings_assign_new_product_create","tags":["smart_upload_import"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignNewProductRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AssignNewProductRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AssignNewProductRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignNewProduct"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/smart_upload_import/unassigned_findings/disregard_all_unassigned_findings/":{"delete":{"operationId":"smart_upload_import_unassigned_findings_disregard_all_unassigned_findings_destroy","tags":["smart_upload_import"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/smart_upload_import/unassigned_findings/disregard_unassigned_findings/":{"post":{"operationId":"smart_upload_import_unassigned_findings_disregard_unassigned_findings_create","tags":["smart_upload_import"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisregardUnassignedFindingRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/DisregardUnassignedFindingRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DisregardUnassignedFindingRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisregardUnassignedFinding"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sonarqube_issues/":{"get":{"operationId":"sonarqube_issues_list","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"key","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string"}},{"in":"query","name":"type","schema":{"type":"string"}}],"tags":["sonarqube_issues"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSonarqubeIssueList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"sonarqube_issues_create","tags":["sonarqube_issues"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sonarqube_issues/{id}/":{"get":{"operationId":"sonarqube_issues_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this sonarqube_ issue.","required":true}],"tags":["sonarqube_issues"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"sonarqube_issues_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this sonarqube_ issue.","required":true}],"tags":["sonarqube_issues"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"sonarqube_issues_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this sonarqube_ issue.","required":true}],"tags":["sonarqube_issues"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedSonarqubeIssueRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedSonarqubeIssueRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedSonarqubeIssueRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssue"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"sonarqube_issues_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this sonarqube_ issue.","required":true}],"tags":["sonarqube_issues"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sonarqube_issues/{id}/delete_preview/":{"get":{"operationId":"sonarqube_issues_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this sonarqube_ issue.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["sonarqube_issues"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sonarqube_transitions/":{"get":{"operationId":"sonarqube_transitions_list","parameters":[{"in":"query","name":"finding_status","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"sonarqube_issue","schema":{"type":"integer"}},{"in":"query","name":"sonarqube_status","schema":{"type":"string"}},{"in":"query","name":"transitions","schema":{"type":"string"}}],"tags":["sonarqube_transitions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedSonarqubeIssueTransitionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"sonarqube_transitions_create","tags":["sonarqube_transitions"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueTransitionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueTransitionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueTransitionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueTransition"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sonarqube_transitions/{id}/":{"get":{"operationId":"sonarqube_transitions_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this sonarqube_ issue_ transition.","required":true}],"tags":["sonarqube_transitions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueTransition"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"sonarqube_transitions_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this sonarqube_ issue_ transition.","required":true}],"tags":["sonarqube_transitions"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueTransitionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueTransitionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueTransitionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueTransition"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"sonarqube_transitions_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this sonarqube_ issue_ transition.","required":true}],"tags":["sonarqube_transitions"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedSonarqubeIssueTransitionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedSonarqubeIssueTransitionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedSonarqubeIssueTransitionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SonarqubeIssueTransition"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"sonarqube_transitions_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this sonarqube_ issue_ transition.","required":true}],"tags":["sonarqube_transitions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/sonarqube_transitions/{id}/delete_preview/":{"get":{"operationId":"sonarqube_transitions_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this sonarqube_ issue_ transition.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["sonarqube_transitions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/survey_questions/":{"get":{"operationId":"survey_questions_list","parameters":[{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-id","-optional","-text","-type","id","optional","text","type"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `type` - Type\n* `-type` - Type (descending)\n* `text` - Text\n* `-text` - Text (descending)\n* `optional` - Optional\n* `-optional` - Optional (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"optional","schema":{"type":"boolean"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: type, text"},{"in":"query","name":"text_contains","schema":{"type":"string"}},{"in":"query","name":"text_ends_with","schema":{"type":"string"}},{"in":"query","name":"text_exact","schema":{"type":"string"}},{"in":"query","name":"text_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"text_not_contains","schema":{"type":"string"}},{"in":"query","name":"text_not_exact","schema":{"type":"string"}},{"in":"query","name":"text_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"text_not_regex","schema":{"type":"string"}},{"in":"query","name":"text_regex","schema":{"type":"string"}},{"in":"query","name":"text_starts_with","schema":{"type":"string"}},{"in":"query","name":"type","schema":{"type":"string"}}],"tags":["survey_questions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProQuestionList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"survey_questions_create","tags":["survey_questions"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProQuestionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProQuestionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProQuestionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProQuestion"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/survey_questions/{id}/":{"get":{"operationId":"survey_questions_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this question.","required":true}],"tags":["survey_questions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProQuestion"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"survey_questions_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this question.","required":true}],"tags":["survey_questions"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProQuestionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProQuestionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProQuestionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProQuestion"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"survey_questions_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this question.","required":true}],"tags":["survey_questions"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProQuestionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProQuestionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProQuestionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProQuestion"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"survey_questions_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this question.","required":true}],"tags":["survey_questions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/survey_questions/{id}/history/":{"get":{"operationId":"survey_questions_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this question.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-id","-optional","-text","-type","id","optional","text","type"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `type` - Type\n* `-type` - Type (descending)\n* `text` - Text\n* `-text` - Text (descending)\n* `optional` - Optional\n* `-optional` - Optional (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"optional","schema":{"type":"boolean"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: type, text"},{"in":"query","name":"text_contains","schema":{"type":"string"}},{"in":"query","name":"text_ends_with","schema":{"type":"string"}},{"in":"query","name":"text_exact","schema":{"type":"string"}},{"in":"query","name":"text_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"text_not_contains","schema":{"type":"string"}},{"in":"query","name":"text_not_exact","schema":{"type":"string"}},{"in":"query","name":"text_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"text_not_regex","schema":{"type":"string"}},{"in":"query","name":"text_regex","schema":{"type":"string"}},{"in":"query","name":"text_starts_with","schema":{"type":"string"}},{"in":"query","name":"type","schema":{"type":"string"}}],"tags":["survey_questions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/survey_questions/{id}/history/legacy/":{"get":{"operationId":"survey_questions_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this question.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-id","-optional","-text","-type","id","optional","text","type"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `type` - Type\n* `-type` - Type (descending)\n* `text` - Text\n* `-text` - Text (descending)\n* `optional` - Optional\n* `-optional` - Optional (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"optional","schema":{"type":"boolean"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: type, text"},{"in":"query","name":"text_contains","schema":{"type":"string"}},{"in":"query","name":"text_ends_with","schema":{"type":"string"}},{"in":"query","name":"text_exact","schema":{"type":"string"}},{"in":"query","name":"text_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"text_not_contains","schema":{"type":"string"}},{"in":"query","name":"text_not_exact","schema":{"type":"string"}},{"in":"query","name":"text_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"text_not_regex","schema":{"type":"string"}},{"in":"query","name":"text_regex","schema":{"type":"string"}},{"in":"query","name":"text_starts_with","schema":{"type":"string"}},{"in":"query","name":"type","schema":{"type":"string"}}],"tags":["survey_questions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/survey_questions/{id}/history/legacy/count/":{"get":{"operationId":"survey_questions_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this question.","required":true}],"tags":["survey_questions"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/surveys/":{"get":{"operationId":"surveys_list","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active","-description","-id","-name","active","description","id","name"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `description` - Description\n* `-description` - Description (descending)\n* `active` - Active\n* `-active` - Active (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"}],"tags":["surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedProSurveyList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"surveys_create","tags":["surveys"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProSurveyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProSurveyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProSurveyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProSurvey"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/surveys/{id}/":{"get":{"operationId":"surveys_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Engagement Survey.","required":true}],"tags":["surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProSurvey"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"surveys_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Engagement Survey.","required":true}],"tags":["surveys"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProSurveyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProSurveyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProSurveyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProSurvey"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"surveys_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Engagement Survey.","required":true}],"tags":["surveys"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedProSurveyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedProSurveyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedProSurveyRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProSurvey"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"surveys_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Engagement Survey.","required":true}],"tags":["surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/surveys/{id}/history/":{"get":{"operationId":"surveys_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Engagement Survey.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active","-description","-id","-name","active","description","id","name"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `description` - Description\n* `-description` - Description (descending)\n* `active` - Active\n* `-active` - Active (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"}],"tags":["surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/surveys/{id}/history/legacy/":{"get":{"operationId":"surveys_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"description_contains","schema":{"type":"string"}},{"in":"query","name":"description_ends_with","schema":{"type":"string"}},{"in":"query","name":"description_exact","schema":{"type":"string"}},{"in":"query","name":"description_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_contains","schema":{"type":"string"}},{"in":"query","name":"description_not_exact","schema":{"type":"string"}},{"in":"query","name":"description_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"description_not_regex","schema":{"type":"string"}},{"in":"query","name":"description_regex","schema":{"type":"string"}},{"in":"query","name":"description_starts_with","schema":{"type":"string"}},{"in":"query","name":"exclude_id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Engagement Survey.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_equals","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than","schema":{"type":"integer"}},{"in":"query","name":"id_greater_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"id_less_than","schema":{"type":"integer"}},{"in":"query","name":"id_less_than_equal_to","schema":{"type":"integer"}},{"in":"query","name":"id_not","schema":{"type":"string"}},{"in":"query","name":"id_not_equals","schema":{"type":"integer"}},{"in":"query","name":"id_not_in","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name_contains","schema":{"type":"string"}},{"in":"query","name":"name_ends_with","schema":{"type":"string"}},{"in":"query","name":"name_exact","schema":{"type":"string"}},{"in":"query","name":"name_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_contains","schema":{"type":"string"}},{"in":"query","name":"name_not_exact","schema":{"type":"string"}},{"in":"query","name":"name_not_in","schema":{"type":"array","items":{"type":"string"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"name_not_regex","schema":{"type":"string"}},{"in":"query","name":"name_regex","schema":{"type":"string"}},{"in":"query","name":"name_starts_with","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active","-description","-id","-name","active","description","id","name"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `description` - Description\n* `-description` - Description (descending)\n* `active` - Active\n* `-active` - Active (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"search","schema":{"type":"string"},"description":"Search Across: name, description"}],"tags":["surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/surveys/{id}/history/legacy/count/":{"get":{"operationId":"surveys_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Engagement Survey.","required":true}],"tags":["surveys"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/surveys/{id}/open/":{"post":{"operationId":"surveys_open_create","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Engagement Survey.","required":true}],"tags":["surveys"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProSurveyRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ProSurveyRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ProSurveyRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProSurvey"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/system_settings/":{"get":{"operationId":"system_settings_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["system_settings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedSystemSettingsList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/system_settings/{id}/":{"get":{"operationId":"system_settings_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this system_ settings.","required":true},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["system_settings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedSystemSettings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"system_settings_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this system_ settings.","required":true}],"tags":["system_settings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedSystemSettingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedSystemSettingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedSystemSettingsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedSystemSettings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"system_settings_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this system_ settings.","required":true}],"tags":["system_settings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedSystemSettingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedSystemSettingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedSystemSettingsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedSystemSettings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/targeted_risk_analyses/":{"get":{"operationId":"targeted_risk_analyses_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"linked_sla_configuration","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"requirement_ref","schema":{"type":"string"}},{"in":"query","name":"requirement_ref__icontains","schema":{"type":"string"}},{"in":"query","name":"scope_product","schema":{"type":"integer"}},{"in":"query","name":"scope_product_type","schema":{"type":"integer"}},{"in":"query","name":"status","schema":{"type":"string","x-spec-enum-id":"8edf5fc5253b63cd","enum":["approved","draft","superseded"]},"description":"Draft, approved, or superseded.\n\n* `draft` - Draft\n* `approved` - Approved\n* `superseded` - Superseded"}],"tags":["targeted_risk_analyses"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedTargetedRiskAnalysisList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"targeted_risk_analyses_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["targeted_risk_analyses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysisRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysisRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysisRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysis"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/targeted_risk_analyses/{id}/":{"get":{"operationId":"targeted_risk_analyses_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this targeted risk analysis.","required":true}],"tags":["targeted_risk_analyses"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysis"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"targeted_risk_analyses_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this targeted risk analysis.","required":true}],"tags":["targeted_risk_analyses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysisRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysisRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysisRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysis"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"targeted_risk_analyses_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this targeted risk analysis.","required":true}],"tags":["targeted_risk_analyses"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedTargetedRiskAnalysisRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedTargetedRiskAnalysisRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedTargetedRiskAnalysisRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysis"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"targeted_risk_analyses_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this targeted risk analysis.","required":true}],"tags":["targeted_risk_analyses"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/targeted_risk_analyses/{id}/approve/":{"post":{"operationId":"targeted_risk_analyses_approve_create","description":"Approve a draft analysis, recording the approver and setting the 12-month review-due date. Only a draft can be approved.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this targeted risk analysis.","required":true}],"tags":["targeted_risk_analyses"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysis"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/targeted_risk_analyses/{id}/supersede/":{"post":{"operationId":"targeted_risk_analyses_supersede_create","description":"Mark an approved analysis superseded, so it no longer justifies a current frequency. Only an approved analysis can be superseded.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this targeted risk analysis.","required":true}],"tags":["targeted_risk_analyses"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TargetedRiskAnalysis"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/technologies/":{"get":{"operationId":"technologies_list","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"user","schema":{"type":"integer"}},{"in":"query","name":"version","schema":{"type":"string"}}],"tags":["technologies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAppAnalysisList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"technologies_create","tags":["technologies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAnalysisRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AppAnalysisRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AppAnalysisRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAnalysis"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/technologies/{id}/":{"get":{"operationId":"technologies_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this app_ analysis.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["product","user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["technologies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAnalysis"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"technologies_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this app_ analysis.","required":true}],"tags":["technologies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAnalysisRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AppAnalysisRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AppAnalysisRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAnalysis"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"technologies_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this app_ analysis.","required":true}],"tags":["technologies"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedAppAnalysisRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedAppAnalysisRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedAppAnalysisRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAnalysis"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"technologies_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this app_ analysis.","required":true}],"tags":["technologies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/technologies/{id}/delete_preview/":{"get":{"operationId":"technologies_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this app_ analysis.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["technologies"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/test_imports/":{"get":{"operationId":"test_imports_list","parameters":[{"in":"query","name":"branch_tag","schema":{"type":"string"}},{"in":"query","name":"build_id","schema":{"type":"string"}},{"in":"query","name":"commit_hash","schema":{"type":"string"}},{"in":"query","name":"findings_affected","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-branch_tag","-build_id","-commit_hash","-created","-id","-modified","-version","branch_tag","build_id","commit_hash","created","id","modified","version"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `modified` - Modified\n* `-modified` - Modified (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `branch_tag` - Branch tag\n* `-branch_tag` - Branch tag (descending)\n* `build_id` - Build id\n* `-build_id` - Build id (descending)\n* `commit_hash` - Commit hash\n* `-commit_hash` - Commit hash (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"test","schema":{"type":"integer"}},{"in":"query","name":"test_import_finding_action__action","schema":{"type":"string","x-spec-enum-id":"630f6e89cd3cf0b8","nullable":true,"enum":["C","N","R","U"]},"description":"* `N` - created\n* `C` - closed\n* `R` - reactivated\n* `U` - untouched"},{"in":"query","name":"test_import_finding_action__created","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"test_import_finding_action__finding","schema":{"type":"integer"}},{"in":"query","name":"version","schema":{"type":"string"}}],"tags":["test_imports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedTestImportList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"test_imports_create","tags":["test_imports"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestImportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TestImportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TestImportRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestImport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/test_imports/{id}/":{"get":{"operationId":"test_imports_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test_ import.","required":true}],"tags":["test_imports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestImport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"test_imports_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test_ import.","required":true}],"tags":["test_imports"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestImportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TestImportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TestImportRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestImport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"test_imports_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test_ import.","required":true}],"tags":["test_imports"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedTestImportRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedTestImportRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedTestImportRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestImport"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"test_imports_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test_ import.","required":true}],"tags":["test_imports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/test_imports/{id}/delete_preview/":{"get":{"operationId":"test_imports_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test_ import.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["test_imports"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/test_types/":{"get":{"operationId":"test_types_list","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"dynamic_tool","schema":{"type":"boolean"}},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"in_use","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_ends","schema":{"type":"string"}},{"in":"query","name":"name_starts","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active","-active_findings_count","-dynamic_tool","-id","-name","-soc","-static_tool","-verified_findings_count","active","active_findings_count","dynamic_tool","id","name","soc","static_tool","verified_findings_count"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `active_findings_count` - Active findings count\n* `-active_findings_count` - Active findings count (descending)\n* `verified_findings_count` - Verified findings count\n* `-verified_findings_count` - Verified findings count (descending)\n* `static_tool` - Static tool\n* `-static_tool` - Static tool (descending)\n* `dynamic_tool` - Dynamic tool\n* `-dynamic_tool` - Dynamic tool (descending)\n* `active` - Active\n* `-active` - Active (descending)\n* `soc` - Soc\n* `-soc` - Soc (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"soc","schema":{"type":"boolean"}},{"in":"query","name":"static_tool","schema":{"type":"boolean"}}],"tags":["test_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedTestTypeList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"test_types_create","tags":["test_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestTypeCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TestTypeCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TestTypeCreateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestTypeCreate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/test_types/{id}/":{"get":{"operationId":"test_types_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test_ type.","required":true}],"tags":["test_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"test_types_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test_ type.","required":true}],"tags":["test_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TestTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TestTypeRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"test_types_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test_ type.","required":true}],"tags":["test_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedTestTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedTestTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedTestTypeRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/test_types/{id}/history/":{"get":{"operationId":"test_types_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"dynamic_tool","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test_ type.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"in_use","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_ends","schema":{"type":"string"}},{"in":"query","name":"name_starts","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active","-active_findings_count","-dynamic_tool","-id","-name","-soc","-static_tool","-verified_findings_count","active","active_findings_count","dynamic_tool","id","name","soc","static_tool","verified_findings_count"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `active_findings_count` - Active findings count\n* `-active_findings_count` - Active findings count (descending)\n* `verified_findings_count` - Verified findings count\n* `-verified_findings_count` - Verified findings count (descending)\n* `static_tool` - Static tool\n* `-static_tool` - Static tool (descending)\n* `dynamic_tool` - Dynamic tool\n* `-dynamic_tool` - Dynamic tool (descending)\n* `active` - Active\n* `-active` - Active (descending)\n* `soc` - Soc\n* `-soc` - Soc (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"soc","schema":{"type":"boolean"}},{"in":"query","name":"static_tool","schema":{"type":"boolean"}}],"tags":["test_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/test_types/{id}/history/legacy/":{"get":{"operationId":"test_types_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"active","schema":{"type":"boolean"}},{"in":"query","name":"dynamic_tool","schema":{"type":"boolean"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test_ type.","required":true},{"in":"query","name":"id","schema":{"type":"array","items":{"type":"integer"}},"description":"Multiple values may be separated by commas.","explode":false,"style":"form"},{"in":"query","name":"in_use","schema":{"type":"boolean"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"in":"query","name":"name_ends","schema":{"type":"string"}},{"in":"query","name":"name_starts","schema":{"type":"string"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-active","-active_findings_count","-dynamic_tool","-id","-name","-soc","-static_tool","-verified_findings_count","active","active_findings_count","dynamic_tool","id","name","soc","static_tool","verified_findings_count"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `name` - Name\n* `-name` - Name (descending)\n* `active_findings_count` - Active findings count\n* `-active_findings_count` - Active findings count (descending)\n* `verified_findings_count` - Verified findings count\n* `-verified_findings_count` - Verified findings count (descending)\n* `static_tool` - Static tool\n* `-static_tool` - Static tool (descending)\n* `dynamic_tool` - Dynamic tool\n* `-dynamic_tool` - Dynamic tool (descending)\n* `active` - Active\n* `-active` - Active (descending)\n* `soc` - Soc\n* `-soc` - Soc (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"soc","schema":{"type":"boolean"}},{"in":"query","name":"static_tool","schema":{"type":"boolean"}}],"tags":["test_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/test_types/{id}/history/legacy/count/":{"get":{"operationId":"test_types_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test_ type.","required":true}],"tags":["test_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/":{"get":{"operationId":"tests_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"api_scan_configuration","schema":{"type":"integer"}},{"in":"query","name":"branch_tag","schema":{"type":"string"}},{"in":"query","name":"build_id","schema":{"type":"string"}},{"in":"query","name":"commit_hash","schema":{"type":"string"}},{"in":"query","name":"deduplication","schema":{"type":"boolean"},"description":"deduplication"},{"in":"query","name":"engagement","schema":{"type":"integer"}},{"in":"query","name":"engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on Asset (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"engagement__product__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on Asset","explode":false,"style":"form"},{"in":"query","name":"engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on engagement (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"engagement__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on engagement","explode":false,"style":"form"},{"in":"query","name":"false_positive_history","schema":{"type":"boolean"},"description":"false_positive_history"},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"not_engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"not_engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on engagement","explode":false,"style":"form"},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"notes","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-api_scan_configuration","-branch_tag","-build_id","-commit_hash","-created","-engagement","-lead","-target_end","-target_start","-test_type","-title","-updated","-version","api_scan_configuration","branch_tag","build_id","commit_hash","created","engagement","lead","target_end","target_start","test_type","title","updated","version"]}},"description":"Ordering\n\n* `title` - Title\n* `-title` - Title (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `target_start` - Target start\n* `-target_start` - Target start (descending)\n* `target_end` - Target end\n* `-target_end` - Target end (descending)\n* `test_type` - Test type\n* `-test_type` - Test type (descending)\n* `lead` - Lead\n* `-lead` - Lead (descending)\n* `branch_tag` - Branch tag\n* `-branch_tag` - Branch tag (descending)\n* `build_id` - Build id\n* `-build_id` - Build id (descending)\n* `commit_hash` - Commit hash\n* `-commit_hash` - Commit hash (descending)\n* `api_scan_configuration` - Api scan configuration\n* `-api_scan_configuration` - Api scan configuration (descending)\n* `engagement` - Engagement\n* `-engagement` - Engagement (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"percent_complete","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["api_scan_configuration","engagement","environment","files","lead","notes","test_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"processing","schema":{"type":"boolean"},"description":"processing"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"scan_type","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"target_end","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"target_start","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"test_type","schema":{"type":"integer"}},{"in":"query","name":"title","schema":{"type":"string"}},{"in":"query","name":"version","schema":{"type":"string"}}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedTestsList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"tests_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["tests"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TestCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TestCreateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestCreate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/":{"get":{"operationId":"tests_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["api_scan_configuration","engagement","environment","files","lead","notes","test_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tests"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"tests_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TestsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/TestsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tests"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"tests_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedTestsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedTestsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedTestsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tests"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"tests_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/accept_risks/":{"post":{"operationId":"tests_accept_risks_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AcceptedRiskRequest"}}},"application/x-www-form-urlencoded":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AcceptedRiskRequest"}}},"multipart/form-data":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AcceptedRiskRequest"}}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RiskAcceptance"}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/delete_preview/":{"get":{"operationId":"tests_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/files/":{"get":{"operationId":"tests_files_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestToFiles"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"tests_files_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AddNewFileOptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/files/{file_id}/":{"delete":{"operationId":"tests_files_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"file_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/files/change_name/{file_id}/":{"patch":{"operationId":"tests_files_change_name_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"file_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedFileNameRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedFileNameRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedFileNameRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/files/download/{file_id}/":{"get":{"operationId":"tests_files_download_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"file_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RawFile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/finding_diff/{other_id}/":{"get":{"operationId":"tests_finding_diff_retrieve","description":"Compares the findings associated with the two objects and returns\nadded, removed, equality, and improvement information.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true},{"in":"path","name":"other_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindingDiff"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/generate_report/":{"post":{"operationId":"tests_generate_report_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ReportGenerateOptionRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportGenerate"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/history/":{"get":{"operationId":"tests_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"api_scan_configuration","schema":{"type":"integer"}},{"in":"query","name":"branch_tag","schema":{"type":"string"}},{"in":"query","name":"build_id","schema":{"type":"string"}},{"in":"query","name":"commit_hash","schema":{"type":"string"}},{"in":"query","name":"deduplication","schema":{"type":"boolean"},"description":"deduplication"},{"in":"query","name":"engagement","schema":{"type":"integer"}},{"in":"query","name":"engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on Asset (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"engagement__product__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on Asset","explode":false,"style":"form"},{"in":"query","name":"engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on engagement (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"engagement__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on engagement","explode":false,"style":"form"},{"in":"query","name":"false_positive_history","schema":{"type":"boolean"},"description":"false_positive_history"},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"not_engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"not_engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on engagement","explode":false,"style":"form"},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"notes","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-api_scan_configuration","-branch_tag","-build_id","-commit_hash","-created","-engagement","-lead","-target_end","-target_start","-test_type","-title","-updated","-version","api_scan_configuration","branch_tag","build_id","commit_hash","created","engagement","lead","target_end","target_start","test_type","title","updated","version"]}},"description":"Ordering\n\n* `title` - Title\n* `-title` - Title (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `target_start` - Target start\n* `-target_start` - Target start (descending)\n* `target_end` - Target end\n* `-target_end` - Target end (descending)\n* `test_type` - Test type\n* `-test_type` - Test type (descending)\n* `lead` - Lead\n* `-lead` - Lead (descending)\n* `branch_tag` - Branch tag\n* `-branch_tag` - Branch tag (descending)\n* `build_id` - Build id\n* `-build_id` - Build id (descending)\n* `commit_hash` - Commit hash\n* `-commit_hash` - Commit hash (descending)\n* `api_scan_configuration` - Api scan configuration\n* `-api_scan_configuration` - Api scan configuration (descending)\n* `engagement` - Engagement\n* `-engagement` - Engagement (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"percent_complete","schema":{"type":"integer"}},{"in":"query","name":"processing","schema":{"type":"boolean"},"description":"processing"},{"in":"query","name":"scan_type","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"target_end","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"target_start","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"test_type","schema":{"type":"integer"}},{"in":"query","name":"title","schema":{"type":"string"}},{"in":"query","name":"version","schema":{"type":"string"}}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/history/legacy/":{"get":{"operationId":"tests_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"api_scan_configuration","schema":{"type":"integer"}},{"in":"query","name":"branch_tag","schema":{"type":"string"}},{"in":"query","name":"build_id","schema":{"type":"string"}},{"in":"query","name":"commit_hash","schema":{"type":"string"}},{"in":"query","name":"deduplication","schema":{"type":"boolean"},"description":"deduplication"},{"in":"query","name":"engagement","schema":{"type":"integer"}},{"in":"query","name":"engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on Asset (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"engagement__product__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on Asset","explode":false,"style":"form"},{"in":"query","name":"engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags present on engagement (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"engagement__tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression present on engagement","explode":false,"style":"form"},{"in":"query","name":"false_positive_history","schema":{"type":"boolean"},"description":"false_positive_history"},{"in":"query","name":"has_tags","schema":{"type":"boolean"},"description":"Has tags"},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"not_engagement__product__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on Asset","explode":false,"style":"form"},{"in":"query","name":"not_engagement__tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on engagement","explode":false,"style":"form"},{"in":"query","name":"not_tag","schema":{"type":"string"},"description":"Not Tag name contains"},{"in":"query","name":"not_tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags not present on model","explode":false,"style":"form"},{"in":"query","name":"notes","schema":{"type":"array","items":{"type":"integer"}},"explode":true,"style":"form"},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-api_scan_configuration","-branch_tag","-build_id","-commit_hash","-created","-engagement","-lead","-target_end","-target_start","-test_type","-title","-updated","-version","api_scan_configuration","branch_tag","build_id","commit_hash","created","engagement","lead","target_end","target_start","test_type","title","updated","version"]}},"description":"Ordering\n\n* `title` - Title\n* `-title` - Title (descending)\n* `version` - Version\n* `-version` - Version (descending)\n* `target_start` - Target start\n* `-target_start` - Target start (descending)\n* `target_end` - Target end\n* `-target_end` - Target end (descending)\n* `test_type` - Test type\n* `-test_type` - Test type (descending)\n* `lead` - Lead\n* `-lead` - Lead (descending)\n* `branch_tag` - Branch tag\n* `-branch_tag` - Branch tag (descending)\n* `build_id` - Build id\n* `-build_id` - Build id (descending)\n* `commit_hash` - Commit hash\n* `-commit_hash` - Commit hash (descending)\n* `api_scan_configuration` - Api scan configuration\n* `-api_scan_configuration` - Api scan configuration (descending)\n* `engagement` - Engagement\n* `-engagement` - Engagement (descending)\n* `created` - Created\n* `-created` - Created (descending)\n* `updated` - Updated\n* `-updated` - Updated (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"percent_complete","schema":{"type":"integer"}},{"in":"query","name":"processing","schema":{"type":"boolean"},"description":"processing"},{"in":"query","name":"scan_type","schema":{"type":"string"}},{"in":"query","name":"tag","schema":{"type":"string"},"description":"Tag name contains"},{"in":"query","name":"tags","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags (uses OR for multiple values)","explode":false,"style":"form"},{"in":"query","name":"tags__and","schema":{"type":"array","items":{"type":"string"}},"description":"Comma separated list of exact tags to match with an AND expression","explode":false,"style":"form"},{"in":"query","name":"target_end","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"target_start","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"test_type","schema":{"type":"integer"}},{"in":"query","name":"title","schema":{"type":"string"}},{"in":"query","name":"version","schema":{"type":"string"}}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/history/legacy/count/":{"get":{"operationId":"tests_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tests/{id}/notes/":{"get":{"operationId":"tests_notes_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestToNotes"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"tests_notes_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this test.","required":true}],"tags":["tests"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AddNewNoteOptionRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Note"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/threat_models/":{"get":{"operationId":"threat_models_list","description":"Read threat models; create, cancel, download, push and delete generations.\n\nRead-only plus delete rather than a full ModelViewSet: a threat model is\ngenerated, never hand-edited, so there is no update path. ``create`` is overridden\nto start a generation and return the run rather than write a model directly, and\n``DestroyModelMixin`` supplies the delete that ``destroy`` below authorizes.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["threat_models"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedThreatModelListList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"threat_models_create","description":"Start a threat-model generation from a design document, text, and/or diagram.","tags":["threat_models"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatModelCreateRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ThreatModelCreateRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ThreatModelCreateRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatModelRun"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/threat_models/{id}/":{"get":{"operationId":"threat_models_retrieve","description":"Read threat models; create, cancel, download, push and delete generations.\n\nRead-only plus delete rather than a full ModelViewSet: a threat model is\ngenerated, never hand-edited, so there is no update path. ``create`` is overridden\nto start a generation and return the run rather than write a model directly, and\n``DestroyModelMixin`` supplies the delete that ``destroy`` below authorizes.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this threat model.","required":true}],"tags":["threat_models"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatModelDetail"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"threat_models_destroy","description":"Read threat models; create, cancel, download, push and delete generations.\n\nRead-only plus delete rather than a full ModelViewSet: a threat model is\ngenerated, never hand-edited, so there is no update path. ``create`` is overridden\nto start a generation and return the run rather than write a model directly, and\n``DestroyModelMixin`` supplies the delete that ``destroy`` below authorizes.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this threat model.","required":true}],"tags":["threat_models"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/threat_models/{id}/download/":{"get":{"operationId":"threat_models_download_retrieve","description":"Download the threat model as JSON or Markdown.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this threat model.","required":true}],"tags":["threat_models"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/threat_models/{id}/push_findings/":{"post":{"operationId":"threat_models_push_findings_create","description":"Create or update DefectDojo findings from this threat model's security requirements.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this threat model.","required":true}],"tags":["threat_models"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushFindingsRequestRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PushFindingsRequestRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PushFindingsRequestRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PushFindingsResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/threat_models/quota/":{"get":{"operationId":"threat_models_quota_retrieve","description":"Where this instance stands against its licensed threat-model generations: used, limit, generations queued or running, and whether a new one may start.","tags":["threat_models"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeteredRunQuota"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/threat_models/runs/":{"get":{"operationId":"threat_models_runs_list","description":"List threat-model generation runs for products you can view.","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["threat_models"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedThreatModelRunList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/threat_models/runs/{run_id}/":{"get":{"operationId":"threat_models_runs_retrieve","description":"Poll one generation run's status and stage progress.","parameters":[{"in":"path","name":"run_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true}],"tags":["threat_models"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatModelRun"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/threat_models/runs/{run_id}/cancel/":{"post":{"operationId":"threat_models_runs_cancel_create","description":"Cancel a queued or running generation.","parameters":[{"in":"path","name":"run_id","schema":{"type":"string","pattern":"^\\d+$"},"required":true}],"tags":["threat_models"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ThreatModelRun"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_configurations/":{"get":{"operationId":"tool_configurations_list","parameters":[{"in":"query","name":"authentication_type","schema":{"type":"string","x-spec-enum-id":"e1a582895a9e03b4","nullable":true,"enum":["API","Password","SSH"]},"description":"* `API` - API Key\n* `Password` - Username/Password\n* `SSH` - SSH"},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["tool_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"tool_type","schema":{"type":"integer"}},{"in":"query","name":"url","schema":{"type":"string"}}],"tags":["tool_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedToolConfigurationList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"tool_configurations_create","tags":["tool_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ToolConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ToolConfigurationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_configurations/{id}/":{"get":{"operationId":"tool_configurations_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ configuration.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["tool_type"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["tool_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"tool_configurations_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ configuration.","required":true}],"tags":["tool_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ToolConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ToolConfigurationRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"tool_configurations_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ configuration.","required":true}],"tags":["tool_configurations"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedToolConfigurationRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedToolConfigurationRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedToolConfigurationRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolConfiguration"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"tool_configurations_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ configuration.","required":true}],"tags":["tool_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_configurations/{id}/delete_preview/":{"get":{"operationId":"tool_configurations_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ configuration.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["tool_configurations"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_insights/epss_score_by_tool/":{"get":{"operationId":"tool_insights_epss_score_by_tool_retrieve","description":"the average epss score across all findings, grouped by test type name","tags":["tool_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_insights/false_positive_by_tool/":{"get":{"operationId":"tool_insights_false_positive_by_tool_retrieve","description":"the total number of false postive findings, grouped by test type name","tags":["tool_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_insights/severity_by_tool_over_time/":{"get":{"operationId":"tool_insights_severity_by_tool_over_time_retrieve","description":"the total number of findings by severity, imported by a tool, grouped by\nmonth","tags":["tool_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_insights/severity_by_tool_over_time_counts/":{"get":{"operationId":"tool_insights_severity_by_tool_over_time_counts_retrieve","description":"the total number of findings by severity to display as a cumulative sum\nwithin the severity by tool monthly table","tags":["tool_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_insights/tools_in_use_count/":{"get":{"operationId":"tool_insights_tools_in_use_count_retrieve","description":"the total number of tools currently in use (i.e. some number of findings have\nthis tool type as a test type)","tags":["tool_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_insights/top_ten_tools_by_severity/":{"get":{"operationId":"tool_insights_top_ten_tools_by_severity_retrieve","description":"the total number of findings by severity within a given test type, grouped\nby test type name","tags":["tool_insights"],"security":[{"tokenAuth":[]}],"responses":{"200":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_product_settings/":{"get":{"operationId":"tool_product_settings_list","parameters":[{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["notes","product","tool_configuration"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"product","schema":{"type":"integer"}},{"in":"query","name":"tool_configuration","schema":{"type":"integer"}},{"in":"query","name":"tool_project_id","schema":{"type":"string"}},{"in":"query","name":"url","schema":{"type":"string"}}],"tags":["tool_product_settings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedToolProductSettingsList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"tool_product_settings_create","tags":["tool_product_settings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolProductSettingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ToolProductSettingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ToolProductSettingsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolProductSettings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_product_settings/{id}/":{"get":{"operationId":"tool_product_settings_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ product_ settings.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["notes","product","tool_configuration"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["tool_product_settings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolProductSettings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"tool_product_settings_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ product_ settings.","required":true}],"tags":["tool_product_settings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolProductSettingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ToolProductSettingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ToolProductSettingsRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolProductSettings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"tool_product_settings_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ product_ settings.","required":true}],"tags":["tool_product_settings"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedToolProductSettingsRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedToolProductSettingsRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedToolProductSettingsRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolProductSettings"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"tool_product_settings_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ product_ settings.","required":true}],"tags":["tool_product_settings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_product_settings/{id}/delete_preview/":{"get":{"operationId":"tool_product_settings_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ product_ settings.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["tool_product_settings"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_types/":{"get":{"operationId":"tool_types_list","parameters":[{"in":"query","name":"description","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"name","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["tool_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedToolTypeList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"tool_types_create","tags":["tool_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ToolTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ToolTypeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_types/{id}/":{"get":{"operationId":"tool_types_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ type.","required":true}],"tags":["tool_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"tool_types_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ type.","required":true}],"tags":["tool_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ToolTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ToolTypeRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"tool_types_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ type.","required":true}],"tags":["tool_types"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedToolTypeRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedToolTypeRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedToolTypeRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolType"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"tool_types_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ type.","required":true}],"tags":["tool_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/tool_types/{id}/delete_preview/":{"get":{"operationId":"tool_types_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this tool_ type.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["tool_types"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/url/":{"get":{"operationId":"url_list","description":"A simple ViewSet for viewing and editing Locations.","parameters":[{"in":"query","name":"fragment_contains","schema":{"type":"string"},"description":"Fragment: Contains"},{"in":"query","name":"fragment_ends_with","schema":{"type":"string"},"description":"Fragment: Ends With"},{"in":"query","name":"fragment_exact","schema":{"type":"string"},"description":"Fragment: Exact Match"},{"in":"query","name":"fragment_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Fragment: Included in List","explode":false,"style":"form"},{"in":"query","name":"fragment_not_contains","schema":{"type":"string"},"description":"Fragment: Not Contains"},{"in":"query","name":"fragment_not_exact","schema":{"type":"string"},"description":"Fragment: Not Exact Match"},{"in":"query","name":"fragment_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Fragment: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"fragment_starts_with","schema":{"type":"string"},"description":"Fragment: Starts With"},{"in":"query","name":"host","schema":{"type":"string"},"description":"Host: Exact Match"},{"in":"query","name":"host_contains","schema":{"type":"string"},"description":"Host: Contains"},{"in":"query","name":"host_ends_with","schema":{"type":"string"},"description":"Host: Ends With"},{"in":"query","name":"host_exact","schema":{"type":"string"},"description":"Host: Exact Match"},{"in":"query","name":"host_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Host: Included in List","explode":false,"style":"form"},{"in":"query","name":"host_not_contains","schema":{"type":"string"},"description":"Host: Not Contains"},{"in":"query","name":"host_not_exact","schema":{"type":"string"},"description":"Host: Not Exact Match"},{"in":"query","name":"host_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Host: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"host_starts_with","schema":{"type":"string"},"description":"Host: Starts With"},{"in":"query","name":"id_equals","schema":{"type":"integer"},"description":"ID: Equals"},{"in":"query","name":"id_greater_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Greater Than or Equal To"},{"in":"query","name":"id_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"id_less_than_or_equal_to","schema":{"type":"integer"},"description":"ID: Less Than or Equal To"},{"in":"query","name":"id_not_equals","schema":{"type":"integer"},"description":"ID: Not Equals"},{"in":"query","name":"id_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"ID: Not Included in List","explode":false,"style":"form"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"location__created_at_contains","schema":{"type":"string"},"description":"Created At: Contains"},{"in":"query","name":"location__created_at_ends_with","schema":{"type":"string"},"description":"Created At: Ends With"},{"in":"query","name":"location__created_at_exact","schema":{"type":"string"},"description":"Created At: Exact Match"},{"in":"query","name":"location__created_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_not_contains","schema":{"type":"string"},"description":"Created At: Not Contains"},{"in":"query","name":"location__created_at_not_exact","schema":{"type":"string"},"description":"Created At: Not Exact Match"},{"in":"query","name":"location__created_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Created At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__created_at_starts_with","schema":{"type":"string"},"description":"Created At: Starts With"},{"in":"query","name":"location__findings__finding_equals","schema":{"type":"integer"},"description":"Finding ID: Equals"},{"in":"query","name":"location__findings__finding_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Greater Than or Equal To"},{"in":"query","name":"location__findings__finding_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__findings__finding_less_than_or_equal_to","schema":{"type":"integer"},"description":"Finding ID: Less Than or Equal To"},{"in":"query","name":"location__findings__finding_not_equals","schema":{"type":"integer"},"description":"Finding ID: Not Equals"},{"in":"query","name":"location__findings__finding_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Finding ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_equals","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"location__products__product_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Greater Than or Equal To"},{"in":"query","name":"location__products__product_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__products__product_less_than_or_equal_to","schema":{"type":"integer"},"description":"Product ID: Less Than or Equal To"},{"in":"query","name":"location__products__product_not_equals","schema":{"type":"integer"},"description":"Product ID: Not Equals"},{"in":"query","name":"location__products__product_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Product ID: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_contains","schema":{"type":"string"},"description":"Tags: Contains"},{"in":"query","name":"location__tags__name_ends_with","schema":{"type":"string"},"description":"Tags: Ends With"},{"in":"query","name":"location__tags__name_exact","schema":{"type":"string"},"description":"Tags: Exact Match"},{"in":"query","name":"location__tags__name_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_not_contains","schema":{"type":"string"},"description":"Tags: Not Contains"},{"in":"query","name":"location__tags__name_not_exact","schema":{"type":"string"},"description":"Tags: Not Exact Match"},{"in":"query","name":"location__tags__name_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Tags: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__tags__name_starts_with","schema":{"type":"string"},"description":"Tags: Starts With"},{"in":"query","name":"location__updated_at_contains","schema":{"type":"string"},"description":"Updated At: Contains"},{"in":"query","name":"location__updated_at_ends_with","schema":{"type":"string"},"description":"Updated At: Ends With"},{"in":"query","name":"location__updated_at_exact","schema":{"type":"string"},"description":"Updated At: Exact Match"},{"in":"query","name":"location__updated_at_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_not_contains","schema":{"type":"string"},"description":"Updated At: Not Contains"},{"in":"query","name":"location__updated_at_not_exact","schema":{"type":"string"},"description":"Updated At: Not Exact Match"},{"in":"query","name":"location__updated_at_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Updated At: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"location__updated_at_starts_with","schema":{"type":"string"},"description":"Updated At: Starts With"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"ordering","schema":{"type":"array","items":{"type":"string","enum":["-active_findings","-created_at","-fragment","-host","-id","-path","-port","-protocol","-query","-updated_at","-user_info","active_findings","created_at","fragment","host","id","path","port","protocol","query","updated_at","user_info"]}},"description":"Ordering\n\n* `id` - Id\n* `-id` - Id (descending)\n* `protocol` - Protocol\n* `-protocol` - Protocol (descending)\n* `host` - Host\n* `-host` - Host (descending)\n* `user_info` - User info\n* `-user_info` - User info (descending)\n* `path` - Path\n* `-path` - Path (descending)\n* `port` - Port\n* `-port` - Port (descending)\n* `query` - Query\n* `-query` - Query (descending)\n* `fragment` - Fragment\n* `-fragment` - Fragment (descending)\n* `created_at` - Created at\n* `-created_at` - Created at (descending)\n* `updated_at` - Updated at\n* `-updated_at` - Updated at (descending)\n* `active_findings` - Active findings\n* `-active_findings` - Active findings (descending)","explode":false,"style":"form"},{"in":"query","name":"path_contains","schema":{"type":"string"},"description":"Path: Contains"},{"in":"query","name":"path_ends_with","schema":{"type":"string"},"description":"Path: Ends With"},{"in":"query","name":"path_exact","schema":{"type":"string"},"description":"Path: Exact Match"},{"in":"query","name":"path_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Path: Included in List","explode":false,"style":"form"},{"in":"query","name":"path_not_contains","schema":{"type":"string"},"description":"Path: Not Contains"},{"in":"query","name":"path_not_exact","schema":{"type":"string"},"description":"Path: Not Exact Match"},{"in":"query","name":"path_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Path: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"path_starts_with","schema":{"type":"string"},"description":"Path: Starts With"},{"in":"query","name":"port_equals","schema":{"type":"integer"},"description":"Port: Equals"},{"in":"query","name":"port_greater_than_or_equal_to","schema":{"type":"integer"},"description":"Port: Greater Than or Equal To"},{"in":"query","name":"port_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Port: Included in List","explode":false,"style":"form"},{"in":"query","name":"port_less_than_or_equal_to","schema":{"type":"integer"},"description":"Port: Less Than or Equal To"},{"in":"query","name":"port_not_equals","schema":{"type":"integer"},"description":"Port: Not Equals"},{"in":"query","name":"port_not_includes","schema":{"type":"array","items":{"type":"integer"}},"description":"Port: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"product","schema":{"type":"integer"},"description":"Product ID: Equals"},{"in":"query","name":"protocol_contains","schema":{"type":"string"},"description":"Protocol: Contains"},{"in":"query","name":"protocol_ends_with","schema":{"type":"string"},"description":"Protocol: Ends With"},{"in":"query","name":"protocol_exact","schema":{"type":"string"},"description":"Protocol: Exact Match"},{"in":"query","name":"protocol_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Protocol: Included in List","explode":false,"style":"form"},{"in":"query","name":"protocol_not_contains","schema":{"type":"string"},"description":"Protocol: Not Contains"},{"in":"query","name":"protocol_not_exact","schema":{"type":"string"},"description":"Protocol: Not Exact Match"},{"in":"query","name":"protocol_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Protocol: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"protocol_starts_with","schema":{"type":"string"},"description":"Protocol: Starts With"},{"in":"query","name":"query_contains","schema":{"type":"string"},"description":"Query Parameters: Contains"},{"in":"query","name":"query_ends_with","schema":{"type":"string"},"description":"Query Parameters: Ends With"},{"in":"query","name":"query_exact","schema":{"type":"string"},"description":"Query Parameters: Exact Match"},{"in":"query","name":"query_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Query Parameters: Included in List","explode":false,"style":"form"},{"in":"query","name":"query_not_contains","schema":{"type":"string"},"description":"Query Parameters: Not Contains"},{"in":"query","name":"query_not_exact","schema":{"type":"string"},"description":"Query Parameters: Not Exact Match"},{"in":"query","name":"query_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"Query Parameters: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"query_starts_with","schema":{"type":"string"},"description":"Query Parameters: Starts With"},{"in":"query","name":"user_info_contains","schema":{"type":"string"},"description":"User Info: Contains"},{"in":"query","name":"user_info_ends_with","schema":{"type":"string"},"description":"User Info: Ends With"},{"in":"query","name":"user_info_exact","schema":{"type":"string"},"description":"User Info: Exact Match"},{"in":"query","name":"user_info_includes","schema":{"type":"array","items":{"type":"string"}},"description":"User Info: Included in List","explode":false,"style":"form"},{"in":"query","name":"user_info_not_contains","schema":{"type":"string"},"description":"User Info: Not Contains"},{"in":"query","name":"user_info_not_exact","schema":{"type":"string"},"description":"User Info: Not Exact Match"},{"in":"query","name":"user_info_not_includes","schema":{"type":"array","items":{"type":"string"}},"description":"User Info: Not Included in List","explode":false,"style":"form"},{"in":"query","name":"user_info_starts_with","schema":{"type":"string"},"description":"User Info: Starts With"}],"tags":["url"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedURLList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"url_create","description":"A simple ViewSet for viewing and editing Locations.","tags":["url"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/URLRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/URLRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/URLRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/URL"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/url/{id}/":{"get":{"operationId":"url_retrieve","description":"A simple ViewSet for viewing and editing Locations.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - URL.","required":true}],"tags":["url"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/URL"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"url_update","description":"A simple ViewSet for viewing and editing Locations.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - URL.","required":true}],"tags":["url"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/URLRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/URLRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/URLRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/URL"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"url_partial_update","description":"A simple ViewSet for viewing and editing Locations.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - URL.","required":true}],"tags":["url"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedURLRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedURLRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedURLRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/URL"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"url_destroy","description":"A simple ViewSet for viewing and editing Locations.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - URL.","required":true}],"tags":["url"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/url/{id}/delete_preview/":{"get":{"operationId":"url_delete_preview_list","description":"A simple ViewSet for viewing and editing Locations.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this Locations - URL.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["url"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/usage_records/":{"get":{"operationId":"usage_records_list","description":"Read-only list of usage metering events (imports, reimports, bulk deletes).","parameters":[{"in":"query","name":"event_type","schema":{"type":"string","x-spec-enum-id":"656e144ba8adc7f3","enum":["bulk_finding_delete","import","import_preview","reimport","reimport_preview","sensei_agent_target","sensei_ai_triage","sensei_assistant","sensei_cloud_account","sensei_dast","sensei_dast_triage","sensei_fix","sensei_recommendations","sensei_repo","sensei_threat_model"]},"description":"* `import` - Import\n* `reimport` - Reimport\n* `import_preview` - Import Preview\n* `reimport_preview` - Reimport Preview\n* `bulk_finding_delete` - Bulk finding delete\n* `sensei_repo` - Sensei Repo Onboarded\n* `sensei_fix` - Sensei Fix Applied\n* `sensei_threat_model` - Sensei Threat Model Generated\n* `sensei_cloud_account` - Sensei Cloud Account Onboarded\n* `sensei_agent_target` - Sensei Agent Target Onboarded\n* `sensei_recommendations` - Sensei Advisor Run Completed\n* `sensei_dast` - Sensei DAST Target Onboarded\n* `sensei_dast_triage` - Sensei DAST Findings Triaged\n* `sensei_ai_triage` - Sensei AI Triage Findings Reviewed\n* `sensei_assistant` - Ask Sensei Answer"},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"in":"query","name":"product_id","schema":{"type":"integer"}},{"name":"search","required":false,"in":"query","description":"A search term.","schema":{"type":"string"}},{"in":"query","name":"timestamp_after","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"timestamp_before","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"user_id","schema":{"type":"integer"}}],"tags":["usage_records"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedUsageRecordList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/usage_records/{id}/":{"get":{"operationId":"usage_records_retrieve","description":"Read-only list of usage metering events (imports, reimports, bulk deletes).","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this usage record.","required":true}],"tags":["usage_records"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageRecord"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/user_contact_infos/":{"get":{"operationId":"user_contact_infos_list","parameters":[{"in":"query","name":"block_execution","schema":{"type":"boolean"}},{"in":"query","name":"cell_number","schema":{"type":"string"}},{"in":"query","name":"deduplication_execution_mode","schema":{"type":"string","x-spec-enum-id":"bf7fb8ff28520a46","nullable":true,"enum":["async","async_wait","sync"]},"description":"Controls how import/reimport deduplication post-processing is executed. 'Async' dispatches it to the background and returns immediately (default). 'Async, wait for deduplication' dispatches to the background but waits for deduplication to finish before responding, so notifications and statistics reflect the deduplicated state. 'Synchronous' runs the import deduplication inline. Can be overridden per request. Independent of block_execution, which forces all async tasks (notifications, jira, ...) to the foreground.\n\n* `async` - Async (do not wait)\n* `async_wait` - Async, wait for deduplication\n* `sync` - Synchronous (block)"},{"in":"query","name":"force_password_reset","schema":{"type":"boolean"}},{"in":"query","name":"github_username","schema":{"type":"string"}},{"in":"query","name":"language","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"password_last_reset","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"phone_number","schema":{"type":"string"}},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"},{"in":"query","name":"slack_user_id","schema":{"type":"string"}},{"in":"query","name":"slack_username","schema":{"type":"string"}},{"in":"query","name":"title","schema":{"type":"string"}},{"in":"query","name":"token_expiry","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"token_last_reset","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"twitter_username","schema":{"type":"string"}},{"in":"query","name":"user","schema":{"type":"integer"}}],"tags":["user_contact_infos"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedExtendedUserContactInfoList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"user_contact_infos_create","tags":["user_contact_infos"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendedUserContactInfoRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ExtendedUserContactInfoRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ExtendedUserContactInfoRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendedUserContactInfo"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/user_contact_infos/{id}/":{"get":{"operationId":"user_contact_infos_retrieve","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this user contact info.","required":true},{"in":"query","name":"prefetch","schema":{"type":"array","items":{"type":"string","enum":["user"]}},"description":"List of fields for which to prefetch model instances and add those to the response"}],"tags":["user_contact_infos"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendedUserContactInfo"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"user_contact_infos_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this user contact info.","required":true}],"tags":["user_contact_infos"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendedUserContactInfoRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/ExtendedUserContactInfoRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/ExtendedUserContactInfoRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendedUserContactInfo"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"user_contact_infos_partial_update","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this user contact info.","required":true}],"tags":["user_contact_infos"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedExtendedUserContactInfoRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedExtendedUserContactInfoRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedExtendedUserContactInfoRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendedUserContactInfo"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"user_contact_infos_destroy","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this user contact info.","required":true}],"tags":["user_contact_infos"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/user_contact_infos/{id}/delete_preview/":{"get":{"operationId":"user_contact_infos_delete_preview_list","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this user contact info.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["user_contact_infos"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/user_profile/":{"get":{"operationId":"user_profile_retrieve","description":"Pro override of the OSS ``/api/v2/user_profile/`` endpoint.\n\nMirrors OSS ``UserProfileView`` but repopulates the RBAC nested fields that\nthe OSS serializer no longer exposes. Registered ahead of the OSS route via\n``urlpatterns_preload`` so it takes precedence.","tags":["user_profile"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProUserProfile"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/users/":{"get":{"operationId":"users_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"query","name":"date_joined_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"date_joined_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"email","schema":{"type":"string"}},{"in":"query","name":"first_name","schema":{"type":"string"}},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"is_active","schema":{"type":"boolean"}},{"in":"query","name":"is_superuser","schema":{"type":"boolean"}},{"in":"query","name":"last_login_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"last_login_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"last_name","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-date_joined","-email","-first_name","-is_active","-is_superuser","-last_login","-last_name","-username","date_joined","email","first_name","is_active","is_superuser","last_login","last_name","username"]}},"description":"Ordering\n\n* `username` - Username\n* `-username` - Username (descending)\n* `last_name` - Last name\n* `-last_name` - Last name (descending)\n* `first_name` - First name\n* `-first_name` - First name (descending)\n* `email` - Email\n* `-email` - Email (descending)\n* `is_active` - Is active\n* `-is_active` - Is active (descending)\n* `is_superuser` - Is superuser\n* `-is_superuser` - Is superuser (descending)\n* `date_joined` - Date joined\n* `-date_joined` - Date joined (descending)\n* `last_login` - Last login\n* `-last_login` - Last login (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"},{"in":"query","name":"username","schema":{"type":"string"}}],"tags":["users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedEnhancedUserList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"post":{"operationId":"users_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","tags":["users"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedUserRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedUserRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedUserRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedUser"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/users/{id}/":{"get":{"operationId":"users_retrieve","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ user.","required":true},{"in":"query","name":"response_fields","schema":{"type":"string"},"description":"Comma-separated list of fields to include in the response (ex. field_a,field_b)"}],"tags":["users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedUser"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"put":{"operationId":"users_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ user.","required":true}],"tags":["users"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedUserRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedUserRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedUserRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedUser"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"patch":{"operationId":"users_partial_update","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ user.","required":true}],"tags":["users"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedUserRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedUserRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PatchedEnhancedUserRequest"}}}},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedUser"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}},"delete":{"operationId":"users_destroy","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ user.","required":true}],"tags":["users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"204":{"description":"No response body"},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/users/{id}/delete_preview/":{"get":{"operationId":"users_delete_preview_list","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ user.","required":true},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}}],"tags":["users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDeletePreviewList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/users/{id}/history/":{"get":{"operationId":"users_history_list","description":"Get audit log entries for an object with pagination.\n\nUses DojoEvents.objects.tracks(obj) to get events for the object itself,\nand DojoEvents.objects.references(obj) to get events for related objects\n(objects with foreign keys pointing to this object), limited to history_event_models when the\nviewset sets it. Supports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.\n\nArgs:\n    field_filter: Optional field name to filter by (e.g., \"finding_enrichment_settings\").\n                Only entries with changes to this field will be returned.","parameters":[{"in":"query","name":"date_joined_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"date_joined_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"email","schema":{"type":"string"}},{"in":"query","name":"first_name","schema":{"type":"string"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ user.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"is_active","schema":{"type":"boolean"}},{"in":"query","name":"is_superuser","schema":{"type":"boolean"}},{"in":"query","name":"last_login_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"last_login_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"last_name","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-date_joined","-email","-first_name","-is_active","-is_superuser","-last_login","-last_name","-username","date_joined","email","first_name","is_active","is_superuser","last_login","last_name","username"]}},"description":"Ordering\n\n* `username` - Username\n* `-username` - Username (descending)\n* `last_name` - Last name\n* `-last_name` - Last name (descending)\n* `first_name` - First name\n* `-first_name` - First name (descending)\n* `email` - Email\n* `-email` - Email (descending)\n* `is_active` - Is active\n* `-is_active` - Is active (descending)\n* `is_superuser` - Is superuser\n* `-is_superuser` - Is superuser (descending)\n* `date_joined` - Date joined\n* `-date_joined` - Date joined (descending)\n* `last_login` - Last login\n* `-last_login` - Last login (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"username","schema":{"type":"string"}}],"tags":["users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/users/{id}/history/legacy/":{"get":{"operationId":"users_history_legacy_list","description":"Get legacy audit log for an object (django-auditlog entries) with pagination.\n\nSupports pagination, filtering, and sorting.\nAvailable at both /api/v2/ and /api/vue/ endpoints.","parameters":[{"in":"query","name":"date_joined_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"date_joined_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"email","schema":{"type":"string"}},{"in":"query","name":"first_name","schema":{"type":"string"}},{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ user.","required":true},{"in":"query","name":"id","schema":{"type":"integer"}},{"in":"query","name":"is_active","schema":{"type":"boolean"}},{"in":"query","name":"is_superuser","schema":{"type":"boolean"}},{"in":"query","name":"last_login_after","schema":{"type":"string","format":"date"}},{"in":"query","name":"last_login_before","schema":{"type":"string","format":"date"}},{"in":"query","name":"last_name","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"o","schema":{"type":"array","items":{"type":"string","enum":["-date_joined","-email","-first_name","-is_active","-is_superuser","-last_login","-last_name","-username","date_joined","email","first_name","is_active","is_superuser","last_login","last_name","username"]}},"description":"Ordering\n\n* `username` - Username\n* `-username` - Username (descending)\n* `last_name` - Last name\n* `-last_name` - Last name (descending)\n* `first_name` - First name\n* `-first_name` - First name (descending)\n* `email` - Email\n* `-email` - Email (descending)\n* `is_active` - Is active\n* `-is_active` - Is active (descending)\n* `is_superuser` - Is superuser\n* `-is_superuser` - Is superuser (descending)\n* `date_joined` - Date joined\n* `-date_joined` - Date joined (descending)\n* `last_login` - Last login\n* `-last_login` - Last login (descending)","explode":false,"style":"form"},{"name":"offset","required":false,"in":"query","description":"The initial index from which to return the results.","schema":{"type":"integer"}},{"in":"query","name":"username","schema":{"type":"string"}}],"tags":["users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedLegacyAuditLogList"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/users/{id}/history/legacy/count/":{"get":{"operationId":"users_history_legacy_count_retrieve","description":"Get the total count of legacy audit log entries for an object.\n\nApplies the same filters as history_legacy (date filter, LegacyAuditLogFilter)\nto ensure the count matches what users will see when viewing the legacy history page.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ user.","required":true}],"tags":["users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"}}}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/users/{id}/reset_api_token/":{"post":{"operationId":"users_reset_api_token_create","description":"View mixin that optimizes querysets based on the response_fields query parameter.\n\nWhen response_fields is specified on a GET request, this mixin:\n\n1. Strips all ``prefetch_related`` lookups and re-adds only those needed\n   by the requested fields.\n2. Applies ``.only()`` to limit the SQL SELECT to the model columns\n   actually required by the requested fields.\n\nThe ``prefetch=`` query param is a separate mechanism (the OSS ``_Prefetcher``\nserializes each named related object in FULL, once per row). Because step 1\nrebuilds prefetches from ``response_fields`` alone, it would otherwise throw\naway the relations that expansion reads, turning ``prefetch=<rel>`` into an\nN+1. ``prefetch_param_prefetch_map`` names, per expandable target, the\nprefetches its nested serialization needs; they are re-added whenever the\nparam asks for that target (and the target's own column is kept out of the\n``.only()`` deferral so the prefetch itself does not re-query it per row).\n\nColumn detection is automatic for concrete model fields (field name matches\nmodel field name). Only ``SerializerMethodField``s that access multiple\nmodel attributes need explicit entries in ``response_field_columns_map``.\n\nUsage::\n\n    class MyViewSet(ResponseFieldsOptimizationMixin, SomeBaseViewSet):\n        # Only needed for fields with prefetch dependencies\n        response_field_prefetch_map = {\n            \"tags\": [\"tags\"],\n            \"owners\": [\"enhancedfinding__owners\"],\n        }\n        # Only needed for SerializerMethodFields that access model columns.\n        # Concrete model fields and M2M/prefetch fields are auto-detected.\n        response_field_columns_map = {\n            \"display_status\": [\"active\", \"verified\", \"false_p\", ...],\n        }\n\n        def get_queryset(self):\n            return self.optimize_queryset(super().get_queryset())","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ user.","required":true}],"tags":["users"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedUserRequest"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/EnhancedUserRequest"}},"multipart/form-data":{"schema":{"$ref":"#/components/schemas/EnhancedUserRequest"}}},"required":true},"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnhancedUser"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}},"/api/v2/users/{id}/reset_mfa/":{"post":{"operationId":"users_reset_mfa_create","description":"Remove another user's MFA enrollment (their authenticator and recovery codes) so they can enroll again. Superusers only, and only while the admin_mfa_reset feature flag is on. `removed` is false when the user had no MFA enrolled.","parameters":[{"in":"path","name":"id","schema":{"type":"integer"},"description":"A unique integer value identifying this dojo_ user.","required":true}],"tags":["users"],"security":[{"cookieAuth":[]},{"tokenAuth":[]}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetMfaResponse"}}},"description":""},"401":{"description":"Not authenticated, credentials rejected, or the MCP is globally disabled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}},"403":{"description":"Permission denied, feature disabled, capability not licensed, or locked by an administrator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProErrorResponse"}}}}}}}},"components":{"schemas":{"AIAuthorizationVerdict":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","readOnly":true},"product_detail":{"type":"object","additionalProperties":{},"readOnly":true},"dependency":{"type":"integer","readOnly":true},"purl":{"type":"string","readOnly":true},"name":{"type":"string","readOnly":true},"category":{"type":"string","readOnly":true,"title":"AI Category","description":"The component's AI category on this asset when it was evaluated."},"decision":{"enum":["authorized","unauthorized","needs_review"],"type":"string","x-spec-enum-id":"2a99e4cc67012f7f","readOnly":true,"description":"The resolved authorization decision.\n\n* `authorized` - Authorized\n* `unauthorized` - Unauthorized\n* `needs_review` - Needs review"},"severity":{"enum":["Critical","High","Medium","Low","Info"],"type":"string","x-spec-enum-id":"fc5d16a20ed06136","readOnly":true,"description":"Severity of the Finding this verdict raises, when it raises one.\n\n* `Critical` - Critical\n* `High` - High\n* `Medium` - Medium\n* `Low` - Low\n* `Info` - Info"},"policy":{"type":"integer","readOnly":true,"nullable":true,"description":"The policy that produced the decision. Empty when no policy matched."},"policy_detail":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"evidence":{"readOnly":true,"description":"The paths and config keys that proved the component is present."},"finding":{"type":"integer","readOnly":true,"nullable":true,"description":"The Finding this verdict raised, when it raised one."},"evaluated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Evaluated","description":"When the decision was last evaluated."}},"required":["category","decision","dependency","evaluated_at","evidence","finding","id","name","policy","policy_detail","product","product_detail","purl","severity"]},"AIComponentPolicy":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"A short name for the policy, shown on verdicts and on the Findings it raises.","maxLength":200},"scope":{"type":"string","readOnly":true},"product_type":{"type":"integer","nullable":true},"product_type_detail":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"product":{"type":"integer","nullable":true},"product_detail":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"match_type":{"enum":["purl","purl_glob","category","provider"],"type":"string","x-spec-enum-id":"7a6872157541fbcb","description":"How the policy recognises a component.\n\n* `purl` - Exact Package URL\n* `purl_glob` - Package URL pattern\n* `category` - AI category\n* `provider` - Provider"},"match_value":{"type":"string","description":"A Package URL, a Package URL pattern such as pkg:npm/@modelcontextprotocol/*, an AI category such as mcp-server, or a provider such as anthropic.","maxLength":1024},"decision":{"enum":["authorized","unauthorized","needs_review"],"type":"string","x-spec-enum-id":"2a99e4cc67012f7f","description":"What a matching component is: authorized, unauthorized, or needs review.\n\n* `authorized` - Authorized\n* `unauthorized` - Unauthorized\n* `needs_review` - Needs review"},"severity":{"enum":["Critical","High","Medium","Low","Info",""],"type":"string","x-spec-enum-id":"fc5d16a20ed06136","description":"Severity of the Finding an unauthorized component raises. Empty uses the default for its kind: High for MCP servers and AI services, Medium for assistants, models and packages, Low for skills.\n\n* `Critical` - Critical\n* `High` - High\n* `Medium` - Medium\n* `Low` - Low\n* `Info` - Info"},"justification":{"type":"string","description":"Why the decision was made. Shown on the verdict and in the Finding description."},"owner_user":{"type":"integer","nullable":true},"owner_group":{"type":"integer","nullable":true},"owner_detail":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"enabled":{"type":"boolean","description":"Disabled policies are kept but never match."},"is_starter":{"type":"boolean","readOnly":true,"title":"Starter Policy","description":"Shipped with DefectDojo as a starting point. Starter policies ship disabled."},"verdict_count":{"type":"integer","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["created_at","decision","id","is_starter","match_type","match_value","name","owner_detail","product_detail","product_type_detail","scope","updated_at","verdict_count"]},"AIComponentPolicyRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"A short name for the policy, shown on verdicts and on the Findings it raises.","maxLength":200},"product_type":{"type":"integer","nullable":true},"product":{"type":"integer","nullable":true},"match_type":{"enum":["purl","purl_glob","category","provider"],"type":"string","x-spec-enum-id":"7a6872157541fbcb","description":"How the policy recognises a component.\n\n* `purl` - Exact Package URL\n* `purl_glob` - Package URL pattern\n* `category` - AI category\n* `provider` - Provider"},"match_value":{"type":"string","minLength":1,"description":"A Package URL, a Package URL pattern such as pkg:npm/@modelcontextprotocol/*, an AI category such as mcp-server, or a provider such as anthropic.","maxLength":1024},"decision":{"enum":["authorized","unauthorized","needs_review"],"type":"string","x-spec-enum-id":"2a99e4cc67012f7f","description":"What a matching component is: authorized, unauthorized, or needs review.\n\n* `authorized` - Authorized\n* `unauthorized` - Unauthorized\n* `needs_review` - Needs review"},"severity":{"enum":["Critical","High","Medium","Low","Info",""],"type":"string","x-spec-enum-id":"fc5d16a20ed06136","description":"Severity of the Finding an unauthorized component raises. Empty uses the default for its kind: High for MCP servers and AI services, Medium for assistants, models and packages, Low for skills.\n\n* `Critical` - Critical\n* `High` - High\n* `Medium` - Medium\n* `Low` - Low\n* `Info` - Info"},"justification":{"type":"string","description":"Why the decision was made. Shown on the verdict and in the Finding description."},"owner_user":{"type":"integer","nullable":true},"owner_group":{"type":"integer","nullable":true},"enabled":{"type":"boolean","description":"Disabled policies are kept but never match."}},"required":["decision","match_type","match_value","name"]},"AIInventoryItem":{"type":"object","description":"One AI component on one asset, as the inventory table and the public API show it.","properties":{"id":{"type":"integer","readOnly":true},"location_id":{"type":"integer","readOnly":true},"purl":{"type":"string","readOnly":true},"name":{"type":"string","readOnly":true},"display_name":{"type":"string","readOnly":true},"namespace":{"type":"string","readOnly":true},"version":{"type":"string","readOnly":true},"component_type":{"type":"string","readOnly":true},"kind":{"type":"string","readOnly":true},"kind_label":{"type":"string","readOnly":true},"category":{"type":"string","readOnly":true},"category_label":{"type":"string","readOnly":true},"provider":{"type":"string","readOnly":true},"via":{"type":"string","readOnly":true},"authorization":{"type":"string","readOnly":true},"verdict_id":{"type":"integer","readOnly":true,"nullable":true},"evidence":{"type":"array","items":{"type":"string"},"readOnly":true},"source_ref":{"type":"string","readOnly":true},"first_seen":{"type":"string","nullable":true,"readOnly":true},"last_seen":{"type":"string","readOnly":true,"nullable":true},"transport":{"type":"string","readOnly":true},"endpoints":{"type":"array","items":{"type":"string"},"readOnly":true},"product":{"type":"object","additionalProperties":{},"readOnly":true}},"required":["authorization","category","category_label","component_type","display_name","endpoints","evidence","first_seen","id","kind","kind_label","last_seen","location_id","name","namespace","product","provider","purl","source_ref","transport","verdict_id","version","via"]},"AIInventorySummary":{"type":"object","properties":{"kinds":{"type":"object","additionalProperties":{"type":"integer"}},"authorization":{"type":"object","additionalProperties":{"type":"integer"}},"ai_keys":{"type":"integer"},"assets":{"type":"integer"},"total":{"type":"integer"},"assisted_commits":{"type":"boolean","nullable":true},"last_inventory_at":{"type":"string","format":"date-time","nullable":true},"last_source_ref":{"type":"string"}},"required":["ai_keys","assets","authorization","kinds","total"]},"AcceptedRiskRequest":{"type":"object","properties":{"vulnerability_id":{"type":"string","minLength":1,"description":"An id of a vulnerability in a security advisory associated with this finding. Can be a Common Vulnerabilities and Exposure (CVE) or from other sources.","maxLength":50},"justification":{"type":"string","minLength":1,"description":"Justification for accepting findings with this vulnerability id"},"accepted_by":{"type":"string","minLength":1,"description":"Name or email of person who accepts the risk","maxLength":200},"expiration_date":{"type":"string","format":"date-time","nullable":true,"description":"When the risk acceptance expires. Omit it to use the number of days in the Default Risk Acceptance Days system setting (none when that is 0); send null for one that never expires."}},"required":["accepted_by","justification","vulnerability_id"]},"ActionDetail":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","readOnly":true},"risk_bands":{"type":"array","items":{"type":"number","format":"double"},"nullable":true,"readOnly":true},"action_type":{"enum":["upgrade","patch","configuration","code_change","rebuild","removal","certificate","permission","decommission","other"],"type":"string","x-spec-enum-id":"2130e743922de2cc","description":"What kind of change this is.\n\n* `upgrade` - Upgrade\n* `patch` - Patch\n* `configuration` - Configuration change\n* `code_change` - Code change\n* `rebuild` - Rebuild\n* `removal` - Removal\n* `certificate` - Certificate replacement\n* `permission` - Permission change\n* `decommission` - Decommission\n* `other` - Other"},"action_type_label":{"type":"string","readOnly":true},"source_category":{"enum":["infrastructure","sast","sca","dast","container","cloud","other"],"type":"string","x-spec-enum-id":"6d8fb65683e33494","title":"Source","description":"The kind of testing that reported the findings.\n\n* `infrastructure` - Infrastructure\n* `sast` - SAST\n* `sca` - SCA\n* `dast` - DAST\n* `container` - Container\n* `cloud` - Cloud\n* `other` - Other"},"source_category_label":{"type":"string","readOnly":true},"status":{"enum":["new","planned","in_progress","blocked","change_scheduled","awaiting_validation","complete","exception_requested"],"type":"string","x-spec-enum-id":"57f29bf3b8cd4fef","description":"Where the action is in its workflow.\n\n* `new` - New\n* `planned` - Planned\n* `in_progress` - In Progress\n* `blocked` - Blocked\n* `change_scheduled` - Change Scheduled\n* `awaiting_validation` - Awaiting Validation\n* `complete` - Complete\n* `exception_requested` - Exception Requested"},"status_label":{"type":"string","readOnly":true},"sla_state":{"type":"string","readOnly":true},"due_date":{"type":"string","format":"date","nullable":true,"description":"The earliest SLA due date among the open findings."},"days_left":{"type":"integer","nullable":true,"readOnly":true},"driving_finding_id":{"type":"integer","nullable":true,"title":"Deadline Finding","description":"The open finding whose SLA sets the due date.","readOnly":true},"open_findings":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Active findings this action resolves."},"total_findings":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Every finding ever grouped into this action, open or closed."},"cve_count":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Distinct CVEs across the open findings."},"kev_count":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Known Exploited","description":"Open findings on the known exploited vulnerabilities list."},"max_severity":{"type":"string","title":"Severity","description":"The highest severity among the open findings.","maxLength":16},"max_priority":{"type":"number","format":"double","nullable":true,"title":"Priority","description":"The highest priority among the open findings."},"max_risk":{"type":"string","title":"Risk","description":"The highest risk among the open findings.","maxLength":16},"max_risk_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Risk Score","description":"The highest risk score among the open findings."},"scope_type":{"enum":["host","code","manifest","image","site","resource","asset"],"type":"string","x-spec-enum-id":"69bee6a208e97ae0","description":"What kind of place the change is made in.\n\n* `host` - Host\n* `code` - Code location\n* `manifest` - Manifest\n* `image` - Container Image\n* `site` - Web site\n* `resource` - Resource\n* `asset` - Asset"},"scope_type_label":{"type":"string","readOnly":true},"scope_label":{"type":"string","title":"Location","description":"Where the change is made, e.g. a host name or 'repository @ branch'.","maxLength":512},"scope_detail":{"type":"string","title":"Location Detail","description":"The exact path, file and line, image, or URL.","maxLength":1024},"component_name":{"type":"string","title":"Component","description":"The component the change applies to, when there is one.","maxLength":512},"current_version":{"type":"string","description":"The installed version, or the lowest one when several are installed.","maxLength":256},"target_version":{"type":"string","description":"The version that resolves the most findings, superseding lower fixes.","maxLength":256},"major_upgrade":{"type":"boolean","description":"Whether the target crosses a major version boundary."},"confidence":{"enum":["exact","heuristic"],"type":"string","x-spec-enum-id":"383589cbf8f37881","description":"Whether the grouping is an exact match or a heuristic one.\n\n* `exact` - Exact\n* `heuristic` - Heuristic"},"product":{"type":"object","additionalProperties":{},"readOnly":true},"organization":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"assignee":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"owner_team":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"campaign":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"ticket":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"suppressed":{"type":"boolean","description":"Whether the action is hidden from work queues."},"is_manual":{"type":"boolean","title":"Manual","description":"Whether a person created this action by splitting another one."},"overridden_fields":{"description":"Fields a person changed, which the grouping engine leaves alone."},"reopen_count":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"How many times the action reopened after completion."},"scheduled_for":{"type":"string","format":"date","nullable":true,"description":"The planned change window."},"status_changed_at":{"type":"string","format":"date-time","nullable":true,"title":"Status Changed","description":"When the status last changed."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"},"permissions":{"allOf":[{"$ref":"#/components/schemas/ActionPermissions"}],"readOnly":true},"solution":{"type":"string","description":"Implementation guidance, taken from the scanners' remediation text."},"current_versions":{"description":"Every installed version reported by the member findings."},"target_alternatives":{"description":"Candidate target versions with how many findings each one resolves."},"via_components":{"title":"Transitive Components","description":"For a direct-dependency upgrade, the vulnerable packages it pulls in."},"rationale":{"title":"Grouping Rationale","description":"Why these findings were grouped together, for explainability."},"rationale_text":{"type":"string","readOnly":true},"blocked_reason":{"type":"string","description":"Why the action is blocked."},"suppressed_reason":{"type":"string","description":"Why the action was suppressed."},"completed_at":{"type":"string","format":"date-time","nullable":true,"title":"Completed","description":"When every finding was confirmed closed."},"last_computed_at":{"type":"string","format":"date-time","nullable":true,"title":"Last Computed","description":"When the grouping engine last refreshed this action."},"driving_finding":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"validation_step":{"type":"string","readOnly":true}},"required":["action_type_label","assignee","campaign","created_at","days_left","driving_finding","driving_finding_id","id","organization","owner_team","permissions","product","rationale_text","risk_bands","scope_type_label","sla_state","source_category_label","status_label","ticket","title","updated_at","validation_step"]},"ActionList":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","readOnly":true},"risk_bands":{"type":"array","items":{"type":"number","format":"double"},"nullable":true,"readOnly":true},"action_type":{"enum":["upgrade","patch","configuration","code_change","rebuild","removal","certificate","permission","decommission","other"],"type":"string","x-spec-enum-id":"2130e743922de2cc","description":"What kind of change this is.\n\n* `upgrade` - Upgrade\n* `patch` - Patch\n* `configuration` - Configuration change\n* `code_change` - Code change\n* `rebuild` - Rebuild\n* `removal` - Removal\n* `certificate` - Certificate replacement\n* `permission` - Permission change\n* `decommission` - Decommission\n* `other` - Other"},"action_type_label":{"type":"string","readOnly":true},"source_category":{"enum":["infrastructure","sast","sca","dast","container","cloud","other"],"type":"string","x-spec-enum-id":"6d8fb65683e33494","title":"Source","description":"The kind of testing that reported the findings.\n\n* `infrastructure` - Infrastructure\n* `sast` - SAST\n* `sca` - SCA\n* `dast` - DAST\n* `container` - Container\n* `cloud` - Cloud\n* `other` - Other"},"source_category_label":{"type":"string","readOnly":true},"status":{"enum":["new","planned","in_progress","blocked","change_scheduled","awaiting_validation","complete","exception_requested"],"type":"string","x-spec-enum-id":"57f29bf3b8cd4fef","description":"Where the action is in its workflow.\n\n* `new` - New\n* `planned` - Planned\n* `in_progress` - In Progress\n* `blocked` - Blocked\n* `change_scheduled` - Change Scheduled\n* `awaiting_validation` - Awaiting Validation\n* `complete` - Complete\n* `exception_requested` - Exception Requested"},"status_label":{"type":"string","readOnly":true},"sla_state":{"type":"string","readOnly":true},"due_date":{"type":"string","format":"date","nullable":true,"description":"The earliest SLA due date among the open findings."},"days_left":{"type":"integer","nullable":true,"readOnly":true},"driving_finding_id":{"type":"integer","nullable":true,"title":"Deadline Finding","description":"The open finding whose SLA sets the due date.","readOnly":true},"open_findings":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Active findings this action resolves."},"total_findings":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Every finding ever grouped into this action, open or closed."},"cve_count":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Distinct CVEs across the open findings."},"kev_count":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Known Exploited","description":"Open findings on the known exploited vulnerabilities list."},"max_severity":{"type":"string","title":"Severity","description":"The highest severity among the open findings.","maxLength":16},"max_priority":{"type":"number","format":"double","nullable":true,"title":"Priority","description":"The highest priority among the open findings."},"max_risk":{"type":"string","title":"Risk","description":"The highest risk among the open findings.","maxLength":16},"max_risk_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Risk Score","description":"The highest risk score among the open findings."},"scope_type":{"enum":["host","code","manifest","image","site","resource","asset"],"type":"string","x-spec-enum-id":"69bee6a208e97ae0","description":"What kind of place the change is made in.\n\n* `host` - Host\n* `code` - Code location\n* `manifest` - Manifest\n* `image` - Container Image\n* `site` - Web site\n* `resource` - Resource\n* `asset` - Asset"},"scope_type_label":{"type":"string","readOnly":true},"scope_label":{"type":"string","title":"Location","description":"Where the change is made, e.g. a host name or 'repository @ branch'.","maxLength":512},"scope_detail":{"type":"string","title":"Location Detail","description":"The exact path, file and line, image, or URL.","maxLength":1024},"component_name":{"type":"string","title":"Component","description":"The component the change applies to, when there is one.","maxLength":512},"current_version":{"type":"string","description":"The installed version, or the lowest one when several are installed.","maxLength":256},"target_version":{"type":"string","description":"The version that resolves the most findings, superseding lower fixes.","maxLength":256},"major_upgrade":{"type":"boolean","description":"Whether the target crosses a major version boundary."},"confidence":{"enum":["exact","heuristic"],"type":"string","x-spec-enum-id":"383589cbf8f37881","description":"Whether the grouping is an exact match or a heuristic one.\n\n* `exact` - Exact\n* `heuristic` - Heuristic"},"product":{"type":"object","additionalProperties":{},"readOnly":true},"organization":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"assignee":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"owner_team":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"campaign":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"ticket":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"suppressed":{"type":"boolean","description":"Whether the action is hidden from work queues."},"is_manual":{"type":"boolean","title":"Manual","description":"Whether a person created this action by splitting another one."},"overridden_fields":{"description":"Fields a person changed, which the grouping engine leaves alone."},"reopen_count":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"How many times the action reopened after completion."},"scheduled_for":{"type":"string","format":"date","nullable":true,"description":"The planned change window."},"status_changed_at":{"type":"string","format":"date-time","nullable":true,"title":"Status Changed","description":"When the status last changed."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"},"permissions":{"allOf":[{"$ref":"#/components/schemas/ActionPermissions"}],"readOnly":true}},"required":["action_type_label","assignee","campaign","created_at","days_left","driving_finding_id","id","organization","owner_team","permissions","product","risk_bands","scope_type_label","sla_state","source_category_label","status_label","ticket","title","updated_at"]},"ActionPermissions":{"type":"object","description":"What the requesting user may do on the action's asset.","properties":{"work":{"type":"boolean","description":"Change status, assignee, team, comments and the ticket link."},"regroup":{"type":"boolean","description":"Split, merge, move findings, suppress, edit and reset."}},"required":["regroup","work"]},"Activity":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"kind":{"enum":["created","comment","status","assigned","team","split","merged","moved","suppressed","unsuppressed","override","reset","ticket","validated","reopened","findings_added"],"type":"string","x-spec-enum-id":"d83623a00494d716","description":"What happened.\n\n* `created` - Created\n* `comment` - Comment\n* `status` - Status\n* `assigned` - Assigned\n* `team` - Team\n* `split` - Split\n* `merged` - Merged\n* `moved` - Moved\n* `suppressed` - Suppressed\n* `unsuppressed` - Restored\n* `override` - Edited\n* `reset` - Reset\n* `ticket` - Ticket\n* `validated` - Validated\n* `reopened` - Reopened\n* `findings_added` - Findings added"},"kind_label":{"type":"string","readOnly":true},"actor":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"body":{"type":"string","title":"Comment","description":"The comment text, for comments."},"message":{"type":"string","readOnly":true},"data":{"title":"Details","description":"Structured details of the change."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"}},"required":["actor","created_at","id","kind","kind_label","message"]},"Actor":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"username":{"type":"string","description":"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.","pattern":"^[\\w.@+-]+$","maxLength":150},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150}},"required":["id","username"]},"AddNewFileOptionRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":100},"file":{"type":"string","format":"binary"}},"required":["file","title"]},"AddNewNoteOptionRequest":{"type":"object","properties":{"entry":{"type":"string","minLength":1},"private":{"type":"boolean","description":"Only you and superusers can see this note. It is also left out of reports and issue-tracker sync."},"note_type":{"type":"integer","nullable":true}},"required":["entry"]},"AdvisorOverview":{"type":"object","properties":{"domains":{"type":"array","items":{"$ref":"#/components/schemas/DomainSummary"}},"latest_run":{"allOf":[{"$ref":"#/components/schemas/RecommendationRun"}],"nullable":true},"open_total":{"type":"integer"}},"required":["domains","latest_run","open_total"]},"Announcement":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"message":{"type":"string","description":"This dismissable message will be displayed on all pages for authenticated users. It can contain basic html tags, for example <a href='https://www.fred.com' style='color: #337ab7;' target='_blank'>https://example.com</a>","maxLength":500},"style":{"enum":["info","success","warning","danger"],"type":"string","x-spec-enum-id":"6f65abe0aab2c78c","description":"The style of banner to display. (info, success, warning, danger)\n\n* `info` - Info\n* `success` - Success\n* `warning` - Warning\n* `danger` - Danger"},"dismissable":{"type":"boolean","title":"Dismissable?","description":"Ticking this box allows users to dismiss the current announcement"}},"required":["id"]},"AnnouncementRequest":{"type":"object","properties":{"message":{"type":"string","minLength":1,"description":"This dismissable message will be displayed on all pages for authenticated users. It can contain basic html tags, for example <a href='https://www.fred.com' style='color: #337ab7;' target='_blank'>https://example.com</a>","maxLength":500},"style":{"enum":["info","success","warning","danger"],"type":"string","x-spec-enum-id":"6f65abe0aab2c78c","description":"The style of banner to display. (info, success, warning, danger)\n\n* `info` - Info\n* `success` - Success\n* `warning` - Warning\n* `danger` - Danger"},"dismissable":{"type":"boolean","title":"Dismissable?","description":"Ticking this box allows users to dismiss the current announcement"}}},"AppAnalysis":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"tags":{"type":"array","items":{"type":"string"}},"name":{"type":"string","maxLength":200},"confidence":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Confidence level"},"version":{"type":"string","nullable":true,"title":"Version Number","maxLength":200},"icon":{"type":"string","nullable":true,"maxLength":200},"website":{"nullable":true,"oneOf":[{"type":"string","format":"uri","maxLength":400},{"type":"string","maxLength":0}]},"website_found":{"nullable":true,"oneOf":[{"type":"string","format":"uri","maxLength":400},{"type":"string","maxLength":0}]},"created":{"type":"string","format":"date-time","readOnly":true},"product":{"type":"integer"},"user":{"type":"integer"},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["created","id","name","product","user"]},"AppAnalysisRequest":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string","minLength":1}},"name":{"type":"string","minLength":1,"maxLength":200},"confidence":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Confidence level"},"version":{"type":"string","nullable":true,"title":"Version Number","maxLength":200},"icon":{"type":"string","nullable":true,"maxLength":200},"website":{"nullable":true,"oneOf":[{"type":"string","format":"uri","maxLength":400},{"type":"string","maxLength":0}]},"website_found":{"nullable":true,"oneOf":[{"type":"string","format":"uri","maxLength":400},{"type":"string","maxLength":0}]},"product":{"type":"integer"},"user":{"type":"integer"}},"required":["name","product","user"]},"ApplyRequestRequest":{"type":"object","properties":{"force":{"type":"boolean","default":false}}},"AssessRequestRequest":{"type":"object","description":"A dry-run assessment for conditions that have not been saved.","properties":{"conditions":{"type":"array","items":{"type":"object","additionalProperties":{}}},"condition_logic":{"type":"string","minLength":1,"default":"and"},"target_mode":{"type":"string","minLength":1,"default":"component"}},"required":["conditions"]},"AssetAPIScanConfiguration":{"type":"object","description":"Enforce ``view_tool_configuration`` on ``tool_configuration`` writes.\n\nSelecting a ``tool_configuration`` lets an import run authenticated requests\nwith the credential stored on it, so it is gated by the same\n``view_tool_configuration`` permission that guards the tool-configuration\nviews, not just the object permission these endpoints already check.\n\nMix this into *every* serializer exposing the field, including alias\nserializers over the same model, so the rule holds wherever the field is\nreachable.\n\nThe check hangs off ``run_validation`` rather than ``validate`` on purpose: a\nsubclass that defines its own ``validate`` would otherwise shadow the mixin's\nand silently drop the guard.\n\nNo-ops when the field is absent (replay-safe on PATCH), mirroring\ndojo.authorization.api_permissions.check_update_permission.","properties":{"id":{"type":"integer","readOnly":true},"asset":{"type":"integer"},"service_key_1":{"type":"string","nullable":true,"maxLength":200},"service_key_2":{"type":"string","nullable":true,"maxLength":200},"service_key_3":{"type":"string","nullable":true,"maxLength":200},"tool_configuration":{"type":"integer"},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"tool_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ToolConfiguration"}}}}},"required":["asset","id","tool_configuration"]},"AssetAPIScanConfigurationRequest":{"type":"object","description":"Enforce ``view_tool_configuration`` on ``tool_configuration`` writes.\n\nSelecting a ``tool_configuration`` lets an import run authenticated requests\nwith the credential stored on it, so it is gated by the same\n``view_tool_configuration`` permission that guards the tool-configuration\nviews, not just the object permission these endpoints already check.\n\nMix this into *every* serializer exposing the field, including alias\nserializers over the same model, so the rule holds wherever the field is\nreachable.\n\nThe check hangs off ``run_validation`` rather than ``validate`` on purpose: a\nsubclass that defines its own ``validate`` would otherwise shadow the mixin's\nand silently drop the guard.\n\nNo-ops when the field is absent (replay-safe on PATCH), mirroring\ndojo.authorization.api_permissions.check_update_permission.","properties":{"asset":{"type":"integer"},"service_key_1":{"type":"string","nullable":true,"maxLength":200},"service_key_2":{"type":"string","nullable":true,"maxLength":200},"service_key_3":{"type":"string","nullable":true,"maxLength":200},"tool_configuration":{"type":"integer"}},"required":["asset","tool_configuration"]},"AssetAlias":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","title":"Asset","description":"The asset this identifier resolves to."},"asset_name":{"type":"string","readOnly":true},"namespace":{"type":"string","description":"The authority that issued the identifier, e.g. 'connector:github:3' or 'dns'.","maxLength":200},"alias_type":{"type":"string","title":"Type","description":"What kind of identifier this is, e.g. 'external_id' or 'hostname'.","maxLength":64,"pattern":"^[-a-zA-Z0-9_]+$"},"value":{"type":"string","description":"The identifier itself, as the source spells it.","maxLength":512},"origin":{"enum":["user","connector","rule","import"],"type":"string","x-spec-enum-id":"ff51c090249de86c","readOnly":true,"description":"Who asserted this identifier. User-asserted aliases are never reconciled away.\n\n* `user` - User\n* `connector` - Connector\n* `rule` - Rule\n* `import` - Import"},"connector_config":{"type":"integer","readOnly":true,"nullable":true,"title":"Connector Configuration","description":"The connector config that asserted this identifier; provenance only."},"connector_name":{"type":"string","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time the alias was recorded."},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the alias was touched."}},"required":["alias_type","asset_name","connector_config","connector_name","created_at","id","namespace","origin","product","updated_at","value"]},"AssetAliasRequest":{"type":"object","properties":{"product":{"type":"integer","title":"Asset","description":"The asset this identifier resolves to."},"namespace":{"type":"string","minLength":1,"description":"The authority that issued the identifier, e.g. 'connector:github:3' or 'dns'.","maxLength":200},"alias_type":{"type":"string","minLength":1,"title":"Type","description":"What kind of identifier this is, e.g. 'external_id' or 'hostname'.","maxLength":64,"pattern":"^[-a-zA-Z0-9_]+$"},"value":{"type":"string","minLength":1,"description":"The identifier itself, as the source spells it.","maxLength":512}},"required":["alias_type","namespace","product","value"]},"AssetReference":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"url":{"type":"string","readOnly":true}},"required":["id","name","url"]},"AssetType":{"type":"object","description":"The asset-type registry, read-only over the API.\n\nSeeded types are editable in the admin (a customer may prefer different wording or a\ndifferent icon) but the API surface is a vocabulary, not a management screen: pickers\nread it, nothing writes it.","properties":{"code":{"type":"string","description":"Stable lookup key, e.g. 'repository'. Referenced by connectors and imports.","maxLength":64,"pattern":"^[-a-zA-Z0-9_]+$"},"label":{"type":"string","description":"Singular human-facing name, e.g. 'Repository'.","maxLength":120},"label_plural":{"type":"string","title":"Plural Label","description":"Plural human-facing name, e.g. 'Repositories'.","maxLength":120},"description":{"type":"string","description":"What sort of thing this type describes.","maxLength":250},"icon":{"type":"string","description":"UI icon token (e.g. 'pi-code'), resolved by the frontend.","maxLength":64},"display_order":{"type":"integer","maximum":32767,"minimum":0,"description":"Sort position in pickers; ties fall back to label."},"is_system":{"type":"boolean","title":"System Type","description":"Seeded with DefectDojo. Editable, but not deletable."},"sensor_applicability":{"enum":["host","cannot_host","runtime","rollup","not_applicable"],"type":"string","x-spec-enum-id":"7694673f7376560f","description":"* `host` - Runs a Sensor\n* `cannot_host` - Cannot Host a Sensor\n* `runtime` - Covered Where It Runs\n* `rollup` - Covered Through What It Holds\n* `not_applicable` - Not Applicable"}},"required":["code","label"]},"AssetVersion":{"type":"object","description":"An asset's release/version stream entry (Phase 3).\n\nA version is metadata about an asset, not an asset: creating one never creates a\nproduct, and findings are never duplicated into it. What hangs off a version is BOM\nsnapshots (recorded by SBOM import) and found_in/fixed_in claims.","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer"},"product_name":{"type":"string","readOnly":true},"name":{"type":"string","title":"Version","description":"The version identifier as the producer names it (e.g. '5.2.0', '2026.08').","maxLength":200},"released_at":{"type":"string","format":"date-time","nullable":true,"title":"Released Timestamp","description":"Optional release date, for display and reporting order."},"snapshot_count":{"type":"integer","readOnly":true},"field_completion_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Field Completion Timestamp","description":"When this version finished reaching deployed devices. Section 524B's third lifecycle metric measures from a fix being available to it being installed, and only the sponsor knows when that finished, so it is recorded rather than inferred."},"field_completion_source":{"enum":["manual","import","telemetry"],"type":"string","x-spec-enum-id":"b463a1ae8b792b1f","readOnly":true,"description":"Where the completion date came from. Blank while none is recorded.\n\n* `manual` - Manual entry\n* `import` - Import\n* `telemetry` - Fleet telemetry"},"installed_base_percent":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","readOnly":true,"nullable":true,"title":"Installed Base (%)","description":"The share of the deployed fleet running this version, where the sponsor tracks it. Reported as given; nothing here derives it."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time the version was created."},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the version was updated."}},"required":["created_at","field_completion_at","field_completion_source","id","installed_base_percent","name","product","product_name","snapshot_count","updated_at"]},"AssetVersionFieldCompletionRequest":{"type":"object","description":"The three lifecycle facts, and nothing else.\n\nDeliberately not a ModelSerializer over ``AssetVersion``: the point of this action is that\nit CANNOT reach ``name`` or ``product``. The viewset has no update action because renaming\na version silently rewrites what every already-exported document means, and widening it to\nlet a sponsor record a completion date would reopen exactly that.","properties":{"field_completion_at":{"type":"string","format":"date-time","nullable":true},"field_completion_source":{"enum":["manual","import","telemetry",""],"type":"string","description":"* `manual` - Manual entry\n* `import` - Import\n* `telemetry` - Fleet telemetry","x-spec-enum-id":"b463a1ae8b792b1f"},"installed_base_percent":{"type":"string","format":"decimal","pattern":"^-?\\d{0,3}(?:\\.\\d{0,2})?$","nullable":true}}},"AssetVersionRequest":{"type":"object","description":"An asset's release/version stream entry (Phase 3).\n\nA version is metadata about an asset, not an asset: creating one never creates a\nproduct, and findings are never duplicated into it. What hangs off a version is BOM\nsnapshots (recorded by SBOM import) and found_in/fixed_in claims.","properties":{"product":{"type":"integer"},"name":{"type":"string","minLength":1,"title":"Version","description":"The version identifier as the producer names it (e.g. '5.2.0', '2026.08').","maxLength":200},"released_at":{"type":"string","format":"date-time","nullable":true,"title":"Released Timestamp","description":"Optional release date, for display and reporting order."}},"required":["name","product"]},"Assets":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"id":{"type":"integer","readOnly":true},"findings_count":{"type":"integer","readOnly":true},"findings_list":{"type":"array","items":{"type":"integer"},"readOnly":true},"tags":{"type":"array","items":{"type":"string"}},"asset_meta":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldValueMeta"},"readOnly":true},"organization":{"type":"integer"},"asset_numeric_grade":{"type":"integer","nullable":true},"enable_asset_tag_inheritance":{"type":"boolean","default":false},"asset_managers":{"type":"integer","nullable":true},"business_criticality":{"enum":["very high","high","medium","low","very low","none","",null],"type":"string","description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","x-spec-enum-id":"ef412461eb271471","nullable":true},"platform":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"lifecycle":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"origin":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"parent":{"type":"integer","nullable":true},"members":{"type":"array","items":{"type":"integer"},"readOnly":true},"authorization_groups":{"type":"array","items":{"type":"integer"},"readOnly":true},"prioritization_engine":{"type":"integer","nullable":true},"asset_type":{"type":"string","description":"Stable lookup key, e.g. 'repository'. Referenced by connectors and imports.","nullable":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"name":{"type":"string","maxLength":255},"description":{"type":"string","maxLength":4000},"user_records":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"Estimate the number of user records within the application."},"revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Estimate the application's revenue."},"external_audience":{"type":"boolean","description":"Specify if the application is used by people outside the organization."},"internet_accessible":{"type":"boolean","description":"Specify if the application is accessible from the public internet."},"enable_simple_risk_acceptance":{"type":"boolean","description":"Allows simple risk acceptance by checking/unchecking a checkbox."},"enable_full_risk_acceptance":{"type":"boolean","description":"Allows full risk acceptance using a risk acceptance form, expiration date, uploaded proof, etc."},"disable_sla_breach_notifications":{"type":"boolean","description":"Disable SLA breach notifications if configured in the global settings"},"technical_contact":{"type":"integer","nullable":true},"team_manager":{"type":"integer","nullable":true},"sla_configuration":{"type":"integer"},"regulations":{"type":"array","items":{"type":"integer"}},"prefetch":{"type":"object","properties":{"authorized_users":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"prod_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ProductType"}},"product_manager":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"regulations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Regulation"}},"sla_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/SLAConfiguration"}},"team_manager":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"technical_contact":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"locations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/LocationProductReference"}}}}},"required":["asset_meta","authorization_groups","created","description","findings_count","findings_list","id","members","name","organization"]},"AssetsRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"tags":{"type":"array","items":{"type":"string","minLength":1}},"organization":{"type":"integer"},"asset_numeric_grade":{"type":"integer","nullable":true},"enable_asset_tag_inheritance":{"type":"boolean","default":false},"asset_managers":{"type":"integer","nullable":true},"business_criticality":{"enum":["very high","high","medium","low","very low","none","",null],"type":"string","description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","x-spec-enum-id":"ef412461eb271471","nullable":true},"platform":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"lifecycle":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"origin":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"parent":{"type":"integer","nullable":true},"prioritization_engine":{"type":"integer","nullable":true},"asset_type":{"type":"string","minLength":1,"description":"Stable lookup key, e.g. 'repository'. Referenced by connectors and imports.","nullable":true},"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","minLength":1,"maxLength":4000},"user_records":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"Estimate the number of user records within the application."},"revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Estimate the application's revenue."},"external_audience":{"type":"boolean","description":"Specify if the application is used by people outside the organization."},"internet_accessible":{"type":"boolean","description":"Specify if the application is accessible from the public internet."},"enable_simple_risk_acceptance":{"type":"boolean","description":"Allows simple risk acceptance by checking/unchecking a checkbox."},"enable_full_risk_acceptance":{"type":"boolean","description":"Allows full risk acceptance using a risk acceptance form, expiration date, uploaded proof, etc."},"disable_sla_breach_notifications":{"type":"boolean","description":"Disable SLA breach notifications if configured in the global settings"},"technical_contact":{"type":"integer","nullable":true},"team_manager":{"type":"integer","nullable":true},"sla_configuration":{"type":"integer"},"regulations":{"type":"array","items":{"type":"integer"}}},"required":["description","name","organization"]},"AssignExistingProduct":{"type":"object","properties":{"unassigned_findings":{"type":"array","items":{"type":"integer"}},"product_id":{"type":"integer"}},"required":["product_id","unassigned_findings"]},"AssignExistingProductRequest":{"type":"object","properties":{"unassigned_findings":{"type":"array","items":{"type":"integer"}},"product_id":{"type":"integer"}},"required":["product_id","unassigned_findings"]},"AssignNewProduct":{"type":"object","properties":{"unassigned_findings":{"type":"array","items":{"type":"integer"}},"product_name":{"type":"string","maxLength":4000},"product_description":{"type":"string","maxLength":255},"product_type_id":{"type":"integer"}},"required":["product_description","product_name","product_type_id","unassigned_findings"]},"AssignNewProductRequest":{"type":"object","properties":{"unassigned_findings":{"type":"array","items":{"type":"integer"}},"product_name":{"type":"string","minLength":1,"maxLength":4000},"product_description":{"type":"string","minLength":1,"maxLength":255},"product_type_id":{"type":"integer"}},"required":["product_description","product_name","product_type_id","unassigned_findings"]},"AssignRequestRequest":{"type":"object","properties":{"assignee":{"type":"integer","nullable":true}},"required":["assignee"]},"AssignReviewerRequestRequest":{"type":"object","properties":{"reviewer":{"type":"integer"},"role":{"type":"string","minLength":1,"maxLength":50}},"required":["reviewer","role"]},"AsyncImportScan":{"type":"object","properties":{"scan_date":{"type":"string","format":"date","description":"Scan completion date will be used on all findings."},"minimum_severity":{"enum":["Info","Low","Medium","High","Critical"],"type":"string","x-spec-enum-id":"fc5d16a20ed06136","default":"Info","description":"Minimum severity level to be imported\n\n* `Info` - Info\n* `Low` - Low\n* `Medium` - Medium\n* `High` - High\n* `Critical` - Critical"},"active":{"type":"boolean","description":"Force findings to be active/inactive or default to the original tool (None)"},"verified":{"type":"boolean","description":"Force findings to be verified/not verified or default to the original tool (None)"},"endpoint_to_add":{"type":"integer","description":"Enter the ID of a Location that is associated with the target Product. New Findings will be added to that Location."},"file":{"type":"string","format":"uri","nullable":true,"pattern":"(?:xml|csv|nessus|json|jsonl|html|js|zip|xlsx|txt|sarif|fpr|md|log|fvdl|spdx|ckl|cklb)$"},"product_type_name":{"type":"string","description":"Also referred to as 'Organization' name."},"product_name":{"type":"string","description":"Also referred to as 'Asset' name."},"engagement_name":{"type":"string"},"engagement_end_date":{"type":"string","format":"date","description":"End Date for Engagement. Default is current time + 365 days. Required format year-month-day"},"source_code_management_uri":{"type":"string","format":"uri","description":"Resource link to source code","maxLength":600},"test_title":{"type":"string"},"auto_create_context":{"type":"boolean"},"deduplication_on_engagement":{"type":"boolean"},"lead":{"type":"integer","nullable":true},"push_to_jira":{"type":"boolean","default":false},"deduplication_execution_mode":{"enum":["async","async_wait","sync",null],"type":"string","x-spec-enum-id":"bf7fb8ff28520a46","nullable":true,"description":"Override how import post-processing (deduplication, jira push, grading, ...) is executed for this request. 'async' dispatches post-processing to the background and responds immediately (default). 'async_wait' dispatches to the background but waits for deduplication to finish before responding, so notifications and the returned statistics reflect the deduplicated state. 'sync' runs everything inline. If omitted, falls back to the user's profile setting (deduplication_execution_mode).\n\n* `async` - Async (do not wait)\n* `async_wait` - Async, wait for deduplication\n* `sync` - Synchronous (block)"},"environment":{"type":"string"},"build_id":{"type":"string","description":"ID of the build that was scanned."},"branch_tag":{"type":"string","description":"Branch or Tag that was scanned."},"commit_hash":{"type":"string","description":"Commit that was scanned."},"api_scan_configuration":{"type":"integer","nullable":true},"service":{"type":"string","description":"A service is a self-contained piece of functionality within a Product. This is an optional field which is used in deduplication and closing of old findings when set. This affects the whole engagement/product depending on your deduplication scope."},"group_by":{"enum":["component_name","component_name+component_version","file_path","finding_title","vuln_id_from_tool"],"type":"string","x-spec-enum-id":"a9b19a914dcfbd21","description":"Choose an option to automatically group new findings by the chosen option.\n\n* `component_name` - Component Name\n* `component_name+component_version` - Component Name + Version\n* `file_path` - File path\n* `finding_title` - Finding Title\n* `vuln_id_from_tool` - Vulnerability ID from Tool"},"create_finding_groups_for_all_findings":{"type":"boolean","default":true,"description":"If set to false, finding groups will only be created when there is more than one grouped finding"},"test_id":{"type":"integer","readOnly":true},"engagement_id":{"type":"integer","readOnly":true},"product_id":{"type":"integer","readOnly":true,"description":"Also referred to as 'Asset' ID."},"product_type_id":{"type":"integer","readOnly":true,"description":"Also referred to as 'Organization' ID."},"statistics":{"allOf":[{"$ref":"#/components/schemas/ImportStatistics"}],"readOnly":true},"deduplication_complete":{"type":"boolean","readOnly":true,"description":"Whether deduplication had finished by the time this response was produced. True for 'sync' and for 'async_wait' when deduplication completed within the timeout; False for 'async' (deduplication is still running in the background) or when an 'async_wait' import timed out waiting for it."},"pro":{"type":"array","items":{},"readOnly":true},"apply_tags_to_findings":{"type":"boolean","description":"If set to True, the tags will be applied to the findings"},"apply_tags_to_endpoints":{"type":"boolean","description":"If set to True, the tags will be applied to the locations"},"scan_type":{"enum":["2ms Scan","42Crunch - Connectors Import","AccuKnox - Connectors Import","Action1 Scan","Acunetix Scan","AI Agent Red Team","AIDE Scan","Akto Scan","Alert Logic Scan","Anchore Engine Scan","Anchore Enterprise Policy Check","Anchore Grype","Anchore Grype detailed","AnchoreCTL Policies Report","AnchoreCTL Vuln Report","Ansible Lint Scan","APKLeaks Scan","AppCheck Web Application Scanner","AppSpider Scan","Aqua Scan","Arachni Scan","AuditJS Scan","Automox Scan","AWS Inspector2 Scan","AWS Prowler Scan","AWS Prowler V3","AWS Security Finding Format (ASFF) Scan","AWS Security Hub Scan","Azure Security Center Recommendations Scan","Bandit Scan","Beagle Security - Connectors Import","Bearer CLI","BigID Scan","Binwalk Scan","BlackDuck API","Blackduck Binary Analysis","Blackduck Component Risk","Blackduck Hub Scan","bomber Scan","Brakeman Scan","Bright - Connectors Import","Bugcrowd API Import","BugCrowd Scan","Bundler-Audit Scan","Burp Dastardly Scan","Burp Enterprise Scan","Burp REST API","Burp Scan","Burp GraphQL API","Burp Suite DAST Scan","Calico Cloud Image Assurance Scan","capa Scan","CargoAudit Scan","cfn-lint Scan","cfn-nag Scan","CFRipper Scan","Checkmarx CxFlow SAST","Checkmarx One Scan","Checkmarx OSA","Checkmarx Scan","Checkmarx Scan detailed","Checkov Scan","Chef Inspect Log","chkrootkit Scan","Choctaw Hog Scan","Clair Scan","ClamAV Scan","Cloud Posture Scan","Cloudflare Insights","CloudFormation Guard Scan","Cloudsplaining Scan","Cloudsploit Scan","Cobalt.io API Import","Cobalt.io Scan","Codacy - Connectors Import","Codechecker Report native","CodeQL Scan","Composer Audit Scan","Conftest Scan","Contrast Scan","Coverity API","Coverity Scan JSON Report","Cppcheck Scan","Crashtest Security JSON File","Crashtest Security XML File","CredScan Scan","CrowdStrike:Spotlight - Connectors Import","Crunch42 Scan","CSAF Scan","cwe_checker Scan","CyberArk Certificate Manager Scan","Cyberwatch scan (Galeax)","CycloneDX Scan","Cycognito Scan","Dalfox Scan","Datadog Cloud Security","DawnScanner Scan","debsecan Scan","Deepfence Threatmapper Report","DeepSource - Connectors Import","Dependency Check Scan","Dependency Track Finding Packaging Format (FPF) Export","Detect-secrets Scan","Detectify Scan","DevSkim Scan","Dirsearch Scan","DISA STIG Checklist","docker-bench-security Scan","dockerfile_lint Scan","Dockle Scan","Dodgy Scan","Dotnet Vulnerable Packages Scan","Dragos Scan","DrHeader JSON Importer","DSOP Scan","Duroc Hog Scan","Edgescan Scan","Elastic Security:CNVM - Connectors Import","Elastic Security:Detections - Connectors Import","Elastic Security:Posture - Connectors Import","Endor Labs - Connectors Import","Escape - Connectors Import","ESLint Scan","Essex Hog Scan","Fairwinds Insights - Connectors Import","Falco Scan","ffuf Scan","Fickling Scan","Finite State - Connectors Import","Firmwalker Scan","Flawfinder Scan","Fleet:Policies - Connectors Import","Fleet:Vulnerabilities - Connectors Import","Fortify Scan","Fortify Scan v2","FOSSA - Connectors Import","Garak Scan","Generic Findings Import","Ggshield Scan","GitGuardian - Connectors Import","Github SAST Scan","Github Secrets Detection Report Scan","Github Vulnerability Scan","GitLab API Fuzzing Report Scan","GitLab Container Scan","GitLab DAST Report","GitLab Dependency Scanning Report","GitLab SAST Report","GitLab Secret Detection Report","Gitleaks Scan","Gixy Scan","Gobuster Scan","Google Cloud Artifact Vulnerability Scan","Google Cloud SCC - Connectors Import","Gosec Scanner","Gottingen Hog Scan","Govulncheck Scanner","Govulncheck Scanner V2","Grant Scan","Group-IB ASM - Connectors Import","GuardDog Scan","HackerOne - Connectors Import","HackerOne Cases","Hadolint Dockerfile check","Halo Security - Connectors Import","Harbor Vulnerability Scan","HCL AppScan on Cloud SAST XML","HCLAppScan XML","HiddenLayer Model Scan","Holm Security Scan","Horusec Scan","httpx Scan","Humble Json Importer","HuskyCI Report","Hydra Scan","IBM AppScan DAST","Immuniweb Scan","Infer Scan","Intigriti - Connectors Import","Intruder API Import","IntSights Report","Invicti Scan","IriusRisk Threats Scan","JFrog Xray API Summary Artifact Scan","JFrog Xray On Demand Binary Scan","JFrog Xray Scan","JFrog Xray Unified Scan","KICS Scan","Kingfisher Scan","Kiuwan SCA Scan","Kiuwan Scan","Klocwork Scan","KrakenD Audit Scan","kube-bench Scan","kube-score Scan","Kubeaudit Scan","KubeEye Scan","KubeHunter Scan","KubeLinter Scan","kubent Scan","Kubescape JSON Importer","kubesec Scan","Kyverno Scan","Lacework - Connectors Import","Legitify Scan","Licensecheck Scan","Lynis Scan","ManageEngine Vulnerability Manager Plus Scan","Masscan Scan","Mayhem SARIF Report","Mend Scan","Meterian Scan","Microfocus Webinspect Scan","Microsoft Defender for Cloud - Connectors Import","Mix Audit Scan","MobSF Scan","Mobsfscan Scan","MobSF Scorecard Scan","ModelScan Scan","Mozilla Observatory Scan","MSDefender Parser","n0s1 Scanner","Naabu Scan","Nancy Scan","NetRise Scan","Netsparker Scan","Nettacker Scan","NeuVector (compliance)","NeuVector (REST)","Nexpose Scan","Nightfall AI - Connectors Import","Nikto Scan","njsscan Scan","Nmap Scan","Node Security Platform Scan","Noir Scan","Nosey Parker Scan","NowSecure","Nozomi Vantage Scan","NPM Audit Scan","NPM Audit v7+ Scan","Nuclei Scan","OpenReports","Openscap Vulnerability Scan","OpenSSF Scorecard","OpenVAS Parser","OpenVAS Parser v2","OpenVEX Scan","OPF Scan","Orca Security Alerts","ORT evaluated model Importer","OssIndex Devaudit SCA Scan Importer","Ostorlab Scan","OSV Scan","Outpost24 Scan","Parasoft DTP Scan","PHP Security Audit v2","PHP Symfony Security Check","PHPStan Scan","PICUS Scan","PingCastle","pip-audit Scan","pip-licenses Scan","Pluto Scan","PMapper Scan","PMD Scan","pnpm Audit Scan","Polaris Scan","Popeye Scan","Probely API Import","Progpilot Scan","Promptfoo Scan","Prospector Scan","Prowler Scan","Psalm Scan","PTART Report","PWN SAST","PyRIT Scan","Python Taint Scan","QARK Scan","Qualys Hacker Guardian Scan","Qualys Infrastructure Scan (WebGUI XML)","Qualys Scan","Qualys VMDR","Qualys Webapp Scan","Quark-Engine Scan","Quay - Connectors Import","Qwiet Scan","Rapid7 InsightAppSec - Connectors Import","Rapplex Scan","Red Hat Satellite","Regula Scan","Retire.js Scan","ReversingLabs Spectra Assure","Risk Recon API Importer","rkhunter Scan","Rubocop Scan","Ruff Scan","Rusty Hog Scan","Safety Scan","SARIF","sbomqs Scan","Scantist Scan","Scout Suite Scan","ScubaGear Report Scan","ScubaGear Scan","ScubaGoggles Action Plan","ScubaGoggles Scan","Seal Security Scan","Secretlint Scan","Semgrep JSON Report","Semgrep Pro JSON Report","ShellCheck Scan","SKF Scan","Slither Scan","Snyk Code Scan","Snyk Issue API Scan","Snyk Scan","Socket - Connectors Import","Solar Appscreener Scan","SonarQube API Import","SonarQube Scan","SonarQube Scan detailed","Sonatype Application Scan","SOOS - Connectors Import","SPDX Scan","SpotBugs Scan","Sqlmap Scan","SSH Audit Importer","SSL Labs Scan","Sslscan","Sslyze Scan","SSLyze Scan (JSON)","StackHawk HawkScan","Staticcheck Scan","Syft SBOM","Sysdig CLI Report","Sysdig Vulnerability Report","Talisman Scan","Tartufo Scan","Tenable Scan","terraform-compliance Scan","Terrascan Scan","Testssl Scan","TFLint Scan","TFSec Scan","Threagile risks report","Threat Dragon Scan","ThreatComposer Scan","Tracee Scan","Trivy Operator Scan","Trivy Scan","Trufflehog Scan","Trufflehog3 Scan","Trustwave Fusion API Scan","Trustwave Scan (CSV)","Twistlock Image Scan","Universal Parser - Custom_CSV_Parser_manual_findings_Import","Uptycs Scan","uv audit Scan","Vanta Compliance","VCG Scan","Veracode Scan","Veracode SourceClear Scan","Vulners","Vuls Scan","Wallarm API Security","Wapiti Scan","Wazuh","WFuzz JSON report","WhatWeb Scan","Whispers Scan","WhiteHat Sentinel","Wiz Scan","Wizcli Dir Scan","Wizcli IaC Scan","Wizcli Img Scan","Wpscan","Xanitizer Scan","Xeol Parser","Xygeni SAST Scan","Xygeni SCA Scan","Xygeni Secrets Scan","YARA Scan","Yarn Audit Scan","YesWeHack - Connectors Import","ZAP Scan","Zimperium zScan","Zora Parser"],"type":"string","description":"* `2ms Scan` - 2ms Scan\n* `42Crunch - Connectors Import` - 42Crunch - Connectors Import\n* `AccuKnox - Connectors Import` - AccuKnox - Connectors Import\n* `Action1 Scan` - Action1 Scan\n* `Acunetix Scan` - Acunetix Scanner\n* `AI Agent Red Team` - AI Agent Red Team\n* `AIDE Scan` - AIDE Scan\n* `Akto Scan` - Akto Scan\n* `Alert Logic Scan` - Alert Logic Scan\n* `Anchore Engine Scan` - Anchore Engine Scan\n* `Anchore Enterprise Policy Check` - Anchore Enterprise Policy Check\n* `Anchore Grype` - Anchore Grype\n* `Anchore Grype detailed` - Anchore Grype detailed\n* `AnchoreCTL Policies Report` - AnchoreCTL Policies Report\n* `AnchoreCTL Vuln Report` - AnchoreCTL Vuln Report\n* `Ansible Lint Scan` - Ansible Lint Scan\n* `APKLeaks Scan` - APKLeaks Scan\n* `AppCheck Web Application Scanner` - AppCheck Web Application Scanner\n* `AppSpider Scan` - AppSpider Scan\n* `Aqua Scan` - Aqua Scan\n* `Arachni Scan` - Arachni Scan\n* `AuditJS Scan` - AuditJS Scan\n* `Automox Scan` - Automox Scan\n* `AWS Inspector2 Scan` - AWS Inspector2 Scan\n* `AWS Prowler Scan` - AWS Prowler Scan\n* `AWS Prowler V3` - AWS Prowler V3\n* `AWS Security Finding Format (ASFF) Scan` - AWS Security Finding Format (ASFF)\n* `AWS Security Hub Scan` - AWS Security Hub Scan\n* `Azure Security Center Recommendations Scan` - Azure Security Center Recommendations Scan\n* `Bandit Scan` - Bandit Scan\n* `Beagle Security - Connectors Import` - Beagle Security - Connectors Import\n* `Bearer CLI` - Bearer CLI\n* `BigID Scan` - BigID Scan\n* `Binwalk Scan` - Binwalk Scan\n* `BlackDuck API` - BlackDuck API\n* `Blackduck Binary Analysis` - Blackduck Binary Analysis\n* `Blackduck Component Risk` - Blackduck Component Risk\n* `Blackduck Hub Scan` - Blackduck Hub Scan\n* `bomber Scan` - bomber Scan\n* `Brakeman Scan` - Brakeman Scan\n* `Bright - Connectors Import` - Bright - Connectors Import\n* `Bugcrowd API Import` - Bugcrowd API Import\n* `BugCrowd Scan` - BugCrowd Scan\n* `Bundler-Audit Scan` - Bundler-Audit Scan\n* `Burp Dastardly Scan` - Burp Dastardly Scan\n* `Burp Enterprise Scan` - Burp Enterprise Scan (RENAMED to Burp Suite DAST Scan)\n* `Burp REST API` - Burp REST API\n* `Burp Scan` - Burp Scan\n* `Burp GraphQL API` - Burp Suite DAST GraphQL API\n* `Burp Suite DAST Scan` - Burp Suite DAST Scan\n* `Calico Cloud Image Assurance Scan` - Calico Cloud Image Assurance Scan\n* `capa Scan` - capa Scan\n* `CargoAudit Scan` - CargoAudit Scan\n* `cfn-lint Scan` - cfn-lint Scan\n* `cfn-nag Scan` - cfn-nag Scan\n* `CFRipper Scan` - CFRipper Scan\n* `Checkmarx CxFlow SAST` - Checkmarx CxFlow SAST\n* `Checkmarx One Scan` - Checkmarx One Scan\n* `Checkmarx OSA` - Checkmarx OSA\n* `Checkmarx Scan` - Checkmarx Scan\n* `Checkmarx Scan detailed` - Checkmarx Scan detailed\n* `Checkov Scan` - Checkov Scan\n* `Chef Inspect Log` - Chef Inspect Log\n* `chkrootkit Scan` - chkrootkit Scan\n* `Choctaw Hog Scan` - Choctaw Hog Scan\n* `Clair Scan` - Clair Scan\n* `ClamAV Scan` - ClamAV Scan\n* `Cloud Posture Scan` - Cloud Posture Scan\n* `Cloudflare Insights` - Cloudflare Insights\n* `CloudFormation Guard Scan` - CloudFormation Guard Scan\n* `Cloudsplaining Scan` - Cloudsplaining Scan\n* `Cloudsploit Scan` - Cloudsploit Scan\n* `Cobalt.io API Import` - Cobalt.io API Import\n* `Cobalt.io Scan` - Cobalt.io Scan\n* `Codacy - Connectors Import` - Codacy - Connectors Import\n* `Codechecker Report native` - Codechecker Report native\n* `CodeQL Scan` - CodeQL Scan\n* `Composer Audit Scan` - Composer Audit Scan\n* `Conftest Scan` - Conftest Scan\n* `Contrast Scan` - Contrast Scan\n* `Coverity API` - Coverity API\n* `Coverity Scan JSON Report` - Coverity Scan JSON Report\n* `Cppcheck Scan` - Cppcheck Scan\n* `Crashtest Security JSON File` - Crashtest Security JSON File\n* `Crashtest Security XML File` - Crashtest Security XML File\n* `CredScan Scan` - CredScan Scan\n* `CrowdStrike:Spotlight - Connectors Import` - CrowdStrike:Spotlight - Connectors Import\n* `Crunch42 Scan` - Crunch42 Scan\n* `CSAF Scan` - CSAF Scan\n* `cwe_checker Scan` - cwe_checker Scan\n* `CyberArk Certificate Manager Scan` - CyberArk Certificate Manager Scan\n* `Cyberwatch scan (Galeax)` - Cyberwatch scan (Galeax)\n* `CycloneDX Scan` - CycloneDX Scan\n* `Cycognito Scan` - Cycognito Scan\n* `Dalfox Scan` - Dalfox Scan\n* `Datadog Cloud Security` - Datadog Cloud Security\n* `DawnScanner Scan` - DawnScanner Scan\n* `debsecan Scan` - debsecan Scan\n* `Deepfence Threatmapper Report` - Deepfence Threatmapper Report\n* `DeepSource - Connectors Import` - DeepSource - Connectors Import\n* `Dependency Check Scan` - Dependency Check Scan\n* `Dependency Track Finding Packaging Format (FPF) Export` - Dependency Track Finding Packaging Format (FPF) Export\n* `Detect-secrets Scan` - Detect-secrets Scan\n* `Detectify Scan` - Detectify Scan\n* `DevSkim Scan` - DevSkim Scan\n* `Dirsearch Scan` - Dirsearch Scan\n* `DISA STIG Checklist` - DISA STIG Checklist\n* `docker-bench-security Scan` - docker-bench-security Scan\n* `dockerfile_lint Scan` - dockerfile_lint Scan\n* `Dockle Scan` - Dockle Scan\n* `Dodgy Scan` - Dodgy Scan\n* `Dotnet Vulnerable Packages Scan` - Dotnet Vulnerable Packages Scan\n* `Dragos Scan` - Dragos Scan\n* `DrHeader JSON Importer` - DrHeader JSON Importer\n* `DSOP Scan` - DSOP Scan\n* `Duroc Hog Scan` - Duroc Hog Scan\n* `Edgescan Scan` - Edgescan Scan\n* `Elastic Security:CNVM - Connectors Import` - Elastic Security:CNVM - Connectors Import\n* `Elastic Security:Detections - Connectors Import` - Elastic Security:Detections - Connectors Import\n* `Elastic Security:Posture - Connectors Import` - Elastic Security:Posture - Connectors Import\n* `Endor Labs - Connectors Import` - Endor Labs - Connectors Import\n* `Escape - Connectors Import` - Escape - Connectors Import\n* `ESLint Scan` - ESLint Scan\n* `Essex Hog Scan` - Essex Hog Scan\n* `Fairwinds Insights - Connectors Import` - Fairwinds Insights - Connectors Import\n* `Falco Scan` - Falco Scan\n* `ffuf Scan` - ffuf Scan\n* `Fickling Scan` - Fickling Scan\n* `Finite State - Connectors Import` - Finite State - Connectors Import\n* `Firmwalker Scan` - Firmwalker Scan\n* `Flawfinder Scan` - Flawfinder Scan\n* `Fleet:Policies - Connectors Import` - Fleet:Policies - Connectors Import\n* `Fleet:Vulnerabilities - Connectors Import` - Fleet:Vulnerabilities - Connectors Import\n* `Fortify Scan` - Fortify Scan\n* `Fortify Scan v2` - Fortify Scan v2\n* `FOSSA - Connectors Import` - FOSSA - Connectors Import\n* `Garak Scan` - Garak Scan\n* `Generic Findings Import` - Generic Findings Import\n* `Ggshield Scan` - Ggshield Scan\n* `GitGuardian - Connectors Import` - GitGuardian - Connectors Import\n* `Github SAST Scan` - Github SAST Scan\n* `Github Secrets Detection Report Scan` - Github Secrets Detection Report Scan\n* `Github Vulnerability Scan` - Github Vulnerability Scan\n* `GitLab API Fuzzing Report Scan` - GitLab API Fuzzing Report Scan\n* `GitLab Container Scan` - GitLab Container Scan Scan\n* `GitLab DAST Report` - GitLab DAST Report\n* `GitLab Dependency Scanning Report` - GitLab Dependency Scanning Report\n* `GitLab SAST Report` - GitLab SAST Report\n* `GitLab Secret Detection Report` - GitLab Secret Detection Report\n* `Gitleaks Scan` - Gitleaks Scan\n* `Gixy Scan` - Gixy Scan\n* `Gobuster Scan` - Gobuster Scan\n* `Google Cloud Artifact Vulnerability Scan` - Google Cloud Artifact Vulnerability Scan\n* `Google Cloud SCC - Connectors Import` - Google Cloud SCC - Connectors Import\n* `Gosec Scanner` - Gosec Scanner\n* `Gottingen Hog Scan` - Gottingen Hog Scan\n* `Govulncheck Scanner` - Govulncheck Scanner\n* `Govulncheck Scanner V2` - Govulncheck Scanner V2\n* `Grant Scan` - Grant Scan\n* `Group-IB ASM - Connectors Import` - Group-IB ASM - Connectors Import\n* `GuardDog Scan` - GuardDog Scan\n* `HackerOne - Connectors Import` - HackerOne - Connectors Import\n* `HackerOne Cases` - HackerOne Cases\n* `Hadolint Dockerfile check` - Hadolint Dockerfile check\n* `Halo Security - Connectors Import` - Halo Security - Connectors Import\n* `Harbor Vulnerability Scan` - Harbor Vulnerability Scan\n* `HCL AppScan on Cloud SAST XML` - HCL AppScan on Cloud SAST XML\n* `HCLAppScan XML` - HCLAppScan XML\n* `HiddenLayer Model Scan` - HiddenLayer Model Scan\n* `Holm Security Scan` - Holm Security Scan\n* `Horusec Scan` - Horusec Scan\n* `httpx Scan` - httpx Scan\n* `Humble Json Importer` - Humble Json Importer\n* `HuskyCI Report` - HuskyCI Report\n* `Hydra Scan` - Hydra Scan\n* `IBM AppScan DAST` - IBM AppScan DAST\n* `Immuniweb Scan` - Immuniweb Scan\n* `Infer Scan` - Infer Scan\n* `Intigriti - Connectors Import` - Intigriti - Connectors Import\n* `Intruder API Import` - Intruder API Import\n* `IntSights Report` - IntSights Report\n* `Invicti Scan` - Invicti Scan\n* `IriusRisk Threats Scan` - IriusRisk Threats Scan\n* `JFrog Xray API Summary Artifact Scan` - JFrog Xray API Summary Artifact Scan\n* `JFrog Xray On Demand Binary Scan` - JFrog Xray On Demand Binary Scan\n* `JFrog Xray Scan` - JFrog Xray Scan\n* `JFrog Xray Unified Scan` - JFrog Xray Unified Scan\n* `KICS Scan` - KICS Scan\n* `Kingfisher Scan` - Kingfisher Scan\n* `Kiuwan SCA Scan` - Kiuwan SCA Scan\n* `Kiuwan Scan` - Kiuwan Scan\n* `Klocwork Scan` - Klocwork Scan\n* `KrakenD Audit Scan` - KrakenD Audit Scan\n* `kube-bench Scan` - kube-bench Scan\n* `kube-score Scan` - kube-score Scan\n* `Kubeaudit Scan` - Kubeaudit Scan\n* `KubeEye Scan` - KubeEye Scan\n* `KubeHunter Scan` - KubeHunter Scan\n* `KubeLinter Scan` - KubeLinter Scan\n* `kubent Scan` - kubent Scan\n* `Kubescape JSON Importer` - Kubescape JSON Importer\n* `kubesec Scan` - kubesec Scan\n* `Kyverno Scan` - Kyverno Scan\n* `Lacework - Connectors Import` - Lacework - Connectors Import\n* `Legitify Scan` - Legitify Scan\n* `Licensecheck Scan` - Licensecheck Scan\n* `Lynis Scan` - Lynis Scan\n* `ManageEngine Vulnerability Manager Plus Scan` - ManageEngine Vulnerability Manager Plus Scan\n* `Masscan Scan` - Masscan Scan\n* `Mayhem SARIF Report` - Mayhem SARIF Report\n* `Mend Scan` - Mend Scan\n* `Meterian Scan` - Meterian Scan\n* `Microfocus Webinspect Scan` - Microfocus Webinspect Scan\n* `Microsoft Defender for Cloud - Connectors Import` - Microsoft Defender for Cloud - Connectors Import\n* `Mix Audit Scan` - Mix Audit Scan\n* `MobSF Scan` - MobSF Scan\n* `Mobsfscan Scan` - MobSF Scan\n* `MobSF Scorecard Scan` - MobSF Scorecard Scan\n* `ModelScan Scan` - ModelScan Scan\n* `Mozilla Observatory Scan` - Mozilla Observatory Scan\n* `MSDefender Parser` - MSDefender Parser\n* `n0s1 Scanner` - n0s1 Scanner\n* `Naabu Scan` - Naabu Scan\n* `Nancy Scan` - Nancy Scan\n* `NetRise Scan` - NetRise Scan\n* `Netsparker Scan` - Netsparker Scan\n* `Nettacker Scan` - Nettacker Scan\n* `NeuVector (compliance)` - NeuVector (compliance)\n* `NeuVector (REST)` - NeuVector (REST)\n* `Nexpose Scan` - Nexpose Scan\n* `Nightfall AI - Connectors Import` - Nightfall AI - Connectors Import\n* `Nikto Scan` - Nikto Scan\n* `njsscan Scan` - njsscan Scan\n* `Nmap Scan` - Nmap Scan\n* `Node Security Platform Scan` - Node Security Platform Scan\n* `Noir Scan` - Noir Scan\n* `Nosey Parker Scan` - Nosey Parker Scan\n* `NowSecure` - NowSecure\n* `Nozomi Vantage Scan` - Nozomi Vantage Scan\n* `NPM Audit Scan` - NPM Audit Scan\n* `NPM Audit v7+ Scan` - NPM Audit v7+ Scan\n* `Nuclei Scan` - Nuclei Scan\n* `OpenReports` - OpenReports\n* `Openscap Vulnerability Scan` - Openscap Vulnerability Scan\n* `OpenSSF Scorecard` - OpenSSF Scorecard\n* `OpenVAS Parser` - OpenVAS Parser\n* `OpenVAS Parser v2` - OpenVAS Parser v2\n* `OpenVEX Scan` - OpenVEX Scan\n* `OPF Scan` - OPF Scan\n* `Orca Security Alerts` - Orca Security Alerts\n* `ORT evaluated model Importer` - ORT evaluated model Importer\n* `OssIndex Devaudit SCA Scan Importer` - OssIndex Devaudit SCA Scan Importer\n* `Ostorlab Scan` - Ostorlab Scan\n* `OSV Scan` - OSV Scan\n* `Outpost24 Scan` - Outpost24 Scan\n* `Parasoft DTP Scan` - Parasoft DTP Scan\n* `PHP Security Audit v2` - PHP Security Audit v2\n* `PHP Symfony Security Check` - PHP Symfony Security Check\n* `PHPStan Scan` - PHPStan Scan\n* `PICUS Scan` - PICUS Scan\n* `PingCastle` - PingCastle\n* `pip-audit Scan` - pip-audit Scan\n* `pip-licenses Scan` - pip-licenses Scan\n* `Pluto Scan` - Pluto Scan\n* `PMapper Scan` - PMapper Scan\n* `PMD Scan` - PMD Scan\n* `pnpm Audit Scan` - pnpm Audit Scan\n* `Polaris Scan` - Polaris Scan\n* `Popeye Scan` - Popeye Scan\n* `Probely API Import` - Probely API Import\n* `Progpilot Scan` - Progpilot Scan\n* `Promptfoo Scan` - Promptfoo Scan\n* `Prospector Scan` - Prospector Scan\n* `Prowler Scan` - Prowler Scan\n* `Psalm Scan` - Psalm Scan\n* `PTART Report` - PTART Report\n* `PWN SAST` - PWN SAST\n* `PyRIT Scan` - PyRIT Scan\n* `Python Taint Scan` - Python Taint Scan\n* `QARK Scan` - QARK Scan\n* `Qualys Hacker Guardian Scan` - Qualys Hacker Guardian Scan\n* `Qualys Infrastructure Scan (WebGUI XML)` - Qualys Infrastructure Scan (WebGUI XML)\n* `Qualys Scan` - Qualys Scan\n* `Qualys VMDR` - Qualys VMDR\n* `Qualys Webapp Scan` - Qualys Webapp Scan\n* `Quark-Engine Scan` - Quark-Engine Scan\n* `Quay - Connectors Import` - Quay - Connectors Import\n* `Qwiet Scan` - Qwiet Scan\n* `Rapid7 InsightAppSec - Connectors Import` - Rapid7 InsightAppSec - Connectors Import\n* `Rapplex Scan` - Rapplex Scan\n* `Red Hat Satellite` - Red Hat Satellite\n* `Regula Scan` - Regula Scan\n* `Retire.js Scan` - Retire.js Scan\n* `ReversingLabs Spectra Assure` - ReversingLabs Spectra Assure\n* `Risk Recon API Importer` - Risk Recon API Importer\n* `rkhunter Scan` - rkhunter Scan\n* `Rubocop Scan` - Rubocop Scan\n* `Ruff Scan` - Ruff Scan\n* `Rusty Hog Scan` - Rusty Hog Scan\n* `Safety Scan` - Safety Scan\n* `SARIF` - SARIF\n* `sbomqs Scan` - sbomqs Scan\n* `Scantist Scan` - Scantist Scan\n* `Scout Suite Scan` - Scout Suite Scan\n* `ScubaGear Report Scan` - ScubaGear Report Scan\n* `ScubaGear Scan` - ScubaGear Scan\n* `ScubaGoggles Action Plan` - ScubaGoggles Action Plan\n* `ScubaGoggles Scan` - ScubaGoggles Scan\n* `Seal Security Scan` - Seal Security Scan\n* `Secretlint Scan` - Secretlint Scan\n* `Semgrep JSON Report` - Semgrep JSON Report\n* `Semgrep Pro JSON Report` - Semgrep Pro JSON Report\n* `ShellCheck Scan` - ShellCheck Scan\n* `SKF Scan` - SKF Scan\n* `Slither Scan` - Slither Scan\n* `Snyk Code Scan` - Snyk Code Scan\n* `Snyk Issue API Scan` - Snyk Issue API Scan\n* `Snyk Scan` - Snyk Scan\n* `Socket - Connectors Import` - Socket - Connectors Import\n* `Solar Appscreener Scan` - Solar Appscreener Scan Detailed_Results.csv\n* `SonarQube API Import` - SonarQube API Import\n* `SonarQube Scan` - SonarQube Scan\n* `SonarQube Scan detailed` - SonarQube Scan detailed\n* `Sonatype Application Scan` - Sonatype Application Scan\n* `SOOS - Connectors Import` - SOOS - Connectors Import\n* `SPDX Scan` - SPDX Scan\n* `SpotBugs Scan` - SpotBugs Scan\n* `Sqlmap Scan` - Sqlmap Scan\n* `SSH Audit Importer` - SSH Audit Importer\n* `SSL Labs Scan` - SSL Labs Scan\n* `Sslscan` - Sslscan\n* `Sslyze Scan` - Sslyze Scan\n* `SSLyze Scan (JSON)` - SSLyze Scan (JSON)\n* `StackHawk HawkScan` - StackHawk HawkScan\n* `Staticcheck Scan` - Staticcheck Scan\n* `Syft SBOM` - Syft SBOM\n* `Sysdig CLI Report` - Sysdig CLI Report Scan\n* `Sysdig Vulnerability Report` - Sysdig Vulnerability Report Scan\n* `Talisman Scan` - Talisman Scan\n* `Tartufo Scan` - Tartufo Scan\n* `Tenable Scan` - Tenable Scan\n* `terraform-compliance Scan` - terraform-compliance Scan\n* `Terrascan Scan` - Terrascan Scan\n* `Testssl Scan` - Testssl Scan\n* `TFLint Scan` - TFLint Scan\n* `TFSec Scan` - TFSec Scan\n* `Threagile risks report` - Threagile risks report\n* `Threat Dragon Scan` - Threat Dragon Scan\n* `ThreatComposer Scan` - ThreatComposer Scan\n* `Tracee Scan` - Tracee Scan\n* `Trivy Operator Scan` - Trivy Operator Scan\n* `Trivy Scan` - Trivy Scan\n* `Trufflehog Scan` - Trufflehog Scan\n* `Trufflehog3 Scan` - Trufflehog3 Scan\n* `Trustwave Fusion API Scan` - Trustwave Fusion API Scan\n* `Trustwave Scan (CSV)` - Trustwave Scan (CSV)\n* `Twistlock Image Scan` - Twistlock Image Scan\n* `Universal Parser - Custom_CSV_Parser_manual_findings_Import` - Universal Parser - Custom_CSV_Parser_manual_findings_Import\n* `Uptycs Scan` - Uptycs Scan\n* `uv audit Scan` - uv audit Scan\n* `Vanta Compliance` - Vanta Compliance\n* `VCG Scan` - VCG Scan\n* `Veracode Scan` - Veracode Scan\n* `Veracode SourceClear Scan` - Veracode SourceClear Scan\n* `Vulners` - Vulners\n* `Vuls Scan` - Vuls Scan\n* `Wallarm API Security` - Wallarm API Security\n* `Wapiti Scan` - Wapiti Scan\n* `Wazuh` - Wazuh\n* `WFuzz JSON report` - WFuzz JSON report\n* `WhatWeb Scan` - WhatWeb Scan\n* `Whispers Scan` - Whispers Scan\n* `WhiteHat Sentinel` - WhiteHat Sentinel\n* `Wiz Scan` - Wiz Scan\n* `Wizcli Dir Scan` - Wizcli Dir Scan\n* `Wizcli IaC Scan` - Wizcli IaC Scan\n* `Wizcli Img Scan` - Wizcli Img Scan\n* `Wpscan` - Wpscan\n* `Xanitizer Scan` - Xanitizer Scan\n* `Xeol Parser` - Xeol Parser\n* `Xygeni SAST Scan` - Xygeni SAST Scan\n* `Xygeni SCA Scan` - Xygeni SCA Scan\n* `Xygeni Secrets Scan` - Xygeni Secrets Scan\n* `YARA Scan` - YARA Scan\n* `Yarn Audit Scan` - Yarn Audit Scan\n* `YesWeHack - Connectors Import` - YesWeHack - Connectors Import\n* `ZAP Scan` - ZAP Scan\n* `Zimperium zScan` - Zimperium zScan\n* `Zora Parser` - Zora Parser","x-spec-enum-id":"4fb3bf5945e5491f"},"engagement":{"type":"integer"},"tags":{"type":"array","items":{"type":"string"},"description":"Add tags that help describe this scan."},"close_old_findings":{"type":"boolean","default":false,"description":"Old findings no longer present in the new report get closed as mitigated when importing. If service has been set, only the findings for this service will be closed; if no service is set, only findings without a service will be closed. This only affects findings within the same engagement."},"close_old_findings_product_scope":{"type":"boolean","default":false,"description":"Old findings no longer present in the new report get closed as mitigated when importing. If service has been set, only the findings for this service will be closed; if no service is set, only findings without a service will be closed. This only affects findings within the same product.By default, it is false meaning that only old findings of the same type in the engagement are in scope."},"version":{"type":"string","description":"Version that was scanned."},"test":{"type":"integer","readOnly":true},"background_import":{"type":"boolean","nullable":true,"description":"Selecting to import in the background will modify the import process to first parse the file for any errors, return the response, and then create findings in the background. When this is true the findings do not exist yet at the moment the response is produced, so the response deliberately carries no 'statistics' and no 'deduplication_complete' key — they are absent rather than zeroed, because zeros would misreport a scan that has not been processed. Use 'status' and 'findings_parsed' instead, then poll GET /api/v2/tests/{test_id}/ and read its 'status' and 'processing' fields until 'status' is 'Processed' or 'Failed'."},"pci_role":{"enum":["none","internal_vulnerability_scan","external_asv_scan","web_application_assessment","penetration_test","segmentation_test",null],"type":"string","x-spec-enum-id":"df388145a7e568b9","nullable":true,"description":"PCI DSS Requirement 11 role to record for the test this scan lands in, overriding the test type's default role.\n\n* `none` - Not a PCI test\n* `internal_vulnerability_scan` - Internal vulnerability scan\n* `external_asv_scan` - External ASV scan\n* `web_application_assessment` - Web application assessment\n* `penetration_test` - Penetration test\n* `segmentation_test` - Segmentation test"},"authenticated":{"enum":["unknown","yes","no",null],"type":"string","x-spec-enum-id":"d1c998de7a29cb98","nullable":true,"description":"Whether this scan ran with credentials (PCI DSS Requirement 11.3.1.2).\n\n* `unknown` - Unknown\n* `yes` - Authenticated\n* `no` - Not authenticated"},"asv_result":{"enum":["not_applicable","pass","fail",null],"type":"string","x-spec-enum-id":"2622389e4dfa2e13","nullable":true,"description":"The result the Approved Scanning Vendor reported for this scan, as recorded by the entity. DefectDojo records what you report; it does not validate an ASV attestation.\n\n* `not_applicable` - Not applicable\n* `pass` - Passing\n* `fail` - Failing"},"asv_vendor":{"type":"string","description":"The Approved Scanning Vendor that ran this scan."},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"message":{"type":"string","readOnly":true,"default":"Import processed successfully"},"status":{"type":"string","readOnly":true,"description":"Lifecycle status of the test at the moment this response was produced, one of 'Processing', 'Post Processing - Deduplication', 'Post Processing - False Positive History', 'Processed' or 'Failed'. Only present when background_import is true; poll the test to follow it to completion."},"findings_parsed":{"type":"integer","readOnly":true,"description":"Number of findings parsed out of the uploaded report. Only present when background_import is true. This is a parse count, not a created count: deduplication and the configured import options decide how many findings the background work actually writes."},"name_resolution":{"allOf":[{"$ref":"#/components/schemas/ImportNameResolution"}],"readOnly":true,"description":"Present only when product_name was a former name of the target, or product_type_name named where it was before a move (or a former name of where it is now), and the import used the current names instead of being refused or creating a duplicate. Says what was sent, the current names used, and in 'message' what to change in the pipeline. Only a caller who can view the target gets this: anyone else gets the answer the import gives without it."}},"required":["deduplication_complete","engagement_id","findings_parsed","message","name_resolution","pro","product_id","product_type_id","scan_type","statistics","status","test","test_id"]},"AsyncImportScanRequest":{"type":"object","properties":{"scan_date":{"type":"string","format":"date","description":"Scan completion date will be used on all findings."},"minimum_severity":{"enum":["Info","Low","Medium","High","Critical"],"type":"string","x-spec-enum-id":"fc5d16a20ed06136","default":"Info","description":"Minimum severity level to be imported\n\n* `Info` - Info\n* `Low` - Low\n* `Medium` - Medium\n* `High` - High\n* `Critical` - Critical"},"active":{"type":"boolean","description":"Force findings to be active/inactive or default to the original tool (None)"},"verified":{"type":"boolean","description":"Force findings to be verified/not verified or default to the original tool (None)"},"endpoint_to_add":{"type":"integer","description":"Enter the ID of a Location that is associated with the target Product. New Findings will be added to that Location."},"file":{"type":"string","format":"binary","pattern":"(?:xml|csv|nessus|json|jsonl|html|js|zip|xlsx|txt|sarif|fpr|md|log|fvdl|spdx|ckl|cklb)$"},"product_type_name":{"type":"string","minLength":1,"description":"Also referred to as 'Organization' name."},"product_name":{"type":"string","minLength":1,"description":"Also referred to as 'Asset' name."},"engagement_name":{"type":"string","minLength":1},"engagement_end_date":{"type":"string","format":"date","description":"End Date for Engagement. Default is current time + 365 days. Required format year-month-day"},"source_code_management_uri":{"type":"string","format":"uri","minLength":1,"description":"Resource link to source code","maxLength":600},"test_title":{"type":"string","minLength":1},"auto_create_context":{"type":"boolean"},"deduplication_on_engagement":{"type":"boolean"},"lead":{"type":"integer","nullable":true},"push_to_jira":{"type":"boolean","default":false},"deduplication_execution_mode":{"enum":["async","async_wait","sync",null],"type":"string","x-spec-enum-id":"bf7fb8ff28520a46","nullable":true,"description":"Override how import post-processing (deduplication, jira push, grading, ...) is executed for this request. 'async' dispatches post-processing to the background and responds immediately (default). 'async_wait' dispatches to the background but waits for deduplication to finish before responding, so notifications and the returned statistics reflect the deduplicated state. 'sync' runs everything inline. If omitted, falls back to the user's profile setting (deduplication_execution_mode).\n\n* `async` - Async (do not wait)\n* `async_wait` - Async, wait for deduplication\n* `sync` - Synchronous (block)"},"environment":{"type":"string","minLength":1},"build_id":{"type":"string","minLength":1,"description":"ID of the build that was scanned."},"branch_tag":{"type":"string","minLength":1,"description":"Branch or Tag that was scanned."},"commit_hash":{"type":"string","minLength":1,"description":"Commit that was scanned."},"api_scan_configuration":{"type":"integer","nullable":true},"service":{"type":"string","minLength":1,"description":"A service is a self-contained piece of functionality within a Product. This is an optional field which is used in deduplication and closing of old findings when set. This affects the whole engagement/product depending on your deduplication scope."},"group_by":{"enum":["component_name","component_name+component_version","file_path","finding_title","vuln_id_from_tool"],"type":"string","x-spec-enum-id":"a9b19a914dcfbd21","description":"Choose an option to automatically group new findings by the chosen option.\n\n* `component_name` - Component Name\n* `component_name+component_version` - Component Name + Version\n* `file_path` - File path\n* `finding_title` - Finding Title\n* `vuln_id_from_tool` - Vulnerability ID from Tool"},"create_finding_groups_for_all_findings":{"type":"boolean","default":true,"description":"If set to false, finding groups will only be created when there is more than one grouped finding"},"apply_tags_to_findings":{"type":"boolean","description":"If set to True, the tags will be applied to the findings"},"apply_tags_to_endpoints":{"type":"boolean","description":"If set to True, the tags will be applied to the locations"},"scan_type":{"enum":["2ms Scan","42Crunch - Connectors Import","AccuKnox - Connectors Import","Action1 Scan","Acunetix Scan","AI Agent Red Team","AIDE Scan","Akto Scan","Alert Logic Scan","Anchore Engine Scan","Anchore Enterprise Policy Check","Anchore Grype","Anchore Grype detailed","AnchoreCTL Policies Report","AnchoreCTL Vuln Report","Ansible Lint Scan","APKLeaks Scan","AppCheck Web Application Scanner","AppSpider Scan","Aqua Scan","Arachni Scan","AuditJS Scan","Automox Scan","AWS Inspector2 Scan","AWS Prowler Scan","AWS Prowler V3","AWS Security Finding Format (ASFF) Scan","AWS Security Hub Scan","Azure Security Center Recommendations Scan","Bandit Scan","Beagle Security - Connectors Import","Bearer CLI","BigID Scan","Binwalk Scan","BlackDuck API","Blackduck Binary Analysis","Blackduck Component Risk","Blackduck Hub Scan","bomber Scan","Brakeman Scan","Bright - Connectors Import","Bugcrowd API Import","BugCrowd Scan","Bundler-Audit Scan","Burp Dastardly Scan","Burp Enterprise Scan","Burp REST API","Burp Scan","Burp GraphQL API","Burp Suite DAST Scan","Calico Cloud Image Assurance Scan","capa Scan","CargoAudit Scan","cfn-lint Scan","cfn-nag Scan","CFRipper Scan","Checkmarx CxFlow SAST","Checkmarx One Scan","Checkmarx OSA","Checkmarx Scan","Checkmarx Scan detailed","Checkov Scan","Chef Inspect Log","chkrootkit Scan","Choctaw Hog Scan","Clair Scan","ClamAV Scan","Cloud Posture Scan","Cloudflare Insights","CloudFormation Guard Scan","Cloudsplaining Scan","Cloudsploit Scan","Cobalt.io API Import","Cobalt.io Scan","Codacy - Connectors Import","Codechecker Report native","CodeQL Scan","Composer Audit Scan","Conftest Scan","Contrast Scan","Coverity API","Coverity Scan JSON Report","Cppcheck Scan","Crashtest Security JSON File","Crashtest Security XML File","CredScan Scan","CrowdStrike:Spotlight - Connectors Import","Crunch42 Scan","CSAF Scan","cwe_checker Scan","CyberArk Certificate Manager Scan","Cyberwatch scan (Galeax)","CycloneDX Scan","Cycognito Scan","Dalfox Scan","Datadog Cloud Security","DawnScanner Scan","debsecan Scan","Deepfence Threatmapper Report","DeepSource - Connectors Import","Dependency Check Scan","Dependency Track Finding Packaging Format (FPF) Export","Detect-secrets Scan","Detectify Scan","DevSkim Scan","Dirsearch Scan","DISA STIG Checklist","docker-bench-security Scan","dockerfile_lint Scan","Dockle Scan","Dodgy Scan","Dotnet Vulnerable Packages Scan","Dragos Scan","DrHeader JSON Importer","DSOP Scan","Duroc Hog Scan","Edgescan Scan","Elastic Security:CNVM - Connectors Import","Elastic Security:Detections - Connectors Import","Elastic Security:Posture - Connectors Import","Endor Labs - Connectors Import","Escape - Connectors Import","ESLint Scan","Essex Hog Scan","Fairwinds Insights - Connectors Import","Falco Scan","ffuf Scan","Fickling Scan","Finite State - Connectors Import","Firmwalker Scan","Flawfinder Scan","Fleet:Policies - Connectors Import","Fleet:Vulnerabilities - Connectors Import","Fortify Scan","Fortify Scan v2","FOSSA - Connectors Import","Garak Scan","Generic Findings Import","Ggshield Scan","GitGuardian - Connectors Import","Github SAST Scan","Github Secrets Detection Report Scan","Github Vulnerability Scan","GitLab API Fuzzing Report Scan","GitLab Container Scan","GitLab DAST Report","GitLab Dependency Scanning Report","GitLab SAST Report","GitLab Secret Detection Report","Gitleaks Scan","Gixy Scan","Gobuster Scan","Google Cloud Artifact Vulnerability Scan","Google Cloud SCC - Connectors Import","Gosec Scanner","Gottingen Hog Scan","Govulncheck Scanner","Govulncheck Scanner V2","Grant Scan","Group-IB ASM - Connectors Import","GuardDog Scan","HackerOne - Connectors Import","HackerOne Cases","Hadolint Dockerfile check","Halo Security - Connectors Import","Harbor Vulnerability Scan","HCL AppScan on Cloud SAST XML","HCLAppScan XML","HiddenLayer Model Scan","Holm Security Scan","Horusec Scan","httpx Scan","Humble Json Importer","HuskyCI Report","Hydra Scan","IBM AppScan DAST","Immuniweb Scan","Infer Scan","Intigriti - Connectors Import","Intruder API Import","IntSights Report","Invicti Scan","IriusRisk Threats Scan","JFrog Xray API Summary Artifact Scan","JFrog Xray On Demand Binary Scan","JFrog Xray Scan","JFrog Xray Unified Scan","KICS Scan","Kingfisher Scan","Kiuwan SCA Scan","Kiuwan Scan","Klocwork Scan","KrakenD Audit Scan","kube-bench Scan","kube-score Scan","Kubeaudit Scan","KubeEye Scan","KubeHunter Scan","KubeLinter Scan","kubent Scan","Kubescape JSON Importer","kubesec Scan","Kyverno Scan","Lacework - Connectors Import","Legitify Scan","Licensecheck Scan","Lynis Scan","ManageEngine Vulnerability Manager Plus Scan","Masscan Scan","Mayhem SARIF Report","Mend Scan","Meterian Scan","Microfocus Webinspect Scan","Microsoft Defender for Cloud - Connectors Import","Mix Audit Scan","MobSF Scan","Mobsfscan Scan","MobSF Scorecard Scan","ModelScan Scan","Mozilla Observatory Scan","MSDefender Parser","n0s1 Scanner","Naabu Scan","Nancy Scan","NetRise Scan","Netsparker Scan","Nettacker Scan","NeuVector (compliance)","NeuVector (REST)","Nexpose Scan","Nightfall AI - Connectors Import","Nikto Scan","njsscan Scan","Nmap Scan","Node Security Platform Scan","Noir Scan","Nosey Parker Scan","NowSecure","Nozomi Vantage Scan","NPM Audit Scan","NPM Audit v7+ Scan","Nuclei Scan","OpenReports","Openscap Vulnerability Scan","OpenSSF Scorecard","OpenVAS Parser","OpenVAS Parser v2","OpenVEX Scan","OPF Scan","Orca Security Alerts","ORT evaluated model Importer","OssIndex Devaudit SCA Scan Importer","Ostorlab Scan","OSV Scan","Outpost24 Scan","Parasoft DTP Scan","PHP Security Audit v2","PHP Symfony Security Check","PHPStan Scan","PICUS Scan","PingCastle","pip-audit Scan","pip-licenses Scan","Pluto Scan","PMapper Scan","PMD Scan","pnpm Audit Scan","Polaris Scan","Popeye Scan","Probely API Import","Progpilot Scan","Promptfoo Scan","Prospector Scan","Prowler Scan","Psalm Scan","PTART Report","PWN SAST","PyRIT Scan","Python Taint Scan","QARK Scan","Qualys Hacker Guardian Scan","Qualys Infrastructure Scan (WebGUI XML)","Qualys Scan","Qualys VMDR","Qualys Webapp Scan","Quark-Engine Scan","Quay - Connectors Import","Qwiet Scan","Rapid7 InsightAppSec - Connectors Import","Rapplex Scan","Red Hat Satellite","Regula Scan","Retire.js Scan","ReversingLabs Spectra Assure","Risk Recon API Importer","rkhunter Scan","Rubocop Scan","Ruff Scan","Rusty Hog Scan","Safety Scan","SARIF","sbomqs Scan","Scantist Scan","Scout Suite Scan","ScubaGear Report Scan","ScubaGear Scan","ScubaGoggles Action Plan","ScubaGoggles Scan","Seal Security Scan","Secretlint Scan","Semgrep JSON Report","Semgrep Pro JSON Report","ShellCheck Scan","SKF Scan","Slither Scan","Snyk Code Scan","Snyk Issue API Scan","Snyk Scan","Socket - Connectors Import","Solar Appscreener Scan","SonarQube API Import","SonarQube Scan","SonarQube Scan detailed","Sonatype Application Scan","SOOS - Connectors Import","SPDX Scan","SpotBugs Scan","Sqlmap Scan","SSH Audit Importer","SSL Labs Scan","Sslscan","Sslyze Scan","SSLyze Scan (JSON)","StackHawk HawkScan","Staticcheck Scan","Syft SBOM","Sysdig CLI Report","Sysdig Vulnerability Report","Talisman Scan","Tartufo Scan","Tenable Scan","terraform-compliance Scan","Terrascan Scan","Testssl Scan","TFLint Scan","TFSec Scan","Threagile risks report","Threat Dragon Scan","ThreatComposer Scan","Tracee Scan","Trivy Operator Scan","Trivy Scan","Trufflehog Scan","Trufflehog3 Scan","Trustwave Fusion API Scan","Trustwave Scan (CSV)","Twistlock Image Scan","Universal Parser - Custom_CSV_Parser_manual_findings_Import","Uptycs Scan","uv audit Scan","Vanta Compliance","VCG Scan","Veracode Scan","Veracode SourceClear Scan","Vulners","Vuls Scan","Wallarm API Security","Wapiti Scan","Wazuh","WFuzz JSON report","WhatWeb Scan","Whispers Scan","WhiteHat Sentinel","Wiz Scan","Wizcli Dir Scan","Wizcli IaC Scan","Wizcli Img Scan","Wpscan","Xanitizer Scan","Xeol Parser","Xygeni SAST Scan","Xygeni SCA Scan","Xygeni Secrets Scan","YARA Scan","Yarn Audit Scan","YesWeHack - Connectors Import","ZAP Scan","Zimperium zScan","Zora Parser"],"type":"string","description":"* `2ms Scan` - 2ms Scan\n* `42Crunch - Connectors Import` - 42Crunch - Connectors Import\n* `AccuKnox - Connectors Import` - AccuKnox - Connectors Import\n* `Action1 Scan` - Action1 Scan\n* `Acunetix Scan` - Acunetix Scanner\n* `AI Agent Red Team` - AI Agent Red Team\n* `AIDE Scan` - AIDE Scan\n* `Akto Scan` - Akto Scan\n* `Alert Logic Scan` - Alert Logic Scan\n* `Anchore Engine Scan` - Anchore Engine Scan\n* `Anchore Enterprise Policy Check` - Anchore Enterprise Policy Check\n* `Anchore Grype` - Anchore Grype\n* `Anchore Grype detailed` - Anchore Grype detailed\n* `AnchoreCTL Policies Report` - AnchoreCTL Policies Report\n* `AnchoreCTL Vuln Report` - AnchoreCTL Vuln Report\n* `Ansible Lint Scan` - Ansible Lint Scan\n* `APKLeaks Scan` - APKLeaks Scan\n* `AppCheck Web Application Scanner` - AppCheck Web Application Scanner\n* `AppSpider Scan` - AppSpider Scan\n* `Aqua Scan` - Aqua Scan\n* `Arachni Scan` - Arachni Scan\n* `AuditJS Scan` - AuditJS Scan\n* `Automox Scan` - Automox Scan\n* `AWS Inspector2 Scan` - AWS Inspector2 Scan\n* `AWS Prowler Scan` - AWS Prowler Scan\n* `AWS Prowler V3` - AWS Prowler V3\n* `AWS Security Finding Format (ASFF) Scan` - AWS Security Finding Format (ASFF)\n* `AWS Security Hub Scan` - AWS Security Hub Scan\n* `Azure Security Center Recommendations Scan` - Azure Security Center Recommendations Scan\n* `Bandit Scan` - Bandit Scan\n* `Beagle Security - Connectors Import` - Beagle Security - Connectors Import\n* `Bearer CLI` - Bearer CLI\n* `BigID Scan` - BigID Scan\n* `Binwalk Scan` - Binwalk Scan\n* `BlackDuck API` - BlackDuck API\n* `Blackduck Binary Analysis` - Blackduck Binary Analysis\n* `Blackduck Component Risk` - Blackduck Component Risk\n* `Blackduck Hub Scan` - Blackduck Hub Scan\n* `bomber Scan` - bomber Scan\n* `Brakeman Scan` - Brakeman Scan\n* `Bright - Connectors Import` - Bright - Connectors Import\n* `Bugcrowd API Import` - Bugcrowd API Import\n* `BugCrowd Scan` - BugCrowd Scan\n* `Bundler-Audit Scan` - Bundler-Audit Scan\n* `Burp Dastardly Scan` - Burp Dastardly Scan\n* `Burp Enterprise Scan` - Burp Enterprise Scan (RENAMED to Burp Suite DAST Scan)\n* `Burp REST API` - Burp REST API\n* `Burp Scan` - Burp Scan\n* `Burp GraphQL API` - Burp Suite DAST GraphQL API\n* `Burp Suite DAST Scan` - Burp Suite DAST Scan\n* `Calico Cloud Image Assurance Scan` - Calico Cloud Image Assurance Scan\n* `capa Scan` - capa Scan\n* `CargoAudit Scan` - CargoAudit Scan\n* `cfn-lint Scan` - cfn-lint Scan\n* `cfn-nag Scan` - cfn-nag Scan\n* `CFRipper Scan` - CFRipper Scan\n* `Checkmarx CxFlow SAST` - Checkmarx CxFlow SAST\n* `Checkmarx One Scan` - Checkmarx One Scan\n* `Checkmarx OSA` - Checkmarx OSA\n* `Checkmarx Scan` - Checkmarx Scan\n* `Checkmarx Scan detailed` - Checkmarx Scan detailed\n* `Checkov Scan` - Checkov Scan\n* `Chef Inspect Log` - Chef Inspect Log\n* `chkrootkit Scan` - chkrootkit Scan\n* `Choctaw Hog Scan` - Choctaw Hog Scan\n* `Clair Scan` - Clair Scan\n* `ClamAV Scan` - ClamAV Scan\n* `Cloud Posture Scan` - Cloud Posture Scan\n* `Cloudflare Insights` - Cloudflare Insights\n* `CloudFormation Guard Scan` - CloudFormation Guard Scan\n* `Cloudsplaining Scan` - Cloudsplaining Scan\n* `Cloudsploit Scan` - Cloudsploit Scan\n* `Cobalt.io API Import` - Cobalt.io API Import\n* `Cobalt.io Scan` - Cobalt.io Scan\n* `Codacy - Connectors Import` - Codacy - Connectors Import\n* `Codechecker Report native` - Codechecker Report native\n* `CodeQL Scan` - CodeQL Scan\n* `Composer Audit Scan` - Composer Audit Scan\n* `Conftest Scan` - Conftest Scan\n* `Contrast Scan` - Contrast Scan\n* `Coverity API` - Coverity API\n* `Coverity Scan JSON Report` - Coverity Scan JSON Report\n* `Cppcheck Scan` - Cppcheck Scan\n* `Crashtest Security JSON File` - Crashtest Security JSON File\n* `Crashtest Security XML File` - Crashtest Security XML File\n* `CredScan Scan` - CredScan Scan\n* `CrowdStrike:Spotlight - Connectors Import` - CrowdStrike:Spotlight - Connectors Import\n* `Crunch42 Scan` - Crunch42 Scan\n* `CSAF Scan` - CSAF Scan\n* `cwe_checker Scan` - cwe_checker Scan\n* `CyberArk Certificate Manager Scan` - CyberArk Certificate Manager Scan\n* `Cyberwatch scan (Galeax)` - Cyberwatch scan (Galeax)\n* `CycloneDX Scan` - CycloneDX Scan\n* `Cycognito Scan` - Cycognito Scan\n* `Dalfox Scan` - Dalfox Scan\n* `Datadog Cloud Security` - Datadog Cloud Security\n* `DawnScanner Scan` - DawnScanner Scan\n* `debsecan Scan` - debsecan Scan\n* `Deepfence Threatmapper Report` - Deepfence Threatmapper Report\n* `DeepSource - Connectors Import` - DeepSource - Connectors Import\n* `Dependency Check Scan` - Dependency Check Scan\n* `Dependency Track Finding Packaging Format (FPF) Export` - Dependency Track Finding Packaging Format (FPF) Export\n* `Detect-secrets Scan` - Detect-secrets Scan\n* `Detectify Scan` - Detectify Scan\n* `DevSkim Scan` - DevSkim Scan\n* `Dirsearch Scan` - Dirsearch Scan\n* `DISA STIG Checklist` - DISA STIG Checklist\n* `docker-bench-security Scan` - docker-bench-security Scan\n* `dockerfile_lint Scan` - dockerfile_lint Scan\n* `Dockle Scan` - Dockle Scan\n* `Dodgy Scan` - Dodgy Scan\n* `Dotnet Vulnerable Packages Scan` - Dotnet Vulnerable Packages Scan\n* `Dragos Scan` - Dragos Scan\n* `DrHeader JSON Importer` - DrHeader JSON Importer\n* `DSOP Scan` - DSOP Scan\n* `Duroc Hog Scan` - Duroc Hog Scan\n* `Edgescan Scan` - Edgescan Scan\n* `Elastic Security:CNVM - Connectors Import` - Elastic Security:CNVM - Connectors Import\n* `Elastic Security:Detections - Connectors Import` - Elastic Security:Detections - Connectors Import\n* `Elastic Security:Posture - Connectors Import` - Elastic Security:Posture - Connectors Import\n* `Endor Labs - Connectors Import` - Endor Labs - Connectors Import\n* `Escape - Connectors Import` - Escape - Connectors Import\n* `ESLint Scan` - ESLint Scan\n* `Essex Hog Scan` - Essex Hog Scan\n* `Fairwinds Insights - Connectors Import` - Fairwinds Insights - Connectors Import\n* `Falco Scan` - Falco Scan\n* `ffuf Scan` - ffuf Scan\n* `Fickling Scan` - Fickling Scan\n* `Finite State - Connectors Import` - Finite State - Connectors Import\n* `Firmwalker Scan` - Firmwalker Scan\n* `Flawfinder Scan` - Flawfinder Scan\n* `Fleet:Policies - Connectors Import` - Fleet:Policies - Connectors Import\n* `Fleet:Vulnerabilities - Connectors Import` - Fleet:Vulnerabilities - Connectors Import\n* `Fortify Scan` - Fortify Scan\n* `Fortify Scan v2` - Fortify Scan v2\n* `FOSSA - Connectors Import` - FOSSA - Connectors Import\n* `Garak Scan` - Garak Scan\n* `Generic Findings Import` - Generic Findings Import\n* `Ggshield Scan` - Ggshield Scan\n* `GitGuardian - Connectors Import` - GitGuardian - Connectors Import\n* `Github SAST Scan` - Github SAST Scan\n* `Github Secrets Detection Report Scan` - Github Secrets Detection Report Scan\n* `Github Vulnerability Scan` - Github Vulnerability Scan\n* `GitLab API Fuzzing Report Scan` - GitLab API Fuzzing Report Scan\n* `GitLab Container Scan` - GitLab Container Scan Scan\n* `GitLab DAST Report` - GitLab DAST Report\n* `GitLab Dependency Scanning Report` - GitLab Dependency Scanning Report\n* `GitLab SAST Report` - GitLab SAST Report\n* `GitLab Secret Detection Report` - GitLab Secret Detection Report\n* `Gitleaks Scan` - Gitleaks Scan\n* `Gixy Scan` - Gixy Scan\n* `Gobuster Scan` - Gobuster Scan\n* `Google Cloud Artifact Vulnerability Scan` - Google Cloud Artifact Vulnerability Scan\n* `Google Cloud SCC - Connectors Import` - Google Cloud SCC - Connectors Import\n* `Gosec Scanner` - Gosec Scanner\n* `Gottingen Hog Scan` - Gottingen Hog Scan\n* `Govulncheck Scanner` - Govulncheck Scanner\n* `Govulncheck Scanner V2` - Govulncheck Scanner V2\n* `Grant Scan` - Grant Scan\n* `Group-IB ASM - Connectors Import` - Group-IB ASM - Connectors Import\n* `GuardDog Scan` - GuardDog Scan\n* `HackerOne - Connectors Import` - HackerOne - Connectors Import\n* `HackerOne Cases` - HackerOne Cases\n* `Hadolint Dockerfile check` - Hadolint Dockerfile check\n* `Halo Security - Connectors Import` - Halo Security - Connectors Import\n* `Harbor Vulnerability Scan` - Harbor Vulnerability Scan\n* `HCL AppScan on Cloud SAST XML` - HCL AppScan on Cloud SAST XML\n* `HCLAppScan XML` - HCLAppScan XML\n* `HiddenLayer Model Scan` - HiddenLayer Model Scan\n* `Holm Security Scan` - Holm Security Scan\n* `Horusec Scan` - Horusec Scan\n* `httpx Scan` - httpx Scan\n* `Humble Json Importer` - Humble Json Importer\n* `HuskyCI Report` - HuskyCI Report\n* `Hydra Scan` - Hydra Scan\n* `IBM AppScan DAST` - IBM AppScan DAST\n* `Immuniweb Scan` - Immuniweb Scan\n* `Infer Scan` - Infer Scan\n* `Intigriti - Connectors Import` - Intigriti - Connectors Import\n* `Intruder API Import` - Intruder API Import\n* `IntSights Report` - IntSights Report\n* `Invicti Scan` - Invicti Scan\n* `IriusRisk Threats Scan` - IriusRisk Threats Scan\n* `JFrog Xray API Summary Artifact Scan` - JFrog Xray API Summary Artifact Scan\n* `JFrog Xray On Demand Binary Scan` - JFrog Xray On Demand Binary Scan\n* `JFrog Xray Scan` - JFrog Xray Scan\n* `JFrog Xray Unified Scan` - JFrog Xray Unified Scan\n* `KICS Scan` - KICS Scan\n* `Kingfisher Scan` - Kingfisher Scan\n* `Kiuwan SCA Scan` - Kiuwan SCA Scan\n* `Kiuwan Scan` - Kiuwan Scan\n* `Klocwork Scan` - Klocwork Scan\n* `KrakenD Audit Scan` - KrakenD Audit Scan\n* `kube-bench Scan` - kube-bench Scan\n* `kube-score Scan` - kube-score Scan\n* `Kubeaudit Scan` - Kubeaudit Scan\n* `KubeEye Scan` - KubeEye Scan\n* `KubeHunter Scan` - KubeHunter Scan\n* `KubeLinter Scan` - KubeLinter Scan\n* `kubent Scan` - kubent Scan\n* `Kubescape JSON Importer` - Kubescape JSON Importer\n* `kubesec Scan` - kubesec Scan\n* `Kyverno Scan` - Kyverno Scan\n* `Lacework - Connectors Import` - Lacework - Connectors Import\n* `Legitify Scan` - Legitify Scan\n* `Licensecheck Scan` - Licensecheck Scan\n* `Lynis Scan` - Lynis Scan\n* `ManageEngine Vulnerability Manager Plus Scan` - ManageEngine Vulnerability Manager Plus Scan\n* `Masscan Scan` - Masscan Scan\n* `Mayhem SARIF Report` - Mayhem SARIF Report\n* `Mend Scan` - Mend Scan\n* `Meterian Scan` - Meterian Scan\n* `Microfocus Webinspect Scan` - Microfocus Webinspect Scan\n* `Microsoft Defender for Cloud - Connectors Import` - Microsoft Defender for Cloud - Connectors Import\n* `Mix Audit Scan` - Mix Audit Scan\n* `MobSF Scan` - MobSF Scan\n* `Mobsfscan Scan` - MobSF Scan\n* `MobSF Scorecard Scan` - MobSF Scorecard Scan\n* `ModelScan Scan` - ModelScan Scan\n* `Mozilla Observatory Scan` - Mozilla Observatory Scan\n* `MSDefender Parser` - MSDefender Parser\n* `n0s1 Scanner` - n0s1 Scanner\n* `Naabu Scan` - Naabu Scan\n* `Nancy Scan` - Nancy Scan\n* `NetRise Scan` - NetRise Scan\n* `Netsparker Scan` - Netsparker Scan\n* `Nettacker Scan` - Nettacker Scan\n* `NeuVector (compliance)` - NeuVector (compliance)\n* `NeuVector (REST)` - NeuVector (REST)\n* `Nexpose Scan` - Nexpose Scan\n* `Nightfall AI - Connectors Import` - Nightfall AI - Connectors Import\n* `Nikto Scan` - Nikto Scan\n* `njsscan Scan` - njsscan Scan\n* `Nmap Scan` - Nmap Scan\n* `Node Security Platform Scan` - Node Security Platform Scan\n* `Noir Scan` - Noir Scan\n* `Nosey Parker Scan` - Nosey Parker Scan\n* `NowSecure` - NowSecure\n* `Nozomi Vantage Scan` - Nozomi Vantage Scan\n* `NPM Audit Scan` - NPM Audit Scan\n* `NPM Audit v7+ Scan` - NPM Audit v7+ Scan\n* `Nuclei Scan` - Nuclei Scan\n* `OpenReports` - OpenReports\n* `Openscap Vulnerability Scan` - Openscap Vulnerability Scan\n* `OpenSSF Scorecard` - OpenSSF Scorecard\n* `OpenVAS Parser` - OpenVAS Parser\n* `OpenVAS Parser v2` - OpenVAS Parser v2\n* `OpenVEX Scan` - OpenVEX Scan\n* `OPF Scan` - OPF Scan\n* `Orca Security Alerts` - Orca Security Alerts\n* `ORT evaluated model Importer` - ORT evaluated model Importer\n* `OssIndex Devaudit SCA Scan Importer` - OssIndex Devaudit SCA Scan Importer\n* `Ostorlab Scan` - Ostorlab Scan\n* `OSV Scan` - OSV Scan\n* `Outpost24 Scan` - Outpost24 Scan\n* `Parasoft DTP Scan` - Parasoft DTP Scan\n* `PHP Security Audit v2` - PHP Security Audit v2\n* `PHP Symfony Security Check` - PHP Symfony Security Check\n* `PHPStan Scan` - PHPStan Scan\n* `PICUS Scan` - PICUS Scan\n* `PingCastle` - PingCastle\n* `pip-audit Scan` - pip-audit Scan\n* `pip-licenses Scan` - pip-licenses Scan\n* `Pluto Scan` - Pluto Scan\n* `PMapper Scan` - PMapper Scan\n* `PMD Scan` - PMD Scan\n* `pnpm Audit Scan` - pnpm Audit Scan\n* `Polaris Scan` - Polaris Scan\n* `Popeye Scan` - Popeye Scan\n* `Probely API Import` - Probely API Import\n* `Progpilot Scan` - Progpilot Scan\n* `Promptfoo Scan` - Promptfoo Scan\n* `Prospector Scan` - Prospector Scan\n* `Prowler Scan` - Prowler Scan\n* `Psalm Scan` - Psalm Scan\n* `PTART Report` - PTART Report\n* `PWN SAST` - PWN SAST\n* `PyRIT Scan` - PyRIT Scan\n* `Python Taint Scan` - Python Taint Scan\n* `QARK Scan` - QARK Scan\n* `Qualys Hacker Guardian Scan` - Qualys Hacker Guardian Scan\n* `Qualys Infrastructure Scan (WebGUI XML)` - Qualys Infrastructure Scan (WebGUI XML)\n* `Qualys Scan` - Qualys Scan\n* `Qualys VMDR` - Qualys VMDR\n* `Qualys Webapp Scan` - Qualys Webapp Scan\n* `Quark-Engine Scan` - Quark-Engine Scan\n* `Quay - Connectors Import` - Quay - Connectors Import\n* `Qwiet Scan` - Qwiet Scan\n* `Rapid7 InsightAppSec - Connectors Import` - Rapid7 InsightAppSec - Connectors Import\n* `Rapplex Scan` - Rapplex Scan\n* `Red Hat Satellite` - Red Hat Satellite\n* `Regula Scan` - Regula Scan\n* `Retire.js Scan` - Retire.js Scan\n* `ReversingLabs Spectra Assure` - ReversingLabs Spectra Assure\n* `Risk Recon API Importer` - Risk Recon API Importer\n* `rkhunter Scan` - rkhunter Scan\n* `Rubocop Scan` - Rubocop Scan\n* `Ruff Scan` - Ruff Scan\n* `Rusty Hog Scan` - Rusty Hog Scan\n* `Safety Scan` - Safety Scan\n* `SARIF` - SARIF\n* `sbomqs Scan` - sbomqs Scan\n* `Scantist Scan` - Scantist Scan\n* `Scout Suite Scan` - Scout Suite Scan\n* `ScubaGear Report Scan` - ScubaGear Report Scan\n* `ScubaGear Scan` - ScubaGear Scan\n* `ScubaGoggles Action Plan` - ScubaGoggles Action Plan\n* `ScubaGoggles Scan` - ScubaGoggles Scan\n* `Seal Security Scan` - Seal Security Scan\n* `Secretlint Scan` - Secretlint Scan\n* `Semgrep JSON Report` - Semgrep JSON Report\n* `Semgrep Pro JSON Report` - Semgrep Pro JSON Report\n* `ShellCheck Scan` - ShellCheck Scan\n* `SKF Scan` - SKF Scan\n* `Slither Scan` - Slither Scan\n* `Snyk Code Scan` - Snyk Code Scan\n* `Snyk Issue API Scan` - Snyk Issue API Scan\n* `Snyk Scan` - Snyk Scan\n* `Socket - Connectors Import` - Socket - Connectors Import\n* `Solar Appscreener Scan` - Solar Appscreener Scan Detailed_Results.csv\n* `SonarQube API Import` - SonarQube API Import\n* `SonarQube Scan` - SonarQube Scan\n* `SonarQube Scan detailed` - SonarQube Scan detailed\n* `Sonatype Application Scan` - Sonatype Application Scan\n* `SOOS - Connectors Import` - SOOS - Connectors Import\n* `SPDX Scan` - SPDX Scan\n* `SpotBugs Scan` - SpotBugs Scan\n* `Sqlmap Scan` - Sqlmap Scan\n* `SSH Audit Importer` - SSH Audit Importer\n* `SSL Labs Scan` - SSL Labs Scan\n* `Sslscan` - Sslscan\n* `Sslyze Scan` - Sslyze Scan\n* `SSLyze Scan (JSON)` - SSLyze Scan (JSON)\n* `StackHawk HawkScan` - StackHawk HawkScan\n* `Staticcheck Scan` - Staticcheck Scan\n* `Syft SBOM` - Syft SBOM\n* `Sysdig CLI Report` - Sysdig CLI Report Scan\n* `Sysdig Vulnerability Report` - Sysdig Vulnerability Report Scan\n* `Talisman Scan` - Talisman Scan\n* `Tartufo Scan` - Tartufo Scan\n* `Tenable Scan` - Tenable Scan\n* `terraform-compliance Scan` - terraform-compliance Scan\n* `Terrascan Scan` - Terrascan Scan\n* `Testssl Scan` - Testssl Scan\n* `TFLint Scan` - TFLint Scan\n* `TFSec Scan` - TFSec Scan\n* `Threagile risks report` - Threagile risks report\n* `Threat Dragon Scan` - Threat Dragon Scan\n* `ThreatComposer Scan` - ThreatComposer Scan\n* `Tracee Scan` - Tracee Scan\n* `Trivy Operator Scan` - Trivy Operator Scan\n* `Trivy Scan` - Trivy Scan\n* `Trufflehog Scan` - Trufflehog Scan\n* `Trufflehog3 Scan` - Trufflehog3 Scan\n* `Trustwave Fusion API Scan` - Trustwave Fusion API Scan\n* `Trustwave Scan (CSV)` - Trustwave Scan (CSV)\n* `Twistlock Image Scan` - Twistlock Image Scan\n* `Universal Parser - Custom_CSV_Parser_manual_findings_Import` - Universal Parser - Custom_CSV_Parser_manual_findings_Import\n* `Uptycs Scan` - Uptycs Scan\n* `uv audit Scan` - uv audit Scan\n* `Vanta Compliance` - Vanta Compliance\n* `VCG Scan` - VCG Scan\n* `Veracode Scan` - Veracode Scan\n* `Veracode SourceClear Scan` - Veracode SourceClear Scan\n* `Vulners` - Vulners\n* `Vuls Scan` - Vuls Scan\n* `Wallarm API Security` - Wallarm API Security\n* `Wapiti Scan` - Wapiti Scan\n* `Wazuh` - Wazuh\n* `WFuzz JSON report` - WFuzz JSON report\n* `WhatWeb Scan` - WhatWeb Scan\n* `Whispers Scan` - Whispers Scan\n* `WhiteHat Sentinel` - WhiteHat Sentinel\n* `Wiz Scan` - Wiz Scan\n* `Wizcli Dir Scan` - Wizcli Dir Scan\n* `Wizcli IaC Scan` - Wizcli IaC Scan\n* `Wizcli Img Scan` - Wizcli Img Scan\n* `Wpscan` - Wpscan\n* `Xanitizer Scan` - Xanitizer Scan\n* `Xeol Parser` - Xeol Parser\n* `Xygeni SAST Scan` - Xygeni SAST Scan\n* `Xygeni SCA Scan` - Xygeni SCA Scan\n* `Xygeni Secrets Scan` - Xygeni Secrets Scan\n* `YARA Scan` - YARA Scan\n* `Yarn Audit Scan` - Yarn Audit Scan\n* `YesWeHack - Connectors Import` - YesWeHack - Connectors Import\n* `ZAP Scan` - ZAP Scan\n* `Zimperium zScan` - Zimperium zScan\n* `Zora Parser` - Zora Parser","x-spec-enum-id":"4fb3bf5945e5491f"},"engagement":{"type":"integer"},"tags":{"type":"array","items":{"type":"string","minLength":1},"description":"Add tags that help describe this scan."},"close_old_findings":{"type":"boolean","default":false,"description":"Old findings no longer present in the new report get closed as mitigated when importing. If service has been set, only the findings for this service will be closed; if no service is set, only findings without a service will be closed. This only affects findings within the same engagement."},"close_old_findings_product_scope":{"type":"boolean","default":false,"description":"Old findings no longer present in the new report get closed as mitigated when importing. If service has been set, only the findings for this service will be closed; if no service is set, only findings without a service will be closed. This only affects findings within the same product.By default, it is false meaning that only old findings of the same type in the engagement are in scope."},"version":{"type":"string","minLength":1,"description":"Version that was scanned."},"background_import":{"type":"boolean","nullable":true,"description":"Selecting to import in the background will modify the import process to first parse the file for any errors, return the response, and then create findings in the background. When this is true the findings do not exist yet at the moment the response is produced, so the response deliberately carries no 'statistics' and no 'deduplication_complete' key — they are absent rather than zeroed, because zeros would misreport a scan that has not been processed. Use 'status' and 'findings_parsed' instead, then poll GET /api/v2/tests/{test_id}/ and read its 'status' and 'processing' fields until 'status' is 'Processed' or 'Failed'."},"pci_role":{"enum":["none","internal_vulnerability_scan","external_asv_scan","web_application_assessment","penetration_test","segmentation_test",null],"type":"string","x-spec-enum-id":"df388145a7e568b9","nullable":true,"description":"PCI DSS Requirement 11 role to record for the test this scan lands in, overriding the test type's default role.\n\n* `none` - Not a PCI test\n* `internal_vulnerability_scan` - Internal vulnerability scan\n* `external_asv_scan` - External ASV scan\n* `web_application_assessment` - Web application assessment\n* `penetration_test` - Penetration test\n* `segmentation_test` - Segmentation test"},"authenticated":{"enum":["unknown","yes","no",null],"type":"string","x-spec-enum-id":"d1c998de7a29cb98","nullable":true,"description":"Whether this scan ran with credentials (PCI DSS Requirement 11.3.1.2).\n\n* `unknown` - Unknown\n* `yes` - Authenticated\n* `no` - Not authenticated"},"asv_result":{"enum":["not_applicable","pass","fail",null],"type":"string","x-spec-enum-id":"2622389e4dfa2e13","nullable":true,"description":"The result the Approved Scanning Vendor reported for this scan, as recorded by the entity. DefectDojo records what you report; it does not validate an ASV attestation.\n\n* `not_applicable` - Not applicable\n* `pass` - Passing\n* `fail` - Failing"},"asv_vendor":{"type":"string","description":"The Approved Scanning Vendor that ran this scan."},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."}},"required":["scan_type"]},"AsyncReImportScan":{"type":"object","properties":{"scan_date":{"type":"string","format":"date","description":"Scan completion date will be used on all findings."},"minimum_severity":{"enum":["Info","Low","Medium","High","Critical"],"type":"string","x-spec-enum-id":"fc5d16a20ed06136","default":"Info","description":"Minimum severity level to be imported\n\n* `Info` - Info\n* `Low` - Low\n* `Medium` - Medium\n* `High` - High\n* `Critical` - Critical"},"active":{"type":"boolean","description":"Force findings to be active/inactive or default to the original tool (None)"},"verified":{"type":"boolean","description":"Force findings to be verified/not verified or default to the original tool (None)"},"endpoint_to_add":{"type":"integer","description":"Enter the ID of a Location that is associated with the target Product. New Findings will be added to that Location."},"file":{"type":"string","format":"uri","nullable":true,"pattern":"(?:xml|csv|nessus|json|jsonl|html|js|zip|xlsx|txt|sarif|fpr|md|log|fvdl|spdx|ckl|cklb)$"},"product_type_name":{"type":"string","description":"Also referred to as 'Organization' name."},"product_name":{"type":"string","description":"Also referred to as 'Asset' name."},"engagement_name":{"type":"string"},"engagement_end_date":{"type":"string","format":"date","description":"End Date for Engagement. Default is current time + 365 days. Required format year-month-day"},"source_code_management_uri":{"type":"string","format":"uri","description":"Resource link to source code","maxLength":600},"test_title":{"type":"string"},"auto_create_context":{"type":"boolean"},"deduplication_on_engagement":{"type":"boolean"},"lead":{"type":"integer","nullable":true},"push_to_jira":{"type":"boolean","default":false},"deduplication_execution_mode":{"enum":["async","async_wait","sync",null],"type":"string","x-spec-enum-id":"bf7fb8ff28520a46","nullable":true,"description":"Override how import post-processing (deduplication, jira push, grading, ...) is executed for this request. 'async' dispatches post-processing to the background and responds immediately (default). 'async_wait' dispatches to the background but waits for deduplication to finish before responding, so notifications and the returned statistics reflect the deduplicated state. 'sync' runs everything inline. If omitted, falls back to the user's profile setting (deduplication_execution_mode).\n\n* `async` - Async (do not wait)\n* `async_wait` - Async, wait for deduplication\n* `sync` - Synchronous (block)"},"environment":{"type":"string"},"build_id":{"type":"string","description":"ID of the build that was scanned."},"branch_tag":{"type":"string","description":"Branch or Tag that was scanned."},"commit_hash":{"type":"string","description":"Commit that was scanned."},"api_scan_configuration":{"type":"integer","nullable":true},"service":{"type":"string","description":"A service is a self-contained piece of functionality within a Product. This is an optional field which is used in deduplication and closing of old findings when set. This affects the whole engagement/product depending on your deduplication scope."},"group_by":{"enum":["component_name","component_name+component_version","file_path","finding_title","vuln_id_from_tool"],"type":"string","x-spec-enum-id":"a9b19a914dcfbd21","description":"Choose an option to automatically group new findings by the chosen option.\n\n* `component_name` - Component Name\n* `component_name+component_version` - Component Name + Version\n* `file_path` - File path\n* `finding_title` - Finding Title\n* `vuln_id_from_tool` - Vulnerability ID from Tool"},"create_finding_groups_for_all_findings":{"type":"boolean","default":true,"description":"If set to false, finding groups will only be created when there is more than one grouped finding"},"test_id":{"type":"integer","readOnly":true},"engagement_id":{"type":"integer","readOnly":true},"product_id":{"type":"integer","readOnly":true,"description":"Also referred to as 'Asset' ID."},"product_type_id":{"type":"integer","readOnly":true,"description":"Also referred to as 'Organization' ID."},"statistics":{"allOf":[{"$ref":"#/components/schemas/ImportStatistics"}],"readOnly":true},"deduplication_complete":{"type":"boolean","readOnly":true,"description":"Whether deduplication had finished by the time this response was produced. True for 'sync' and for 'async_wait' when deduplication completed within the timeout; False for 'async' (deduplication is still running in the background) or when an 'async_wait' import timed out waiting for it."},"pro":{"type":"array","items":{},"readOnly":true},"apply_tags_to_findings":{"type":"boolean","description":"If set to True, the tags will be applied to the findings"},"apply_tags_to_endpoints":{"type":"boolean","description":"If set to True, the tags will be applied to the locations"},"do_not_reactivate":{"type":"boolean","default":false,"description":"Keep closed findings closed when they appear in the report again, instead of reactivating them. New findings are still created, and open findings are processed as usual."},"scan_type":{"enum":["2ms Scan","42Crunch - Connectors Import","AccuKnox - Connectors Import","Action1 Scan","Acunetix Scan","AI Agent Red Team","AIDE Scan","Akto Scan","Alert Logic Scan","Anchore Engine Scan","Anchore Enterprise Policy Check","Anchore Grype","Anchore Grype detailed","AnchoreCTL Policies Report","AnchoreCTL Vuln Report","Ansible Lint Scan","APKLeaks Scan","AppCheck Web Application Scanner","AppSpider Scan","Aqua Scan","Arachni Scan","AuditJS Scan","Automox Scan","AWS Inspector2 Scan","AWS Prowler Scan","AWS Prowler V3","AWS Security Finding Format (ASFF) Scan","AWS Security Hub Scan","Azure Security Center Recommendations Scan","Bandit Scan","Beagle Security - Connectors Import","Bearer CLI","BigID Scan","Binwalk Scan","BlackDuck API","Blackduck Binary Analysis","Blackduck Component Risk","Blackduck Hub Scan","bomber Scan","Brakeman Scan","Bright - Connectors Import","Bugcrowd API Import","BugCrowd Scan","Bundler-Audit Scan","Burp Dastardly Scan","Burp Enterprise Scan","Burp REST API","Burp Scan","Burp GraphQL API","Burp Suite DAST Scan","Calico Cloud Image Assurance Scan","capa Scan","CargoAudit Scan","cfn-lint Scan","cfn-nag Scan","CFRipper Scan","Checkmarx CxFlow SAST","Checkmarx One Scan","Checkmarx OSA","Checkmarx Scan","Checkmarx Scan detailed","Checkov Scan","Chef Inspect Log","chkrootkit Scan","Choctaw Hog Scan","Clair Scan","ClamAV Scan","Cloud Posture Scan","Cloudflare Insights","CloudFormation Guard Scan","Cloudsplaining Scan","Cloudsploit Scan","Cobalt.io API Import","Cobalt.io Scan","Codacy - Connectors Import","Codechecker Report native","CodeQL Scan","Composer Audit Scan","Conftest Scan","Contrast Scan","Coverity API","Coverity Scan JSON Report","Cppcheck Scan","Crashtest Security JSON File","Crashtest Security XML File","CredScan Scan","CrowdStrike:Spotlight - Connectors Import","Crunch42 Scan","CSAF Scan","cwe_checker Scan","CyberArk Certificate Manager Scan","Cyberwatch scan (Galeax)","CycloneDX Scan","Cycognito Scan","Dalfox Scan","Datadog Cloud Security","DawnScanner Scan","debsecan Scan","Deepfence Threatmapper Report","DeepSource - Connectors Import","Dependency Check Scan","Dependency Track Finding Packaging Format (FPF) Export","Detect-secrets Scan","Detectify Scan","DevSkim Scan","Dirsearch Scan","DISA STIG Checklist","docker-bench-security Scan","dockerfile_lint Scan","Dockle Scan","Dodgy Scan","Dotnet Vulnerable Packages Scan","Dragos Scan","DrHeader JSON Importer","DSOP Scan","Duroc Hog Scan","Edgescan Scan","Elastic Security:CNVM - Connectors Import","Elastic Security:Detections - Connectors Import","Elastic Security:Posture - Connectors Import","Endor Labs - Connectors Import","Escape - Connectors Import","ESLint Scan","Essex Hog Scan","Fairwinds Insights - Connectors Import","Falco Scan","ffuf Scan","Fickling Scan","Finite State - Connectors Import","Firmwalker Scan","Flawfinder Scan","Fleet:Policies - Connectors Import","Fleet:Vulnerabilities - Connectors Import","Fortify Scan","Fortify Scan v2","FOSSA - Connectors Import","Garak Scan","Generic Findings Import","Ggshield Scan","GitGuardian - Connectors Import","Github SAST Scan","Github Secrets Detection Report Scan","Github Vulnerability Scan","GitLab API Fuzzing Report Scan","GitLab Container Scan","GitLab DAST Report","GitLab Dependency Scanning Report","GitLab SAST Report","GitLab Secret Detection Report","Gitleaks Scan","Gixy Scan","Gobuster Scan","Google Cloud Artifact Vulnerability Scan","Google Cloud SCC - Connectors Import","Gosec Scanner","Gottingen Hog Scan","Govulncheck Scanner","Govulncheck Scanner V2","Grant Scan","Group-IB ASM - Connectors Import","GuardDog Scan","HackerOne - Connectors Import","HackerOne Cases","Hadolint Dockerfile check","Halo Security - Connectors Import","Harbor Vulnerability Scan","HCL AppScan on Cloud SAST XML","HCLAppScan XML","HiddenLayer Model Scan","Holm Security Scan","Horusec Scan","httpx Scan","Humble Json Importer","HuskyCI Report","Hydra Scan","IBM AppScan DAST","Immuniweb Scan","Infer Scan","Intigriti - Connectors Import","Intruder API Import","IntSights Report","Invicti Scan","IriusRisk Threats Scan","JFrog Xray API Summary Artifact Scan","JFrog Xray On Demand Binary Scan","JFrog Xray Scan","JFrog Xray Unified Scan","KICS Scan","Kingfisher Scan","Kiuwan SCA Scan","Kiuwan Scan","Klocwork Scan","KrakenD Audit Scan","kube-bench Scan","kube-score Scan","Kubeaudit Scan","KubeEye Scan","KubeHunter Scan","KubeLinter Scan","kubent Scan","Kubescape JSON Importer","kubesec Scan","Kyverno Scan","Lacework - Connectors Import","Legitify Scan","Licensecheck Scan","Lynis Scan","ManageEngine Vulnerability Manager Plus Scan","Masscan Scan","Mayhem SARIF Report","Mend Scan","Meterian Scan","Microfocus Webinspect Scan","Microsoft Defender for Cloud - Connectors Import","Mix Audit Scan","MobSF Scan","Mobsfscan Scan","MobSF Scorecard Scan","ModelScan Scan","Mozilla Observatory Scan","MSDefender Parser","n0s1 Scanner","Naabu Scan","Nancy Scan","NetRise Scan","Netsparker Scan","Nettacker Scan","NeuVector (compliance)","NeuVector (REST)","Nexpose Scan","Nightfall AI - Connectors Import","Nikto Scan","njsscan Scan","Nmap Scan","Node Security Platform Scan","Noir Scan","Nosey Parker Scan","NowSecure","Nozomi Vantage Scan","NPM Audit Scan","NPM Audit v7+ Scan","Nuclei Scan","OpenReports","Openscap Vulnerability Scan","OpenSSF Scorecard","OpenVAS Parser","OpenVAS Parser v2","OpenVEX Scan","OPF Scan","Orca Security Alerts","ORT evaluated model Importer","OssIndex Devaudit SCA Scan Importer","Ostorlab Scan","OSV Scan","Outpost24 Scan","Parasoft DTP Scan","PHP Security Audit v2","PHP Symfony Security Check","PHPStan Scan","PICUS Scan","PingCastle","pip-audit Scan","pip-licenses Scan","Pluto Scan","PMapper Scan","PMD Scan","pnpm Audit Scan","Polaris Scan","Popeye Scan","Probely API Import","Progpilot Scan","Promptfoo Scan","Prospector Scan","Prowler Scan","Psalm Scan","PTART Report","PWN SAST","PyRIT Scan","Python Taint Scan","QARK Scan","Qualys Hacker Guardian Scan","Qualys Infrastructure Scan (WebGUI XML)","Qualys Scan","Qualys VMDR","Qualys Webapp Scan","Quark-Engine Scan","Quay - Connectors Import","Qwiet Scan","Rapid7 InsightAppSec - Connectors Import","Rapplex Scan","Red Hat Satellite","Regula Scan","Retire.js Scan","ReversingLabs Spectra Assure","Risk Recon API Importer","rkhunter Scan","Rubocop Scan","Ruff Scan","Rusty Hog Scan","Safety Scan","SARIF","sbomqs Scan","Scantist Scan","Scout Suite Scan","ScubaGear Report Scan","ScubaGear Scan","ScubaGoggles Action Plan","ScubaGoggles Scan","Seal Security Scan","Secretlint Scan","Semgrep JSON Report","Semgrep Pro JSON Report","ShellCheck Scan","SKF Scan","Slither Scan","Snyk Code Scan","Snyk Issue API Scan","Snyk Scan","Socket - Connectors Import","Solar Appscreener Scan","SonarQube API Import","SonarQube Scan","SonarQube Scan detailed","Sonatype Application Scan","SOOS - Connectors Import","SPDX Scan","SpotBugs Scan","Sqlmap Scan","SSH Audit Importer","SSL Labs Scan","Sslscan","Sslyze Scan","SSLyze Scan (JSON)","StackHawk HawkScan","Staticcheck Scan","Syft SBOM","Sysdig CLI Report","Sysdig Vulnerability Report","Talisman Scan","Tartufo Scan","Tenable Scan","terraform-compliance Scan","Terrascan Scan","Testssl Scan","TFLint Scan","TFSec Scan","Threagile risks report","Threat Dragon Scan","ThreatComposer Scan","Tracee Scan","Trivy Operator Scan","Trivy Scan","Trufflehog Scan","Trufflehog3 Scan","Trustwave Fusion API Scan","Trustwave Scan (CSV)","Twistlock Image Scan","Universal Parser - Custom_CSV_Parser_manual_findings_Import","Uptycs Scan","uv audit Scan","Vanta Compliance","VCG Scan","Veracode Scan","Veracode SourceClear Scan","Vulners","Vuls Scan","Wallarm API Security","Wapiti Scan","Wazuh","WFuzz JSON report","WhatWeb Scan","Whispers Scan","WhiteHat Sentinel","Wiz Scan","Wizcli Dir Scan","Wizcli IaC Scan","Wizcli Img Scan","Wpscan","Xanitizer Scan","Xeol Parser","Xygeni SAST Scan","Xygeni SCA Scan","Xygeni Secrets Scan","YARA Scan","Yarn Audit Scan","YesWeHack - Connectors Import","ZAP Scan","Zimperium zScan","Zora Parser"],"type":"string","description":"* `2ms Scan` - 2ms Scan\n* `42Crunch - Connectors Import` - 42Crunch - Connectors Import\n* `AccuKnox - Connectors Import` - AccuKnox - Connectors Import\n* `Action1 Scan` - Action1 Scan\n* `Acunetix Scan` - Acunetix Scanner\n* `AI Agent Red Team` - AI Agent Red Team\n* `AIDE Scan` - AIDE Scan\n* `Akto Scan` - Akto Scan\n* `Alert Logic Scan` - Alert Logic Scan\n* `Anchore Engine Scan` - Anchore Engine Scan\n* `Anchore Enterprise Policy Check` - Anchore Enterprise Policy Check\n* `Anchore Grype` - Anchore Grype\n* `Anchore Grype detailed` - Anchore Grype detailed\n* `AnchoreCTL Policies Report` - AnchoreCTL Policies Report\n* `AnchoreCTL Vuln Report` - AnchoreCTL Vuln Report\n* `Ansible Lint Scan` - Ansible Lint Scan\n* `APKLeaks Scan` - APKLeaks Scan\n* `AppCheck Web Application Scanner` - AppCheck Web Application Scanner\n* `AppSpider Scan` - AppSpider Scan\n* `Aqua Scan` - Aqua Scan\n* `Arachni Scan` - Arachni Scan\n* `AuditJS Scan` - AuditJS Scan\n* `Automox Scan` - Automox Scan\n* `AWS Inspector2 Scan` - AWS Inspector2 Scan\n* `AWS Prowler Scan` - AWS Prowler Scan\n* `AWS Prowler V3` - AWS Prowler V3\n* `AWS Security Finding Format (ASFF) Scan` - AWS Security Finding Format (ASFF)\n* `AWS Security Hub Scan` - AWS Security Hub Scan\n* `Azure Security Center Recommendations Scan` - Azure Security Center Recommendations Scan\n* `Bandit Scan` - Bandit Scan\n* `Beagle Security - Connectors Import` - Beagle Security - Connectors Import\n* `Bearer CLI` - Bearer CLI\n* `BigID Scan` - BigID Scan\n* `Binwalk Scan` - Binwalk Scan\n* `BlackDuck API` - BlackDuck API\n* `Blackduck Binary Analysis` - Blackduck Binary Analysis\n* `Blackduck Component Risk` - Blackduck Component Risk\n* `Blackduck Hub Scan` - Blackduck Hub Scan\n* `bomber Scan` - bomber Scan\n* `Brakeman Scan` - Brakeman Scan\n* `Bright - Connectors Import` - Bright - Connectors Import\n* `Bugcrowd API Import` - Bugcrowd API Import\n* `BugCrowd Scan` - BugCrowd Scan\n* `Bundler-Audit Scan` - Bundler-Audit Scan\n* `Burp Dastardly Scan` - Burp Dastardly Scan\n* `Burp Enterprise Scan` - Burp Enterprise Scan (RENAMED to Burp Suite DAST Scan)\n* `Burp REST API` - Burp REST API\n* `Burp Scan` - Burp Scan\n* `Burp GraphQL API` - Burp Suite DAST GraphQL API\n* `Burp Suite DAST Scan` - Burp Suite DAST Scan\n* `Calico Cloud Image Assurance Scan` - Calico Cloud Image Assurance Scan\n* `capa Scan` - capa Scan\n* `CargoAudit Scan` - CargoAudit Scan\n* `cfn-lint Scan` - cfn-lint Scan\n* `cfn-nag Scan` - cfn-nag Scan\n* `CFRipper Scan` - CFRipper Scan\n* `Checkmarx CxFlow SAST` - Checkmarx CxFlow SAST\n* `Checkmarx One Scan` - Checkmarx One Scan\n* `Checkmarx OSA` - Checkmarx OSA\n* `Checkmarx Scan` - Checkmarx Scan\n* `Checkmarx Scan detailed` - Checkmarx Scan detailed\n* `Checkov Scan` - Checkov Scan\n* `Chef Inspect Log` - Chef Inspect Log\n* `chkrootkit Scan` - chkrootkit Scan\n* `Choctaw Hog Scan` - Choctaw Hog Scan\n* `Clair Scan` - Clair Scan\n* `ClamAV Scan` - ClamAV Scan\n* `Cloud Posture Scan` - Cloud Posture Scan\n* `Cloudflare Insights` - Cloudflare Insights\n* `CloudFormation Guard Scan` - CloudFormation Guard Scan\n* `Cloudsplaining Scan` - Cloudsplaining Scan\n* `Cloudsploit Scan` - Cloudsploit Scan\n* `Cobalt.io API Import` - Cobalt.io API Import\n* `Cobalt.io Scan` - Cobalt.io Scan\n* `Codacy - Connectors Import` - Codacy - Connectors Import\n* `Codechecker Report native` - Codechecker Report native\n* `CodeQL Scan` - CodeQL Scan\n* `Composer Audit Scan` - Composer Audit Scan\n* `Conftest Scan` - Conftest Scan\n* `Contrast Scan` - Contrast Scan\n* `Coverity API` - Coverity API\n* `Coverity Scan JSON Report` - Coverity Scan JSON Report\n* `Cppcheck Scan` - Cppcheck Scan\n* `Crashtest Security JSON File` - Crashtest Security JSON File\n* `Crashtest Security XML File` - Crashtest Security XML File\n* `CredScan Scan` - CredScan Scan\n* `CrowdStrike:Spotlight - Connectors Import` - CrowdStrike:Spotlight - Connectors Import\n* `Crunch42 Scan` - Crunch42 Scan\n* `CSAF Scan` - CSAF Scan\n* `cwe_checker Scan` - cwe_checker Scan\n* `CyberArk Certificate Manager Scan` - CyberArk Certificate Manager Scan\n* `Cyberwatch scan (Galeax)` - Cyberwatch scan (Galeax)\n* `CycloneDX Scan` - CycloneDX Scan\n* `Cycognito Scan` - Cycognito Scan\n* `Dalfox Scan` - Dalfox Scan\n* `Datadog Cloud Security` - Datadog Cloud Security\n* `DawnScanner Scan` - DawnScanner Scan\n* `debsecan Scan` - debsecan Scan\n* `Deepfence Threatmapper Report` - Deepfence Threatmapper Report\n* `DeepSource - Connectors Import` - DeepSource - Connectors Import\n* `Dependency Check Scan` - Dependency Check Scan\n* `Dependency Track Finding Packaging Format (FPF) Export` - Dependency Track Finding Packaging Format (FPF) Export\n* `Detect-secrets Scan` - Detect-secrets Scan\n* `Detectify Scan` - Detectify Scan\n* `DevSkim Scan` - DevSkim Scan\n* `Dirsearch Scan` - Dirsearch Scan\n* `DISA STIG Checklist` - DISA STIG Checklist\n* `docker-bench-security Scan` - docker-bench-security Scan\n* `dockerfile_lint Scan` - dockerfile_lint Scan\n* `Dockle Scan` - Dockle Scan\n* `Dodgy Scan` - Dodgy Scan\n* `Dotnet Vulnerable Packages Scan` - Dotnet Vulnerable Packages Scan\n* `Dragos Scan` - Dragos Scan\n* `DrHeader JSON Importer` - DrHeader JSON Importer\n* `DSOP Scan` - DSOP Scan\n* `Duroc Hog Scan` - Duroc Hog Scan\n* `Edgescan Scan` - Edgescan Scan\n* `Elastic Security:CNVM - Connectors Import` - Elastic Security:CNVM - Connectors Import\n* `Elastic Security:Detections - Connectors Import` - Elastic Security:Detections - Connectors Import\n* `Elastic Security:Posture - Connectors Import` - Elastic Security:Posture - Connectors Import\n* `Endor Labs - Connectors Import` - Endor Labs - Connectors Import\n* `Escape - Connectors Import` - Escape - Connectors Import\n* `ESLint Scan` - ESLint Scan\n* `Essex Hog Scan` - Essex Hog Scan\n* `Fairwinds Insights - Connectors Import` - Fairwinds Insights - Connectors Import\n* `Falco Scan` - Falco Scan\n* `ffuf Scan` - ffuf Scan\n* `Fickling Scan` - Fickling Scan\n* `Finite State - Connectors Import` - Finite State - Connectors Import\n* `Firmwalker Scan` - Firmwalker Scan\n* `Flawfinder Scan` - Flawfinder Scan\n* `Fleet:Policies - Connectors Import` - Fleet:Policies - Connectors Import\n* `Fleet:Vulnerabilities - Connectors Import` - Fleet:Vulnerabilities - Connectors Import\n* `Fortify Scan` - Fortify Scan\n* `Fortify Scan v2` - Fortify Scan v2\n* `FOSSA - Connectors Import` - FOSSA - Connectors Import\n* `Garak Scan` - Garak Scan\n* `Generic Findings Import` - Generic Findings Import\n* `Ggshield Scan` - Ggshield Scan\n* `GitGuardian - Connectors Import` - GitGuardian - Connectors Import\n* `Github SAST Scan` - Github SAST Scan\n* `Github Secrets Detection Report Scan` - Github Secrets Detection Report Scan\n* `Github Vulnerability Scan` - Github Vulnerability Scan\n* `GitLab API Fuzzing Report Scan` - GitLab API Fuzzing Report Scan\n* `GitLab Container Scan` - GitLab Container Scan Scan\n* `GitLab DAST Report` - GitLab DAST Report\n* `GitLab Dependency Scanning Report` - GitLab Dependency Scanning Report\n* `GitLab SAST Report` - GitLab SAST Report\n* `GitLab Secret Detection Report` - GitLab Secret Detection Report\n* `Gitleaks Scan` - Gitleaks Scan\n* `Gixy Scan` - Gixy Scan\n* `Gobuster Scan` - Gobuster Scan\n* `Google Cloud Artifact Vulnerability Scan` - Google Cloud Artifact Vulnerability Scan\n* `Google Cloud SCC - Connectors Import` - Google Cloud SCC - Connectors Import\n* `Gosec Scanner` - Gosec Scanner\n* `Gottingen Hog Scan` - Gottingen Hog Scan\n* `Govulncheck Scanner` - Govulncheck Scanner\n* `Govulncheck Scanner V2` - Govulncheck Scanner V2\n* `Grant Scan` - Grant Scan\n* `Group-IB ASM - Connectors Import` - Group-IB ASM - Connectors Import\n* `GuardDog Scan` - GuardDog Scan\n* `HackerOne - Connectors Import` - HackerOne - Connectors Import\n* `HackerOne Cases` - HackerOne Cases\n* `Hadolint Dockerfile check` - Hadolint Dockerfile check\n* `Halo Security - Connectors Import` - Halo Security - Connectors Import\n* `Harbor Vulnerability Scan` - Harbor Vulnerability Scan\n* `HCL AppScan on Cloud SAST XML` - HCL AppScan on Cloud SAST XML\n* `HCLAppScan XML` - HCLAppScan XML\n* `HiddenLayer Model Scan` - HiddenLayer Model Scan\n* `Holm Security Scan` - Holm Security Scan\n* `Horusec Scan` - Horusec Scan\n* `httpx Scan` - httpx Scan\n* `Humble Json Importer` - Humble Json Importer\n* `HuskyCI Report` - HuskyCI Report\n* `Hydra Scan` - Hydra Scan\n* `IBM AppScan DAST` - IBM AppScan DAST\n* `Immuniweb Scan` - Immuniweb Scan\n* `Infer Scan` - Infer Scan\n* `Intigriti - Connectors Import` - Intigriti - Connectors Import\n* `Intruder API Import` - Intruder API Import\n* `IntSights Report` - IntSights Report\n* `Invicti Scan` - Invicti Scan\n* `IriusRisk Threats Scan` - IriusRisk Threats Scan\n* `JFrog Xray API Summary Artifact Scan` - JFrog Xray API Summary Artifact Scan\n* `JFrog Xray On Demand Binary Scan` - JFrog Xray On Demand Binary Scan\n* `JFrog Xray Scan` - JFrog Xray Scan\n* `JFrog Xray Unified Scan` - JFrog Xray Unified Scan\n* `KICS Scan` - KICS Scan\n* `Kingfisher Scan` - Kingfisher Scan\n* `Kiuwan SCA Scan` - Kiuwan SCA Scan\n* `Kiuwan Scan` - Kiuwan Scan\n* `Klocwork Scan` - Klocwork Scan\n* `KrakenD Audit Scan` - KrakenD Audit Scan\n* `kube-bench Scan` - kube-bench Scan\n* `kube-score Scan` - kube-score Scan\n* `Kubeaudit Scan` - Kubeaudit Scan\n* `KubeEye Scan` - KubeEye Scan\n* `KubeHunter Scan` - KubeHunter Scan\n* `KubeLinter Scan` - KubeLinter Scan\n* `kubent Scan` - kubent Scan\n* `Kubescape JSON Importer` - Kubescape JSON Importer\n* `kubesec Scan` - kubesec Scan\n* `Kyverno Scan` - Kyverno Scan\n* `Lacework - Connectors Import` - Lacework - Connectors Import\n* `Legitify Scan` - Legitify Scan\n* `Licensecheck Scan` - Licensecheck Scan\n* `Lynis Scan` - Lynis Scan\n* `ManageEngine Vulnerability Manager Plus Scan` - ManageEngine Vulnerability Manager Plus Scan\n* `Masscan Scan` - Masscan Scan\n* `Mayhem SARIF Report` - Mayhem SARIF Report\n* `Mend Scan` - Mend Scan\n* `Meterian Scan` - Meterian Scan\n* `Microfocus Webinspect Scan` - Microfocus Webinspect Scan\n* `Microsoft Defender for Cloud - Connectors Import` - Microsoft Defender for Cloud - Connectors Import\n* `Mix Audit Scan` - Mix Audit Scan\n* `MobSF Scan` - MobSF Scan\n* `Mobsfscan Scan` - MobSF Scan\n* `MobSF Scorecard Scan` - MobSF Scorecard Scan\n* `ModelScan Scan` - ModelScan Scan\n* `Mozilla Observatory Scan` - Mozilla Observatory Scan\n* `MSDefender Parser` - MSDefender Parser\n* `n0s1 Scanner` - n0s1 Scanner\n* `Naabu Scan` - Naabu Scan\n* `Nancy Scan` - Nancy Scan\n* `NetRise Scan` - NetRise Scan\n* `Netsparker Scan` - Netsparker Scan\n* `Nettacker Scan` - Nettacker Scan\n* `NeuVector (compliance)` - NeuVector (compliance)\n* `NeuVector (REST)` - NeuVector (REST)\n* `Nexpose Scan` - Nexpose Scan\n* `Nightfall AI - Connectors Import` - Nightfall AI - Connectors Import\n* `Nikto Scan` - Nikto Scan\n* `njsscan Scan` - njsscan Scan\n* `Nmap Scan` - Nmap Scan\n* `Node Security Platform Scan` - Node Security Platform Scan\n* `Noir Scan` - Noir Scan\n* `Nosey Parker Scan` - Nosey Parker Scan\n* `NowSecure` - NowSecure\n* `Nozomi Vantage Scan` - Nozomi Vantage Scan\n* `NPM Audit Scan` - NPM Audit Scan\n* `NPM Audit v7+ Scan` - NPM Audit v7+ Scan\n* `Nuclei Scan` - Nuclei Scan\n* `OpenReports` - OpenReports\n* `Openscap Vulnerability Scan` - Openscap Vulnerability Scan\n* `OpenSSF Scorecard` - OpenSSF Scorecard\n* `OpenVAS Parser` - OpenVAS Parser\n* `OpenVAS Parser v2` - OpenVAS Parser v2\n* `OpenVEX Scan` - OpenVEX Scan\n* `OPF Scan` - OPF Scan\n* `Orca Security Alerts` - Orca Security Alerts\n* `ORT evaluated model Importer` - ORT evaluated model Importer\n* `OssIndex Devaudit SCA Scan Importer` - OssIndex Devaudit SCA Scan Importer\n* `Ostorlab Scan` - Ostorlab Scan\n* `OSV Scan` - OSV Scan\n* `Outpost24 Scan` - Outpost24 Scan\n* `Parasoft DTP Scan` - Parasoft DTP Scan\n* `PHP Security Audit v2` - PHP Security Audit v2\n* `PHP Symfony Security Check` - PHP Symfony Security Check\n* `PHPStan Scan` - PHPStan Scan\n* `PICUS Scan` - PICUS Scan\n* `PingCastle` - PingCastle\n* `pip-audit Scan` - pip-audit Scan\n* `pip-licenses Scan` - pip-licenses Scan\n* `Pluto Scan` - Pluto Scan\n* `PMapper Scan` - PMapper Scan\n* `PMD Scan` - PMD Scan\n* `pnpm Audit Scan` - pnpm Audit Scan\n* `Polaris Scan` - Polaris Scan\n* `Popeye Scan` - Popeye Scan\n* `Probely API Import` - Probely API Import\n* `Progpilot Scan` - Progpilot Scan\n* `Promptfoo Scan` - Promptfoo Scan\n* `Prospector Scan` - Prospector Scan\n* `Prowler Scan` - Prowler Scan\n* `Psalm Scan` - Psalm Scan\n* `PTART Report` - PTART Report\n* `PWN SAST` - PWN SAST\n* `PyRIT Scan` - PyRIT Scan\n* `Python Taint Scan` - Python Taint Scan\n* `QARK Scan` - QARK Scan\n* `Qualys Hacker Guardian Scan` - Qualys Hacker Guardian Scan\n* `Qualys Infrastructure Scan (WebGUI XML)` - Qualys Infrastructure Scan (WebGUI XML)\n* `Qualys Scan` - Qualys Scan\n* `Qualys VMDR` - Qualys VMDR\n* `Qualys Webapp Scan` - Qualys Webapp Scan\n* `Quark-Engine Scan` - Quark-Engine Scan\n* `Quay - Connectors Import` - Quay - Connectors Import\n* `Qwiet Scan` - Qwiet Scan\n* `Rapid7 InsightAppSec - Connectors Import` - Rapid7 InsightAppSec - Connectors Import\n* `Rapplex Scan` - Rapplex Scan\n* `Red Hat Satellite` - Red Hat Satellite\n* `Regula Scan` - Regula Scan\n* `Retire.js Scan` - Retire.js Scan\n* `ReversingLabs Spectra Assure` - ReversingLabs Spectra Assure\n* `Risk Recon API Importer` - Risk Recon API Importer\n* `rkhunter Scan` - rkhunter Scan\n* `Rubocop Scan` - Rubocop Scan\n* `Ruff Scan` - Ruff Scan\n* `Rusty Hog Scan` - Rusty Hog Scan\n* `Safety Scan` - Safety Scan\n* `SARIF` - SARIF\n* `sbomqs Scan` - sbomqs Scan\n* `Scantist Scan` - Scantist Scan\n* `Scout Suite Scan` - Scout Suite Scan\n* `ScubaGear Report Scan` - ScubaGear Report Scan\n* `ScubaGear Scan` - ScubaGear Scan\n* `ScubaGoggles Action Plan` - ScubaGoggles Action Plan\n* `ScubaGoggles Scan` - ScubaGoggles Scan\n* `Seal Security Scan` - Seal Security Scan\n* `Secretlint Scan` - Secretlint Scan\n* `Semgrep JSON Report` - Semgrep JSON Report\n* `Semgrep Pro JSON Report` - Semgrep Pro JSON Report\n* `ShellCheck Scan` - ShellCheck Scan\n* `SKF Scan` - SKF Scan\n* `Slither Scan` - Slither Scan\n* `Snyk Code Scan` - Snyk Code Scan\n* `Snyk Issue API Scan` - Snyk Issue API Scan\n* `Snyk Scan` - Snyk Scan\n* `Socket - Connectors Import` - Socket - Connectors Import\n* `Solar Appscreener Scan` - Solar Appscreener Scan Detailed_Results.csv\n* `SonarQube API Import` - SonarQube API Import\n* `SonarQube Scan` - SonarQube Scan\n* `SonarQube Scan detailed` - SonarQube Scan detailed\n* `Sonatype Application Scan` - Sonatype Application Scan\n* `SOOS - Connectors Import` - SOOS - Connectors Import\n* `SPDX Scan` - SPDX Scan\n* `SpotBugs Scan` - SpotBugs Scan\n* `Sqlmap Scan` - Sqlmap Scan\n* `SSH Audit Importer` - SSH Audit Importer\n* `SSL Labs Scan` - SSL Labs Scan\n* `Sslscan` - Sslscan\n* `Sslyze Scan` - Sslyze Scan\n* `SSLyze Scan (JSON)` - SSLyze Scan (JSON)\n* `StackHawk HawkScan` - StackHawk HawkScan\n* `Staticcheck Scan` - Staticcheck Scan\n* `Syft SBOM` - Syft SBOM\n* `Sysdig CLI Report` - Sysdig CLI Report Scan\n* `Sysdig Vulnerability Report` - Sysdig Vulnerability Report Scan\n* `Talisman Scan` - Talisman Scan\n* `Tartufo Scan` - Tartufo Scan\n* `Tenable Scan` - Tenable Scan\n* `terraform-compliance Scan` - terraform-compliance Scan\n* `Terrascan Scan` - Terrascan Scan\n* `Testssl Scan` - Testssl Scan\n* `TFLint Scan` - TFLint Scan\n* `TFSec Scan` - TFSec Scan\n* `Threagile risks report` - Threagile risks report\n* `Threat Dragon Scan` - Threat Dragon Scan\n* `ThreatComposer Scan` - ThreatComposer Scan\n* `Tracee Scan` - Tracee Scan\n* `Trivy Operator Scan` - Trivy Operator Scan\n* `Trivy Scan` - Trivy Scan\n* `Trufflehog Scan` - Trufflehog Scan\n* `Trufflehog3 Scan` - Trufflehog3 Scan\n* `Trustwave Fusion API Scan` - Trustwave Fusion API Scan\n* `Trustwave Scan (CSV)` - Trustwave Scan (CSV)\n* `Twistlock Image Scan` - Twistlock Image Scan\n* `Universal Parser - Custom_CSV_Parser_manual_findings_Import` - Universal Parser - Custom_CSV_Parser_manual_findings_Import\n* `Uptycs Scan` - Uptycs Scan\n* `uv audit Scan` - uv audit Scan\n* `Vanta Compliance` - Vanta Compliance\n* `VCG Scan` - VCG Scan\n* `Veracode Scan` - Veracode Scan\n* `Veracode SourceClear Scan` - Veracode SourceClear Scan\n* `Vulners` - Vulners\n* `Vuls Scan` - Vuls Scan\n* `Wallarm API Security` - Wallarm API Security\n* `Wapiti Scan` - Wapiti Scan\n* `Wazuh` - Wazuh\n* `WFuzz JSON report` - WFuzz JSON report\n* `WhatWeb Scan` - WhatWeb Scan\n* `Whispers Scan` - Whispers Scan\n* `WhiteHat Sentinel` - WhiteHat Sentinel\n* `Wiz Scan` - Wiz Scan\n* `Wizcli Dir Scan` - Wizcli Dir Scan\n* `Wizcli IaC Scan` - Wizcli IaC Scan\n* `Wizcli Img Scan` - Wizcli Img Scan\n* `Wpscan` - Wpscan\n* `Xanitizer Scan` - Xanitizer Scan\n* `Xeol Parser` - Xeol Parser\n* `Xygeni SAST Scan` - Xygeni SAST Scan\n* `Xygeni SCA Scan` - Xygeni SCA Scan\n* `Xygeni Secrets Scan` - Xygeni Secrets Scan\n* `YARA Scan` - YARA Scan\n* `Yarn Audit Scan` - Yarn Audit Scan\n* `YesWeHack - Connectors Import` - YesWeHack - Connectors Import\n* `ZAP Scan` - ZAP Scan\n* `Zimperium zScan` - Zimperium zScan\n* `Zora Parser` - Zora Parser","x-spec-enum-id":"4fb3bf5945e5491f"},"test":{"type":"integer"},"close_old_findings":{"type":"boolean","default":true,"description":"Old findings no longer present in the new report get closed as mitigated when importing. If service has been set, only the findings for this service will be closed; if no service is set, only findings without a service will be closed. This only affects findings within the same test."},"close_old_findings_product_scope":{"type":"boolean","default":false,"description":"This has no effect on reimport"},"version":{"type":"string","description":"Version that will be set on existing Test object. Leave empty to leave existing value in place."},"tags":{"type":"array","items":{"type":"string"},"description":"Modify existing tags that help describe this scan. (Existing test tags will be overwritten)"},"background_import":{"type":"boolean","nullable":true,"description":"Selecting to import in the background will modify the import process to first parse the file for any errors, return the response, and then create findings in the background. When this is true the findings do not exist yet at the moment the response is produced, so the response deliberately carries no 'statistics' and no 'deduplication_complete' key — they are absent rather than zeroed, because zeros would misreport a scan that has not been processed. Use 'status' and 'findings_parsed' instead, then poll GET /api/v2/tests/{test_id}/ and read its 'status' and 'processing' fields until 'status' is 'Processed' or 'Failed'."},"pci_role":{"enum":["none","internal_vulnerability_scan","external_asv_scan","web_application_assessment","penetration_test","segmentation_test",null],"type":"string","x-spec-enum-id":"df388145a7e568b9","nullable":true,"description":"PCI DSS Requirement 11 role to record for the test this scan lands in, overriding the test type's default role.\n\n* `none` - Not a PCI test\n* `internal_vulnerability_scan` - Internal vulnerability scan\n* `external_asv_scan` - External ASV scan\n* `web_application_assessment` - Web application assessment\n* `penetration_test` - Penetration test\n* `segmentation_test` - Segmentation test"},"authenticated":{"enum":["unknown","yes","no",null],"type":"string","x-spec-enum-id":"d1c998de7a29cb98","nullable":true,"description":"Whether this scan ran with credentials (PCI DSS Requirement 11.3.1.2).\n\n* `unknown` - Unknown\n* `yes` - Authenticated\n* `no` - Not authenticated"},"asv_result":{"enum":["not_applicable","pass","fail",null],"type":"string","x-spec-enum-id":"2622389e4dfa2e13","nullable":true,"description":"The result the Approved Scanning Vendor reported for this scan, as recorded by the entity. DefectDojo records what you report; it does not validate an ASV attestation.\n\n* `not_applicable` - Not applicable\n* `pass` - Passing\n* `fail` - Failing"},"asv_vendor":{"type":"string","description":"The Approved Scanning Vendor that ran this scan."},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"message":{"type":"string","readOnly":true,"default":"ReImport processed successfully"},"status":{"type":"string","readOnly":true,"description":"Lifecycle status of the test at the moment this response was produced, one of 'Processing', 'Post Processing - Deduplication', 'Post Processing - False Positive History', 'Processed' or 'Failed'. Only present when background_import is true; poll the test to follow it to completion."},"findings_parsed":{"type":"integer","readOnly":true,"description":"Number of findings parsed out of the uploaded report. Only present when background_import is true. This is a parse count, not a created count: deduplication and the configured import options decide how many findings the background work actually writes."},"name_resolution":{"allOf":[{"$ref":"#/components/schemas/ImportNameResolution"}],"readOnly":true,"description":"Present only when product_name was a former name of the target, or product_type_name named where it was before a move (or a former name of where it is now), and the import used the current names instead of being refused or creating a duplicate. Says what was sent, the current names used, and in 'message' what to change in the pipeline. Only a caller who can view the target gets this: anyone else gets the answer the import gives without it."}},"required":["deduplication_complete","engagement_id","findings_parsed","message","name_resolution","pro","product_id","product_type_id","scan_type","statistics","status","test_id"]},"AsyncReImportScanRequest":{"type":"object","properties":{"scan_date":{"type":"string","format":"date","description":"Scan completion date will be used on all findings."},"minimum_severity":{"enum":["Info","Low","Medium","High","Critical"],"type":"string","x-spec-enum-id":"fc5d16a20ed06136","default":"Info","description":"Minimum severity level to be imported\n\n* `Info` - Info\n* `Low` - Low\n* `Medium` - Medium\n* `High` - High\n* `Critical` - Critical"},"active":{"type":"boolean","description":"Force findings to be active/inactive or default to the original tool (None)"},"verified":{"type":"boolean","description":"Force findings to be verified/not verified or default to the original tool (None)"},"endpoint_to_add":{"type":"integer","description":"Enter the ID of a Location that is associated with the target Product. New Findings will be added to that Location."},"file":{"type":"string","format":"binary","pattern":"(?:xml|csv|nessus|json|jsonl|html|js|zip|xlsx|txt|sarif|fpr|md|log|fvdl|spdx|ckl|cklb)$"},"product_type_name":{"type":"string","minLength":1,"description":"Also referred to as 'Organization' name."},"product_name":{"type":"string","minLength":1,"description":"Also referred to as 'Asset' name."},"engagement_name":{"type":"string","minLength":1},"engagement_end_date":{"type":"string","format":"date","description":"End Date for Engagement. Default is current time + 365 days. Required format year-month-day"},"source_code_management_uri":{"type":"string","format":"uri","minLength":1,"description":"Resource link to source code","maxLength":600},"test_title":{"type":"string","minLength":1},"auto_create_context":{"type":"boolean"},"deduplication_on_engagement":{"type":"boolean"},"lead":{"type":"integer","nullable":true},"push_to_jira":{"type":"boolean","default":false},"deduplication_execution_mode":{"enum":["async","async_wait","sync",null],"type":"string","x-spec-enum-id":"bf7fb8ff28520a46","nullable":true,"description":"Override how import post-processing (deduplication, jira push, grading, ...) is executed for this request. 'async' dispatches post-processing to the background and responds immediately (default). 'async_wait' dispatches to the background but waits for deduplication to finish before responding, so notifications and the returned statistics reflect the deduplicated state. 'sync' runs everything inline. If omitted, falls back to the user's profile setting (deduplication_execution_mode).\n\n* `async` - Async (do not wait)\n* `async_wait` - Async, wait for deduplication\n* `sync` - Synchronous (block)"},"environment":{"type":"string","minLength":1},"build_id":{"type":"string","minLength":1,"description":"ID of the build that was scanned."},"branch_tag":{"type":"string","minLength":1,"description":"Branch or Tag that was scanned."},"commit_hash":{"type":"string","minLength":1,"description":"Commit that was scanned."},"api_scan_configuration":{"type":"integer","nullable":true},"service":{"type":"string","minLength":1,"description":"A service is a self-contained piece of functionality within a Product. This is an optional field which is used in deduplication and closing of old findings when set. This affects the whole engagement/product depending on your deduplication scope."},"group_by":{"enum":["component_name","component_name+component_version","file_path","finding_title","vuln_id_from_tool"],"type":"string","x-spec-enum-id":"a9b19a914dcfbd21","description":"Choose an option to automatically group new findings by the chosen option.\n\n* `component_name` - Component Name\n* `component_name+component_version` - Component Name + Version\n* `file_path` - File path\n* `finding_title` - Finding Title\n* `vuln_id_from_tool` - Vulnerability ID from Tool"},"create_finding_groups_for_all_findings":{"type":"boolean","default":true,"description":"If set to false, finding groups will only be created when there is more than one grouped finding"},"apply_tags_to_findings":{"type":"boolean","description":"If set to True, the tags will be applied to the findings"},"apply_tags_to_endpoints":{"type":"boolean","description":"If set to True, the tags will be applied to the locations"},"do_not_reactivate":{"type":"boolean","default":false,"description":"Keep closed findings closed when they appear in the report again, instead of reactivating them. New findings are still created, and open findings are processed as usual."},"scan_type":{"enum":["2ms Scan","42Crunch - Connectors Import","AccuKnox - Connectors Import","Action1 Scan","Acunetix Scan","AI Agent Red Team","AIDE Scan","Akto Scan","Alert Logic Scan","Anchore Engine Scan","Anchore Enterprise Policy Check","Anchore Grype","Anchore Grype detailed","AnchoreCTL Policies Report","AnchoreCTL Vuln Report","Ansible Lint Scan","APKLeaks Scan","AppCheck Web Application Scanner","AppSpider Scan","Aqua Scan","Arachni Scan","AuditJS Scan","Automox Scan","AWS Inspector2 Scan","AWS Prowler Scan","AWS Prowler V3","AWS Security Finding Format (ASFF) Scan","AWS Security Hub Scan","Azure Security Center Recommendations Scan","Bandit Scan","Beagle Security - Connectors Import","Bearer CLI","BigID Scan","Binwalk Scan","BlackDuck API","Blackduck Binary Analysis","Blackduck Component Risk","Blackduck Hub Scan","bomber Scan","Brakeman Scan","Bright - Connectors Import","Bugcrowd API Import","BugCrowd Scan","Bundler-Audit Scan","Burp Dastardly Scan","Burp Enterprise Scan","Burp REST API","Burp Scan","Burp GraphQL API","Burp Suite DAST Scan","Calico Cloud Image Assurance Scan","capa Scan","CargoAudit Scan","cfn-lint Scan","cfn-nag Scan","CFRipper Scan","Checkmarx CxFlow SAST","Checkmarx One Scan","Checkmarx OSA","Checkmarx Scan","Checkmarx Scan detailed","Checkov Scan","Chef Inspect Log","chkrootkit Scan","Choctaw Hog Scan","Clair Scan","ClamAV Scan","Cloud Posture Scan","Cloudflare Insights","CloudFormation Guard Scan","Cloudsplaining Scan","Cloudsploit Scan","Cobalt.io API Import","Cobalt.io Scan","Codacy - Connectors Import","Codechecker Report native","CodeQL Scan","Composer Audit Scan","Conftest Scan","Contrast Scan","Coverity API","Coverity Scan JSON Report","Cppcheck Scan","Crashtest Security JSON File","Crashtest Security XML File","CredScan Scan","CrowdStrike:Spotlight - Connectors Import","Crunch42 Scan","CSAF Scan","cwe_checker Scan","CyberArk Certificate Manager Scan","Cyberwatch scan (Galeax)","CycloneDX Scan","Cycognito Scan","Dalfox Scan","Datadog Cloud Security","DawnScanner Scan","debsecan Scan","Deepfence Threatmapper Report","DeepSource - Connectors Import","Dependency Check Scan","Dependency Track Finding Packaging Format (FPF) Export","Detect-secrets Scan","Detectify Scan","DevSkim Scan","Dirsearch Scan","DISA STIG Checklist","docker-bench-security Scan","dockerfile_lint Scan","Dockle Scan","Dodgy Scan","Dotnet Vulnerable Packages Scan","Dragos Scan","DrHeader JSON Importer","DSOP Scan","Duroc Hog Scan","Edgescan Scan","Elastic Security:CNVM - Connectors Import","Elastic Security:Detections - Connectors Import","Elastic Security:Posture - Connectors Import","Endor Labs - Connectors Import","Escape - Connectors Import","ESLint Scan","Essex Hog Scan","Fairwinds Insights - Connectors Import","Falco Scan","ffuf Scan","Fickling Scan","Finite State - Connectors Import","Firmwalker Scan","Flawfinder Scan","Fleet:Policies - Connectors Import","Fleet:Vulnerabilities - Connectors Import","Fortify Scan","Fortify Scan v2","FOSSA - Connectors Import","Garak Scan","Generic Findings Import","Ggshield Scan","GitGuardian - Connectors Import","Github SAST Scan","Github Secrets Detection Report Scan","Github Vulnerability Scan","GitLab API Fuzzing Report Scan","GitLab Container Scan","GitLab DAST Report","GitLab Dependency Scanning Report","GitLab SAST Report","GitLab Secret Detection Report","Gitleaks Scan","Gixy Scan","Gobuster Scan","Google Cloud Artifact Vulnerability Scan","Google Cloud SCC - Connectors Import","Gosec Scanner","Gottingen Hog Scan","Govulncheck Scanner","Govulncheck Scanner V2","Grant Scan","Group-IB ASM - Connectors Import","GuardDog Scan","HackerOne - Connectors Import","HackerOne Cases","Hadolint Dockerfile check","Halo Security - Connectors Import","Harbor Vulnerability Scan","HCL AppScan on Cloud SAST XML","HCLAppScan XML","HiddenLayer Model Scan","Holm Security Scan","Horusec Scan","httpx Scan","Humble Json Importer","HuskyCI Report","Hydra Scan","IBM AppScan DAST","Immuniweb Scan","Infer Scan","Intigriti - Connectors Import","Intruder API Import","IntSights Report","Invicti Scan","IriusRisk Threats Scan","JFrog Xray API Summary Artifact Scan","JFrog Xray On Demand Binary Scan","JFrog Xray Scan","JFrog Xray Unified Scan","KICS Scan","Kingfisher Scan","Kiuwan SCA Scan","Kiuwan Scan","Klocwork Scan","KrakenD Audit Scan","kube-bench Scan","kube-score Scan","Kubeaudit Scan","KubeEye Scan","KubeHunter Scan","KubeLinter Scan","kubent Scan","Kubescape JSON Importer","kubesec Scan","Kyverno Scan","Lacework - Connectors Import","Legitify Scan","Licensecheck Scan","Lynis Scan","ManageEngine Vulnerability Manager Plus Scan","Masscan Scan","Mayhem SARIF Report","Mend Scan","Meterian Scan","Microfocus Webinspect Scan","Microsoft Defender for Cloud - Connectors Import","Mix Audit Scan","MobSF Scan","Mobsfscan Scan","MobSF Scorecard Scan","ModelScan Scan","Mozilla Observatory Scan","MSDefender Parser","n0s1 Scanner","Naabu Scan","Nancy Scan","NetRise Scan","Netsparker Scan","Nettacker Scan","NeuVector (compliance)","NeuVector (REST)","Nexpose Scan","Nightfall AI - Connectors Import","Nikto Scan","njsscan Scan","Nmap Scan","Node Security Platform Scan","Noir Scan","Nosey Parker Scan","NowSecure","Nozomi Vantage Scan","NPM Audit Scan","NPM Audit v7+ Scan","Nuclei Scan","OpenReports","Openscap Vulnerability Scan","OpenSSF Scorecard","OpenVAS Parser","OpenVAS Parser v2","OpenVEX Scan","OPF Scan","Orca Security Alerts","ORT evaluated model Importer","OssIndex Devaudit SCA Scan Importer","Ostorlab Scan","OSV Scan","Outpost24 Scan","Parasoft DTP Scan","PHP Security Audit v2","PHP Symfony Security Check","PHPStan Scan","PICUS Scan","PingCastle","pip-audit Scan","pip-licenses Scan","Pluto Scan","PMapper Scan","PMD Scan","pnpm Audit Scan","Polaris Scan","Popeye Scan","Probely API Import","Progpilot Scan","Promptfoo Scan","Prospector Scan","Prowler Scan","Psalm Scan","PTART Report","PWN SAST","PyRIT Scan","Python Taint Scan","QARK Scan","Qualys Hacker Guardian Scan","Qualys Infrastructure Scan (WebGUI XML)","Qualys Scan","Qualys VMDR","Qualys Webapp Scan","Quark-Engine Scan","Quay - Connectors Import","Qwiet Scan","Rapid7 InsightAppSec - Connectors Import","Rapplex Scan","Red Hat Satellite","Regula Scan","Retire.js Scan","ReversingLabs Spectra Assure","Risk Recon API Importer","rkhunter Scan","Rubocop Scan","Ruff Scan","Rusty Hog Scan","Safety Scan","SARIF","sbomqs Scan","Scantist Scan","Scout Suite Scan","ScubaGear Report Scan","ScubaGear Scan","ScubaGoggles Action Plan","ScubaGoggles Scan","Seal Security Scan","Secretlint Scan","Semgrep JSON Report","Semgrep Pro JSON Report","ShellCheck Scan","SKF Scan","Slither Scan","Snyk Code Scan","Snyk Issue API Scan","Snyk Scan","Socket - Connectors Import","Solar Appscreener Scan","SonarQube API Import","SonarQube Scan","SonarQube Scan detailed","Sonatype Application Scan","SOOS - Connectors Import","SPDX Scan","SpotBugs Scan","Sqlmap Scan","SSH Audit Importer","SSL Labs Scan","Sslscan","Sslyze Scan","SSLyze Scan (JSON)","StackHawk HawkScan","Staticcheck Scan","Syft SBOM","Sysdig CLI Report","Sysdig Vulnerability Report","Talisman Scan","Tartufo Scan","Tenable Scan","terraform-compliance Scan","Terrascan Scan","Testssl Scan","TFLint Scan","TFSec Scan","Threagile risks report","Threat Dragon Scan","ThreatComposer Scan","Tracee Scan","Trivy Operator Scan","Trivy Scan","Trufflehog Scan","Trufflehog3 Scan","Trustwave Fusion API Scan","Trustwave Scan (CSV)","Twistlock Image Scan","Universal Parser - Custom_CSV_Parser_manual_findings_Import","Uptycs Scan","uv audit Scan","Vanta Compliance","VCG Scan","Veracode Scan","Veracode SourceClear Scan","Vulners","Vuls Scan","Wallarm API Security","Wapiti Scan","Wazuh","WFuzz JSON report","WhatWeb Scan","Whispers Scan","WhiteHat Sentinel","Wiz Scan","Wizcli Dir Scan","Wizcli IaC Scan","Wizcli Img Scan","Wpscan","Xanitizer Scan","Xeol Parser","Xygeni SAST Scan","Xygeni SCA Scan","Xygeni Secrets Scan","YARA Scan","Yarn Audit Scan","YesWeHack - Connectors Import","ZAP Scan","Zimperium zScan","Zora Parser"],"type":"string","description":"* `2ms Scan` - 2ms Scan\n* `42Crunch - Connectors Import` - 42Crunch - Connectors Import\n* `AccuKnox - Connectors Import` - AccuKnox - Connectors Import\n* `Action1 Scan` - Action1 Scan\n* `Acunetix Scan` - Acunetix Scanner\n* `AI Agent Red Team` - AI Agent Red Team\n* `AIDE Scan` - AIDE Scan\n* `Akto Scan` - Akto Scan\n* `Alert Logic Scan` - Alert Logic Scan\n* `Anchore Engine Scan` - Anchore Engine Scan\n* `Anchore Enterprise Policy Check` - Anchore Enterprise Policy Check\n* `Anchore Grype` - Anchore Grype\n* `Anchore Grype detailed` - Anchore Grype detailed\n* `AnchoreCTL Policies Report` - AnchoreCTL Policies Report\n* `AnchoreCTL Vuln Report` - AnchoreCTL Vuln Report\n* `Ansible Lint Scan` - Ansible Lint Scan\n* `APKLeaks Scan` - APKLeaks Scan\n* `AppCheck Web Application Scanner` - AppCheck Web Application Scanner\n* `AppSpider Scan` - AppSpider Scan\n* `Aqua Scan` - Aqua Scan\n* `Arachni Scan` - Arachni Scan\n* `AuditJS Scan` - AuditJS Scan\n* `Automox Scan` - Automox Scan\n* `AWS Inspector2 Scan` - AWS Inspector2 Scan\n* `AWS Prowler Scan` - AWS Prowler Scan\n* `AWS Prowler V3` - AWS Prowler V3\n* `AWS Security Finding Format (ASFF) Scan` - AWS Security Finding Format (ASFF)\n* `AWS Security Hub Scan` - AWS Security Hub Scan\n* `Azure Security Center Recommendations Scan` - Azure Security Center Recommendations Scan\n* `Bandit Scan` - Bandit Scan\n* `Beagle Security - Connectors Import` - Beagle Security - Connectors Import\n* `Bearer CLI` - Bearer CLI\n* `BigID Scan` - BigID Scan\n* `Binwalk Scan` - Binwalk Scan\n* `BlackDuck API` - BlackDuck API\n* `Blackduck Binary Analysis` - Blackduck Binary Analysis\n* `Blackduck Component Risk` - Blackduck Component Risk\n* `Blackduck Hub Scan` - Blackduck Hub Scan\n* `bomber Scan` - bomber Scan\n* `Brakeman Scan` - Brakeman Scan\n* `Bright - Connectors Import` - Bright - Connectors Import\n* `Bugcrowd API Import` - Bugcrowd API Import\n* `BugCrowd Scan` - BugCrowd Scan\n* `Bundler-Audit Scan` - Bundler-Audit Scan\n* `Burp Dastardly Scan` - Burp Dastardly Scan\n* `Burp Enterprise Scan` - Burp Enterprise Scan (RENAMED to Burp Suite DAST Scan)\n* `Burp REST API` - Burp REST API\n* `Burp Scan` - Burp Scan\n* `Burp GraphQL API` - Burp Suite DAST GraphQL API\n* `Burp Suite DAST Scan` - Burp Suite DAST Scan\n* `Calico Cloud Image Assurance Scan` - Calico Cloud Image Assurance Scan\n* `capa Scan` - capa Scan\n* `CargoAudit Scan` - CargoAudit Scan\n* `cfn-lint Scan` - cfn-lint Scan\n* `cfn-nag Scan` - cfn-nag Scan\n* `CFRipper Scan` - CFRipper Scan\n* `Checkmarx CxFlow SAST` - Checkmarx CxFlow SAST\n* `Checkmarx One Scan` - Checkmarx One Scan\n* `Checkmarx OSA` - Checkmarx OSA\n* `Checkmarx Scan` - Checkmarx Scan\n* `Checkmarx Scan detailed` - Checkmarx Scan detailed\n* `Checkov Scan` - Checkov Scan\n* `Chef Inspect Log` - Chef Inspect Log\n* `chkrootkit Scan` - chkrootkit Scan\n* `Choctaw Hog Scan` - Choctaw Hog Scan\n* `Clair Scan` - Clair Scan\n* `ClamAV Scan` - ClamAV Scan\n* `Cloud Posture Scan` - Cloud Posture Scan\n* `Cloudflare Insights` - Cloudflare Insights\n* `CloudFormation Guard Scan` - CloudFormation Guard Scan\n* `Cloudsplaining Scan` - Cloudsplaining Scan\n* `Cloudsploit Scan` - Cloudsploit Scan\n* `Cobalt.io API Import` - Cobalt.io API Import\n* `Cobalt.io Scan` - Cobalt.io Scan\n* `Codacy - Connectors Import` - Codacy - Connectors Import\n* `Codechecker Report native` - Codechecker Report native\n* `CodeQL Scan` - CodeQL Scan\n* `Composer Audit Scan` - Composer Audit Scan\n* `Conftest Scan` - Conftest Scan\n* `Contrast Scan` - Contrast Scan\n* `Coverity API` - Coverity API\n* `Coverity Scan JSON Report` - Coverity Scan JSON Report\n* `Cppcheck Scan` - Cppcheck Scan\n* `Crashtest Security JSON File` - Crashtest Security JSON File\n* `Crashtest Security XML File` - Crashtest Security XML File\n* `CredScan Scan` - CredScan Scan\n* `CrowdStrike:Spotlight - Connectors Import` - CrowdStrike:Spotlight - Connectors Import\n* `Crunch42 Scan` - Crunch42 Scan\n* `CSAF Scan` - CSAF Scan\n* `cwe_checker Scan` - cwe_checker Scan\n* `CyberArk Certificate Manager Scan` - CyberArk Certificate Manager Scan\n* `Cyberwatch scan (Galeax)` - Cyberwatch scan (Galeax)\n* `CycloneDX Scan` - CycloneDX Scan\n* `Cycognito Scan` - Cycognito Scan\n* `Dalfox Scan` - Dalfox Scan\n* `Datadog Cloud Security` - Datadog Cloud Security\n* `DawnScanner Scan` - DawnScanner Scan\n* `debsecan Scan` - debsecan Scan\n* `Deepfence Threatmapper Report` - Deepfence Threatmapper Report\n* `DeepSource - Connectors Import` - DeepSource - Connectors Import\n* `Dependency Check Scan` - Dependency Check Scan\n* `Dependency Track Finding Packaging Format (FPF) Export` - Dependency Track Finding Packaging Format (FPF) Export\n* `Detect-secrets Scan` - Detect-secrets Scan\n* `Detectify Scan` - Detectify Scan\n* `DevSkim Scan` - DevSkim Scan\n* `Dirsearch Scan` - Dirsearch Scan\n* `DISA STIG Checklist` - DISA STIG Checklist\n* `docker-bench-security Scan` - docker-bench-security Scan\n* `dockerfile_lint Scan` - dockerfile_lint Scan\n* `Dockle Scan` - Dockle Scan\n* `Dodgy Scan` - Dodgy Scan\n* `Dotnet Vulnerable Packages Scan` - Dotnet Vulnerable Packages Scan\n* `Dragos Scan` - Dragos Scan\n* `DrHeader JSON Importer` - DrHeader JSON Importer\n* `DSOP Scan` - DSOP Scan\n* `Duroc Hog Scan` - Duroc Hog Scan\n* `Edgescan Scan` - Edgescan Scan\n* `Elastic Security:CNVM - Connectors Import` - Elastic Security:CNVM - Connectors Import\n* `Elastic Security:Detections - Connectors Import` - Elastic Security:Detections - Connectors Import\n* `Elastic Security:Posture - Connectors Import` - Elastic Security:Posture - Connectors Import\n* `Endor Labs - Connectors Import` - Endor Labs - Connectors Import\n* `Escape - Connectors Import` - Escape - Connectors Import\n* `ESLint Scan` - ESLint Scan\n* `Essex Hog Scan` - Essex Hog Scan\n* `Fairwinds Insights - Connectors Import` - Fairwinds Insights - Connectors Import\n* `Falco Scan` - Falco Scan\n* `ffuf Scan` - ffuf Scan\n* `Fickling Scan` - Fickling Scan\n* `Finite State - Connectors Import` - Finite State - Connectors Import\n* `Firmwalker Scan` - Firmwalker Scan\n* `Flawfinder Scan` - Flawfinder Scan\n* `Fleet:Policies - Connectors Import` - Fleet:Policies - Connectors Import\n* `Fleet:Vulnerabilities - Connectors Import` - Fleet:Vulnerabilities - Connectors Import\n* `Fortify Scan` - Fortify Scan\n* `Fortify Scan v2` - Fortify Scan v2\n* `FOSSA - Connectors Import` - FOSSA - Connectors Import\n* `Garak Scan` - Garak Scan\n* `Generic Findings Import` - Generic Findings Import\n* `Ggshield Scan` - Ggshield Scan\n* `GitGuardian - Connectors Import` - GitGuardian - Connectors Import\n* `Github SAST Scan` - Github SAST Scan\n* `Github Secrets Detection Report Scan` - Github Secrets Detection Report Scan\n* `Github Vulnerability Scan` - Github Vulnerability Scan\n* `GitLab API Fuzzing Report Scan` - GitLab API Fuzzing Report Scan\n* `GitLab Container Scan` - GitLab Container Scan Scan\n* `GitLab DAST Report` - GitLab DAST Report\n* `GitLab Dependency Scanning Report` - GitLab Dependency Scanning Report\n* `GitLab SAST Report` - GitLab SAST Report\n* `GitLab Secret Detection Report` - GitLab Secret Detection Report\n* `Gitleaks Scan` - Gitleaks Scan\n* `Gixy Scan` - Gixy Scan\n* `Gobuster Scan` - Gobuster Scan\n* `Google Cloud Artifact Vulnerability Scan` - Google Cloud Artifact Vulnerability Scan\n* `Google Cloud SCC - Connectors Import` - Google Cloud SCC - Connectors Import\n* `Gosec Scanner` - Gosec Scanner\n* `Gottingen Hog Scan` - Gottingen Hog Scan\n* `Govulncheck Scanner` - Govulncheck Scanner\n* `Govulncheck Scanner V2` - Govulncheck Scanner V2\n* `Grant Scan` - Grant Scan\n* `Group-IB ASM - Connectors Import` - Group-IB ASM - Connectors Import\n* `GuardDog Scan` - GuardDog Scan\n* `HackerOne - Connectors Import` - HackerOne - Connectors Import\n* `HackerOne Cases` - HackerOne Cases\n* `Hadolint Dockerfile check` - Hadolint Dockerfile check\n* `Halo Security - Connectors Import` - Halo Security - Connectors Import\n* `Harbor Vulnerability Scan` - Harbor Vulnerability Scan\n* `HCL AppScan on Cloud SAST XML` - HCL AppScan on Cloud SAST XML\n* `HCLAppScan XML` - HCLAppScan XML\n* `HiddenLayer Model Scan` - HiddenLayer Model Scan\n* `Holm Security Scan` - Holm Security Scan\n* `Horusec Scan` - Horusec Scan\n* `httpx Scan` - httpx Scan\n* `Humble Json Importer` - Humble Json Importer\n* `HuskyCI Report` - HuskyCI Report\n* `Hydra Scan` - Hydra Scan\n* `IBM AppScan DAST` - IBM AppScan DAST\n* `Immuniweb Scan` - Immuniweb Scan\n* `Infer Scan` - Infer Scan\n* `Intigriti - Connectors Import` - Intigriti - Connectors Import\n* `Intruder API Import` - Intruder API Import\n* `IntSights Report` - IntSights Report\n* `Invicti Scan` - Invicti Scan\n* `IriusRisk Threats Scan` - IriusRisk Threats Scan\n* `JFrog Xray API Summary Artifact Scan` - JFrog Xray API Summary Artifact Scan\n* `JFrog Xray On Demand Binary Scan` - JFrog Xray On Demand Binary Scan\n* `JFrog Xray Scan` - JFrog Xray Scan\n* `JFrog Xray Unified Scan` - JFrog Xray Unified Scan\n* `KICS Scan` - KICS Scan\n* `Kingfisher Scan` - Kingfisher Scan\n* `Kiuwan SCA Scan` - Kiuwan SCA Scan\n* `Kiuwan Scan` - Kiuwan Scan\n* `Klocwork Scan` - Klocwork Scan\n* `KrakenD Audit Scan` - KrakenD Audit Scan\n* `kube-bench Scan` - kube-bench Scan\n* `kube-score Scan` - kube-score Scan\n* `Kubeaudit Scan` - Kubeaudit Scan\n* `KubeEye Scan` - KubeEye Scan\n* `KubeHunter Scan` - KubeHunter Scan\n* `KubeLinter Scan` - KubeLinter Scan\n* `kubent Scan` - kubent Scan\n* `Kubescape JSON Importer` - Kubescape JSON Importer\n* `kubesec Scan` - kubesec Scan\n* `Kyverno Scan` - Kyverno Scan\n* `Lacework - Connectors Import` - Lacework - Connectors Import\n* `Legitify Scan` - Legitify Scan\n* `Licensecheck Scan` - Licensecheck Scan\n* `Lynis Scan` - Lynis Scan\n* `ManageEngine Vulnerability Manager Plus Scan` - ManageEngine Vulnerability Manager Plus Scan\n* `Masscan Scan` - Masscan Scan\n* `Mayhem SARIF Report` - Mayhem SARIF Report\n* `Mend Scan` - Mend Scan\n* `Meterian Scan` - Meterian Scan\n* `Microfocus Webinspect Scan` - Microfocus Webinspect Scan\n* `Microsoft Defender for Cloud - Connectors Import` - Microsoft Defender for Cloud - Connectors Import\n* `Mix Audit Scan` - Mix Audit Scan\n* `MobSF Scan` - MobSF Scan\n* `Mobsfscan Scan` - MobSF Scan\n* `MobSF Scorecard Scan` - MobSF Scorecard Scan\n* `ModelScan Scan` - ModelScan Scan\n* `Mozilla Observatory Scan` - Mozilla Observatory Scan\n* `MSDefender Parser` - MSDefender Parser\n* `n0s1 Scanner` - n0s1 Scanner\n* `Naabu Scan` - Naabu Scan\n* `Nancy Scan` - Nancy Scan\n* `NetRise Scan` - NetRise Scan\n* `Netsparker Scan` - Netsparker Scan\n* `Nettacker Scan` - Nettacker Scan\n* `NeuVector (compliance)` - NeuVector (compliance)\n* `NeuVector (REST)` - NeuVector (REST)\n* `Nexpose Scan` - Nexpose Scan\n* `Nightfall AI - Connectors Import` - Nightfall AI - Connectors Import\n* `Nikto Scan` - Nikto Scan\n* `njsscan Scan` - njsscan Scan\n* `Nmap Scan` - Nmap Scan\n* `Node Security Platform Scan` - Node Security Platform Scan\n* `Noir Scan` - Noir Scan\n* `Nosey Parker Scan` - Nosey Parker Scan\n* `NowSecure` - NowSecure\n* `Nozomi Vantage Scan` - Nozomi Vantage Scan\n* `NPM Audit Scan` - NPM Audit Scan\n* `NPM Audit v7+ Scan` - NPM Audit v7+ Scan\n* `Nuclei Scan` - Nuclei Scan\n* `OpenReports` - OpenReports\n* `Openscap Vulnerability Scan` - Openscap Vulnerability Scan\n* `OpenSSF Scorecard` - OpenSSF Scorecard\n* `OpenVAS Parser` - OpenVAS Parser\n* `OpenVAS Parser v2` - OpenVAS Parser v2\n* `OpenVEX Scan` - OpenVEX Scan\n* `OPF Scan` - OPF Scan\n* `Orca Security Alerts` - Orca Security Alerts\n* `ORT evaluated model Importer` - ORT evaluated model Importer\n* `OssIndex Devaudit SCA Scan Importer` - OssIndex Devaudit SCA Scan Importer\n* `Ostorlab Scan` - Ostorlab Scan\n* `OSV Scan` - OSV Scan\n* `Outpost24 Scan` - Outpost24 Scan\n* `Parasoft DTP Scan` - Parasoft DTP Scan\n* `PHP Security Audit v2` - PHP Security Audit v2\n* `PHP Symfony Security Check` - PHP Symfony Security Check\n* `PHPStan Scan` - PHPStan Scan\n* `PICUS Scan` - PICUS Scan\n* `PingCastle` - PingCastle\n* `pip-audit Scan` - pip-audit Scan\n* `pip-licenses Scan` - pip-licenses Scan\n* `Pluto Scan` - Pluto Scan\n* `PMapper Scan` - PMapper Scan\n* `PMD Scan` - PMD Scan\n* `pnpm Audit Scan` - pnpm Audit Scan\n* `Polaris Scan` - Polaris Scan\n* `Popeye Scan` - Popeye Scan\n* `Probely API Import` - Probely API Import\n* `Progpilot Scan` - Progpilot Scan\n* `Promptfoo Scan` - Promptfoo Scan\n* `Prospector Scan` - Prospector Scan\n* `Prowler Scan` - Prowler Scan\n* `Psalm Scan` - Psalm Scan\n* `PTART Report` - PTART Report\n* `PWN SAST` - PWN SAST\n* `PyRIT Scan` - PyRIT Scan\n* `Python Taint Scan` - Python Taint Scan\n* `QARK Scan` - QARK Scan\n* `Qualys Hacker Guardian Scan` - Qualys Hacker Guardian Scan\n* `Qualys Infrastructure Scan (WebGUI XML)` - Qualys Infrastructure Scan (WebGUI XML)\n* `Qualys Scan` - Qualys Scan\n* `Qualys VMDR` - Qualys VMDR\n* `Qualys Webapp Scan` - Qualys Webapp Scan\n* `Quark-Engine Scan` - Quark-Engine Scan\n* `Quay - Connectors Import` - Quay - Connectors Import\n* `Qwiet Scan` - Qwiet Scan\n* `Rapid7 InsightAppSec - Connectors Import` - Rapid7 InsightAppSec - Connectors Import\n* `Rapplex Scan` - Rapplex Scan\n* `Red Hat Satellite` - Red Hat Satellite\n* `Regula Scan` - Regula Scan\n* `Retire.js Scan` - Retire.js Scan\n* `ReversingLabs Spectra Assure` - ReversingLabs Spectra Assure\n* `Risk Recon API Importer` - Risk Recon API Importer\n* `rkhunter Scan` - rkhunter Scan\n* `Rubocop Scan` - Rubocop Scan\n* `Ruff Scan` - Ruff Scan\n* `Rusty Hog Scan` - Rusty Hog Scan\n* `Safety Scan` - Safety Scan\n* `SARIF` - SARIF\n* `sbomqs Scan` - sbomqs Scan\n* `Scantist Scan` - Scantist Scan\n* `Scout Suite Scan` - Scout Suite Scan\n* `ScubaGear Report Scan` - ScubaGear Report Scan\n* `ScubaGear Scan` - ScubaGear Scan\n* `ScubaGoggles Action Plan` - ScubaGoggles Action Plan\n* `ScubaGoggles Scan` - ScubaGoggles Scan\n* `Seal Security Scan` - Seal Security Scan\n* `Secretlint Scan` - Secretlint Scan\n* `Semgrep JSON Report` - Semgrep JSON Report\n* `Semgrep Pro JSON Report` - Semgrep Pro JSON Report\n* `ShellCheck Scan` - ShellCheck Scan\n* `SKF Scan` - SKF Scan\n* `Slither Scan` - Slither Scan\n* `Snyk Code Scan` - Snyk Code Scan\n* `Snyk Issue API Scan` - Snyk Issue API Scan\n* `Snyk Scan` - Snyk Scan\n* `Socket - Connectors Import` - Socket - Connectors Import\n* `Solar Appscreener Scan` - Solar Appscreener Scan Detailed_Results.csv\n* `SonarQube API Import` - SonarQube API Import\n* `SonarQube Scan` - SonarQube Scan\n* `SonarQube Scan detailed` - SonarQube Scan detailed\n* `Sonatype Application Scan` - Sonatype Application Scan\n* `SOOS - Connectors Import` - SOOS - Connectors Import\n* `SPDX Scan` - SPDX Scan\n* `SpotBugs Scan` - SpotBugs Scan\n* `Sqlmap Scan` - Sqlmap Scan\n* `SSH Audit Importer` - SSH Audit Importer\n* `SSL Labs Scan` - SSL Labs Scan\n* `Sslscan` - Sslscan\n* `Sslyze Scan` - Sslyze Scan\n* `SSLyze Scan (JSON)` - SSLyze Scan (JSON)\n* `StackHawk HawkScan` - StackHawk HawkScan\n* `Staticcheck Scan` - Staticcheck Scan\n* `Syft SBOM` - Syft SBOM\n* `Sysdig CLI Report` - Sysdig CLI Report Scan\n* `Sysdig Vulnerability Report` - Sysdig Vulnerability Report Scan\n* `Talisman Scan` - Talisman Scan\n* `Tartufo Scan` - Tartufo Scan\n* `Tenable Scan` - Tenable Scan\n* `terraform-compliance Scan` - terraform-compliance Scan\n* `Terrascan Scan` - Terrascan Scan\n* `Testssl Scan` - Testssl Scan\n* `TFLint Scan` - TFLint Scan\n* `TFSec Scan` - TFSec Scan\n* `Threagile risks report` - Threagile risks report\n* `Threat Dragon Scan` - Threat Dragon Scan\n* `ThreatComposer Scan` - ThreatComposer Scan\n* `Tracee Scan` - Tracee Scan\n* `Trivy Operator Scan` - Trivy Operator Scan\n* `Trivy Scan` - Trivy Scan\n* `Trufflehog Scan` - Trufflehog Scan\n* `Trufflehog3 Scan` - Trufflehog3 Scan\n* `Trustwave Fusion API Scan` - Trustwave Fusion API Scan\n* `Trustwave Scan (CSV)` - Trustwave Scan (CSV)\n* `Twistlock Image Scan` - Twistlock Image Scan\n* `Universal Parser - Custom_CSV_Parser_manual_findings_Import` - Universal Parser - Custom_CSV_Parser_manual_findings_Import\n* `Uptycs Scan` - Uptycs Scan\n* `uv audit Scan` - uv audit Scan\n* `Vanta Compliance` - Vanta Compliance\n* `VCG Scan` - VCG Scan\n* `Veracode Scan` - Veracode Scan\n* `Veracode SourceClear Scan` - Veracode SourceClear Scan\n* `Vulners` - Vulners\n* `Vuls Scan` - Vuls Scan\n* `Wallarm API Security` - Wallarm API Security\n* `Wapiti Scan` - Wapiti Scan\n* `Wazuh` - Wazuh\n* `WFuzz JSON report` - WFuzz JSON report\n* `WhatWeb Scan` - WhatWeb Scan\n* `Whispers Scan` - Whispers Scan\n* `WhiteHat Sentinel` - WhiteHat Sentinel\n* `Wiz Scan` - Wiz Scan\n* `Wizcli Dir Scan` - Wizcli Dir Scan\n* `Wizcli IaC Scan` - Wizcli IaC Scan\n* `Wizcli Img Scan` - Wizcli Img Scan\n* `Wpscan` - Wpscan\n* `Xanitizer Scan` - Xanitizer Scan\n* `Xeol Parser` - Xeol Parser\n* `Xygeni SAST Scan` - Xygeni SAST Scan\n* `Xygeni SCA Scan` - Xygeni SCA Scan\n* `Xygeni Secrets Scan` - Xygeni Secrets Scan\n* `YARA Scan` - YARA Scan\n* `Yarn Audit Scan` - Yarn Audit Scan\n* `YesWeHack - Connectors Import` - YesWeHack - Connectors Import\n* `ZAP Scan` - ZAP Scan\n* `Zimperium zScan` - Zimperium zScan\n* `Zora Parser` - Zora Parser","x-spec-enum-id":"4fb3bf5945e5491f"},"test":{"type":"integer"},"close_old_findings":{"type":"boolean","default":true,"description":"Old findings no longer present in the new report get closed as mitigated when importing. If service has been set, only the findings for this service will be closed; if no service is set, only findings without a service will be closed. This only affects findings within the same test."},"close_old_findings_product_scope":{"type":"boolean","default":false,"description":"This has no effect on reimport"},"version":{"type":"string","minLength":1,"description":"Version that will be set on existing Test object. Leave empty to leave existing value in place."},"tags":{"type":"array","items":{"type":"string","minLength":1},"description":"Modify existing tags that help describe this scan. (Existing test tags will be overwritten)"},"background_import":{"type":"boolean","nullable":true,"description":"Selecting to import in the background will modify the import process to first parse the file for any errors, return the response, and then create findings in the background. When this is true the findings do not exist yet at the moment the response is produced, so the response deliberately carries no 'statistics' and no 'deduplication_complete' key — they are absent rather than zeroed, because zeros would misreport a scan that has not been processed. Use 'status' and 'findings_parsed' instead, then poll GET /api/v2/tests/{test_id}/ and read its 'status' and 'processing' fields until 'status' is 'Processed' or 'Failed'."},"pci_role":{"enum":["none","internal_vulnerability_scan","external_asv_scan","web_application_assessment","penetration_test","segmentation_test",null],"type":"string","x-spec-enum-id":"df388145a7e568b9","nullable":true,"description":"PCI DSS Requirement 11 role to record for the test this scan lands in, overriding the test type's default role.\n\n* `none` - Not a PCI test\n* `internal_vulnerability_scan` - Internal vulnerability scan\n* `external_asv_scan` - External ASV scan\n* `web_application_assessment` - Web application assessment\n* `penetration_test` - Penetration test\n* `segmentation_test` - Segmentation test"},"authenticated":{"enum":["unknown","yes","no",null],"type":"string","x-spec-enum-id":"d1c998de7a29cb98","nullable":true,"description":"Whether this scan ran with credentials (PCI DSS Requirement 11.3.1.2).\n\n* `unknown` - Unknown\n* `yes` - Authenticated\n* `no` - Not authenticated"},"asv_result":{"enum":["not_applicable","pass","fail",null],"type":"string","x-spec-enum-id":"2622389e4dfa2e13","nullable":true,"description":"The result the Approved Scanning Vendor reported for this scan, as recorded by the entity. DefectDojo records what you report; it does not validate an ASV attestation.\n\n* `not_applicable` - Not applicable\n* `pass` - Passing\n* `fail` - Failing"},"asv_vendor":{"type":"string","description":"The Approved Scanning Vendor that ran this scan."},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."}},"required":["scan_type"]},"AttachAdvisoriesRequestRequest":{"type":"object","properties":{"advisory_ids":{"type":"array","items":{"type":"integer"}}},"required":["advisory_ids"]},"AttachMatchesRequestRequest":{"type":"object","properties":{"match_ids":{"type":"array","items":{"type":"integer"}}},"required":["match_ids"]},"AuditLog":{"type":"object","description":"Serializer for pghistory audit log entries.\n\nSerializes normalized dicts from normalize_pghistory_event.","properties":{"id":{"type":"integer"},"pgh_slug":{"type":"string"},"model_name":{"type":"string"},"object_id":{"type":"integer"},"object_name":{"type":"string"},"action":{"type":"string"},"changes":{"type":"object","additionalProperties":{}},"user":{"type":"object","additionalProperties":{},"nullable":true},"timestamp":{"type":"string","format":"date-time"},"url":{"type":"string","nullable":true},"remote_addr":{"type":"string","nullable":true},"object_data":{"type":"object","additionalProperties":{},"nullable":true},"context":{"type":"object","additionalProperties":{},"nullable":true}},"required":["action","changes","id","model_name","object_id","object_name","pgh_slug","timestamp"]},"AutomationRateRequestRequest":{"type":"object","properties":{"window_days":{"enum":[7,30,90],"type":"integer","description":"* `7` - 7\n* `30` - 30\n* `90` - 90","x-spec-enum-id":"2e5d1943e8d2dd5e"}}},"BenchmarkCategory":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":300},"objective":{"type":"string"},"references":{"type":"string","nullable":true},"enabled":{"type":"boolean"},"created":{"type":"string","format":"date-time","readOnly":true},"updated":{"type":"string","format":"date-time","readOnly":true},"type":{"type":"integer","title":"Benchmark Type"},"prefetch":{"type":"object","properties":{}}},"required":["created","id","name","objective","type","updated"]},"BenchmarkCategoryRequest":{"type":"object","description":"Base serializer for all models.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"objective":{"type":"string","minLength":1},"references":{"type":"string","nullable":true},"enabled":{"type":"boolean"},"type":{"type":"integer","title":"Benchmark Type"}},"required":["name","objective","type"]},"BenchmarkProduct":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"pass_fail":{"type":"boolean","title":"Pass","description":"Does the product meet the requirement?"},"enabled":{"type":"boolean","description":"Applicable for this specific product."},"created":{"type":"string","format":"date-time","readOnly":true},"updated":{"type":"string","format":"date-time","readOnly":true},"product":{"type":"integer"},"control":{"type":"integer"},"notes":{"type":"array","items":{"type":"integer"},"readOnly":true},"prefetch":{"type":"object","properties":{"notes":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Note"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}}}}},"required":["control","created","id","notes","product","updated"]},"BenchmarkProductRequest":{"type":"object","description":"Base serializer for all models.","properties":{"pass_fail":{"type":"boolean","title":"Pass","description":"Does the product meet the requirement?"},"enabled":{"type":"boolean","description":"Applicable for this specific product."},"product":{"type":"integer"},"control":{"type":"integer"}},"required":["control","product"]},"BenchmarkProductSummary":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"desired_level":{"enum":["Level 1","Level 2","Level 3"],"type":"string","description":"* `Level 1` - Level 1\n* `Level 2` - Level 2\n* `Level 3` - Level 3","x-spec-enum-id":"51d382524500f67b"},"current_level":{"enum":["Level 1","Level 2","Level 3","",null],"type":"string","description":"* `Level 1` - Level 1\n* `Level 2` - Level 2\n* `Level 3` - Level 3","x-spec-enum-id":"51d382524500f67b","nullable":true},"asvs_level_1_benchmark":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Total number of active benchmarks for this application."},"asvs_level_1_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"ASVS Level 1 Score"},"asvs_level_2_benchmark":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Total number of active benchmarks for this application."},"asvs_level_2_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"ASVS Level 2 Score"},"asvs_level_3_benchmark":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Total number of active benchmarks for this application."},"asvs_level_3_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"ASVS Level 3 Score"},"publish":{"type":"boolean","description":"Publish score to Product."},"created":{"type":"string","format":"date-time","readOnly":true},"updated":{"type":"string","format":"date-time","readOnly":true},"product":{"type":"integer"},"benchmark_type":{"type":"integer"},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}}}}},"required":["benchmark_type","created","id","product","updated"]},"BenchmarkProductSummaryRequest":{"type":"object","description":"Base serializer for all models.","properties":{"desired_level":{"enum":["Level 1","Level 2","Level 3"],"type":"string","description":"* `Level 1` - Level 1\n* `Level 2` - Level 2\n* `Level 3` - Level 3","x-spec-enum-id":"51d382524500f67b"},"current_level":{"enum":["Level 1","Level 2","Level 3","",null],"type":"string","description":"* `Level 1` - Level 1\n* `Level 2` - Level 2\n* `Level 3` - Level 3","x-spec-enum-id":"51d382524500f67b","nullable":true},"asvs_level_1_benchmark":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Total number of active benchmarks for this application."},"asvs_level_1_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"ASVS Level 1 Score"},"asvs_level_2_benchmark":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Total number of active benchmarks for this application."},"asvs_level_2_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"ASVS Level 2 Score"},"asvs_level_3_benchmark":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Total number of active benchmarks for this application."},"asvs_level_3_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"ASVS Level 3 Score"},"publish":{"type":"boolean","description":"Publish score to Product."},"product":{"type":"integer"},"benchmark_type":{"type":"integer"}},"required":["benchmark_type","product"]},"BenchmarkRequirement":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"objective_number":{"type":"string","nullable":true,"maxLength":15},"objective":{"type":"string"},"references":{"type":"string","nullable":true},"level_1":{"type":"boolean"},"level_2":{"type":"boolean"},"level_3":{"type":"boolean"},"enabled":{"type":"boolean"},"created":{"type":"string","format":"date-time","readOnly":true},"updated":{"type":"string","format":"date-time","readOnly":true},"category":{"type":"integer"},"prefetch":{"type":"object","properties":{}}},"required":["category","created","id","objective","updated"]},"BenchmarkRequirementRequest":{"type":"object","description":"Base serializer for all models.","properties":{"objective_number":{"type":"string","nullable":true,"maxLength":15},"objective":{"type":"string","minLength":1},"references":{"type":"string","nullable":true},"level_1":{"type":"boolean"},"level_2":{"type":"boolean"},"level_3":{"type":"boolean"},"enabled":{"type":"boolean"},"category":{"type":"integer"}},"required":["category","objective"]},"BenchmarkType":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":300},"version":{"type":"string","maxLength":15},"benchmark_source":{"enum":["PCI","OWASP ASVS","OWASP Mobile ASVS",null],"type":"string","description":"* `PCI` - PCI\n* `OWASP ASVS` - OWASP ASVS\n* `OWASP Mobile ASVS` - OWASP Mobile ASVS","x-spec-enum-id":"091a6ccd03b2ee84","nullable":true},"created":{"type":"string","format":"date-time","readOnly":true},"updated":{"type":"string","format":"date-time","readOnly":true},"enabled":{"type":"boolean"}},"required":["created","id","name","updated","version"]},"BenchmarkTypeRequest":{"type":"object","description":"Base serializer for all models.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"version":{"type":"string","minLength":1,"maxLength":15},"benchmark_source":{"enum":["PCI","OWASP ASVS","OWASP Mobile ASVS",null],"type":"string","description":"* `PCI` - PCI\n* `OWASP ASVS` - OWASP ASVS\n* `OWASP Mobile ASVS` - OWASP Mobile ASVS","x-spec-enum-id":"091a6ccd03b2ee84","nullable":true},"enabled":{"type":"boolean"}},"required":["name","version"]},"BigKpiRequestRequest":{"type":"object","properties":{"metric":{"enum":["past_sla_critical_high","sla_breached_total","actionable_open","active_critical","kev_open"],"type":"string","description":"* `past_sla_critical_high` - past_sla_critical_high\n* `sla_breached_total` - sla_breached_total\n* `actionable_open` - actionable_open\n* `active_critical` - active_critical\n* `kev_open` - kev_open","x-spec-enum-id":"0d7981bd90b58c14"},"window_days":{"enum":[7,30,90],"type":"integer","description":"* `7` - 7\n* `30` - 30\n* `90` - 90","x-spec-enum-id":"2e5d1943e8d2dd5e"}}},"BulkAssignRequestRequest":{"type":"object","properties":{"assignee":{"type":"integer","nullable":true},"action_ids":{"type":"array","items":{"type":"integer"},"maxItems":1000}},"required":["action_ids","assignee"]},"BulkDryRun":{"type":"object","description":"The 200 body of a bulk update dry run: the change plan diff (see /api/v2/hierarchy/plans/).","properties":{"summary":{"type":"object","additionalProperties":{"type":"integer"}},"organizations_created":{"type":"array","items":{"type":"object","additionalProperties":{}}},"changes":{"type":"array","items":{"type":"object","additionalProperties":{}}},"parent_links_removed":{"type":"array","items":{"type":"object","additionalProperties":{}}},"memberships":{"type":"array","items":{"type":"object","additionalProperties":{}}},"recalculation":{"type":"object","additionalProperties":{}},"errors":{"type":"array","items":{"type":"object","additionalProperties":{}}},"ops":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["changes","errors","memberships","ops","organizations_created","parent_links_removed","recalculation","summary"]},"BulkFindingRelocationRequest":{"type":"object","description":"``FindingRelocationSerializer`` plus the selection (``POST /api/v2/findings/bulk_move/`` and ``/bulk_copy/``).","properties":{"destination_test":{"type":"integer","nullable":true,"description":"ID of the existing test to move or copy the finding into. Mutually exclusive with destination_product."},"destination_product":{"type":"integer","nullable":true,"description":"ID of the product to move or copy the finding into. Requires create_missing=true, which mirrors the source engagement (matched by name) and test (matched by test type and title) into that product. Mutually exclusive with destination_test."},"create_missing":{"type":"boolean","default":false,"description":"Permit creating a matching engagement and test in destination_product when none exists. Required when destination_product is given."},"findings":{"type":"array","items":{"type":"integer","minimum":1},"description":"IDs of the findings to move or copy, at most 1000. Findings that do not exist or that the caller may not act on are skipped and listed in skipped_messages.","maxItems":1000}},"required":["findings"]},"BulkStatusRequestRequest":{"type":"object","properties":{"status":{"enum":["new","planned","in_progress","blocked","change_scheduled","awaiting_validation","complete","exception_requested"],"type":"string","description":"* `new` - New\n* `planned` - Planned\n* `in_progress` - In Progress\n* `blocked` - Blocked\n* `change_scheduled` - Change Scheduled\n* `awaiting_validation` - Awaiting Validation\n* `complete` - Complete\n* `exception_requested` - Exception Requested","x-spec-enum-id":"57f29bf3b8cd4fef"},"note":{"type":"string","maxLength":10000},"blocked_reason":{"type":"string","maxLength":2000},"scheduled_for":{"type":"string","format":"date","nullable":true},"action_ids":{"type":"array","items":{"type":"integer"},"maxItems":1000}},"required":["action_ids","status"]},"BulkUpdateAssetRequest":{"type":"object","description":"Payload for the assets bulk update: the assets to change plus what to apply.\n\nEvery update field is optional but at least one must be present. ``prod_type``,\n``sla_configuration`` and ``prioritization_engine`` are applied when non-null. ``parent``,\n``asset_type``, ``business_criticality`` and the three contacts are applied when present, and\nnull clears them (``\"parent\": null`` detaches). The destination organization keeps the wire\nname ``prod_type`` so ``UserHasBulkAssetUpdatePermission`` gates it on Product_Type_Add_Product\nbefore the action body runs. Tags are additive: a bulk action that silently replaced every\nselected asset's tag list would be a data-loss surprise.","properties":{"products":{"type":"array","items":{"type":"integer"},"maxItems":500},"prod_type":{"type":"integer","nullable":true},"sla_configuration":{"type":"integer","nullable":true},"prioritization_engine":{"type":"integer","nullable":true},"parent":{"type":"integer","nullable":true},"asset_type":{"type":"string","minLength":1,"description":"Stable lookup key, e.g. 'repository'. Referenced by connectors and imports.","nullable":true},"business_criticality":{"enum":["very high","high","medium","low","very low","none","",null],"type":"string","description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","x-spec-enum-id":"ef412461eb271471","nullable":true},"technical_contact":{"type":"integer","nullable":true},"team_manager":{"type":"integer","nullable":true},"product_manager":{"type":"integer","nullable":true},"move_children":{"type":"boolean","default":true},"tags":{"type":"array","items":{"type":"string","minLength":1}},"dry_run":{"type":"boolean","default":false,"description":"Write nothing and return the change plan diff this request would apply: every field change, the descendants that move along, the parent links a move removes, the organizations whose priority is recalculated, and every refused asset."}},"required":["products"]},"BulkUpdateError":{"type":"object","description":"One refused asset in a rejected bulk update.","properties":{"product":{"type":"integer","nullable":true},"name":{"type":"string"},"field":{"type":"string"},"message":{"type":"string"}},"required":["field","message","product"]},"BulkUpdateRejected":{"type":"object","description":"The 400 body of a rejected bulk update: nothing was written.","properties":{"detail":{"type":"string"},"errors":{"type":"array","items":{"$ref":"#/components/schemas/BulkUpdateError"}}},"required":["detail","errors"]},"BulkUpdateResponse":{"oneOf":[{"$ref":"#/components/schemas/BulkUpdateResult"},{"$ref":"#/components/schemas/BulkDryRun"}]},"BulkUpdateResult":{"type":"object","description":"The 200 body of an applied bulk update.","properties":{"updated":{"type":"integer","description":"Assets named in the request that changed."},"unchanged":{"type":"integer","description":"Assets named in the request that already matched."},"descendants_moved":{"type":"integer","description":"Descendants that moved to the new organization along with an asset in the request."},"parent_links_removed":{"type":"integer","description":"Parent edges removed because a move left them crossing organizations."}},"required":["descendants_moved","parent_links_removed","unchanged","updated"]},"BurpRawRequestResponse":{"type":"object","properties":{"req_resp":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}}},"required":["req_resp"]},"BurpRawRequestResponseMulti":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"burpRequestBase64":{"type":"string"},"burpResponseBase64":{"type":"string"},"finding":{"type":"integer","nullable":true}},"required":["burpRequestBase64","burpResponseBase64","id"]},"BurpRawRequestResponseMultiRequest":{"type":"object","properties":{"burpRequestBase64":{"type":"string","minLength":1},"burpResponseBase64":{"type":"string","minLength":1},"finding":{"type":"integer","nullable":true}},"required":["burpRequestBase64","burpResponseBase64"]},"BurpRawRequestResponseRequest":{"type":"object","properties":{"req_resp":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string","minLength":1}}}},"required":["req_resp"]},"CICDInfrastructure":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":200},"infrastructure_type":{"enum":["scm_server","build_server","orchestration"],"type":"string","description":"* `scm_server` - SCM Server\n* `build_server` - Build Server\n* `orchestration` - Orchestration Engine","x-spec-enum-id":"a1515c7dc5876b23"}},"required":["id","infrastructure_type","name"]},"CICDInfrastructureRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"infrastructure_type":{"enum":["scm_server","build_server","orchestration"],"type":"string","description":"* `scm_server` - SCM Server\n* `build_server` - Build Server\n* `orchestration` - Orchestration Engine","x-spec-enum-id":"a1515c7dc5876b23"}},"required":["infrastructure_type","name"]},"Campaign":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","readOnly":true},"action_type":{"enum":["upgrade","patch","configuration","code_change","rebuild","removal","certificate","permission","decommission","other"],"type":"string","x-spec-enum-id":"2130e743922de2cc","description":"What kind of change this is.\n\n* `upgrade` - Upgrade\n* `patch` - Patch\n* `configuration` - Configuration change\n* `code_change` - Code change\n* `rebuild` - Rebuild\n* `removal` - Removal\n* `certificate` - Certificate replacement\n* `permission` - Permission change\n* `decommission` - Decommission\n* `other` - Other"},"action_type_label":{"type":"string","readOnly":true},"subject":{"type":"string","description":"What the change is applied to, e.g. a component or a weakness class.","maxLength":512},"action_count":{"type":"integer","readOnly":true},"open_action_count":{"type":"integer","readOnly":true},"completed_action_count":{"type":"integer","readOnly":true},"asset_count":{"type":"integer","readOnly":true},"open_findings":{"type":"integer","readOnly":true},"overdue_count":{"type":"integer","readOnly":true},"due_date":{"type":"string","format":"date","readOnly":true},"max_risk":{"type":"string","readOnly":true},"max_risk_score":{"type":"integer","readOnly":true,"nullable":true},"sla_state":{"type":"string","readOnly":true},"progress":{"type":"integer","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["action_count","action_type","action_type_label","asset_count","completed_action_count","created_at","due_date","id","max_risk","max_risk_score","open_action_count","open_findings","overdue_count","progress","sla_state","subject","title","updated_at"]},"CapacityAnswersRequestRequest":{"type":"object","description":"The questionnaire, written whole.\n\nAnswers are replaced rather than merged: a half-updated cadence map projects a number\nnobody chose, and the form posts every row it rendered anyway.","properties":{"source_cadences":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CapacitySourceCadenceRequest"}},"coverage":{"enum":["all","most","pilot"],"type":"string","description":"* `all` - all\n* `most` - most\n* `pilot` - pilot","x-spec-enum-id":"07497e7e81a141dd"},"assets_in_trial":{"type":"integer","minimum":0,"nullable":true},"assets_total":{"type":"integer","minimum":0,"nullable":true},"planned_scan_types":{"type":"array","items":{"type":"string","minLength":1}},"retention_years":{"type":"integer","maximum":10,"minimum":1,"nullable":true}}},"CapacityCadenceChoice":{"type":"object","properties":{"value":{"type":"string"},"label":{"type":"string"},"needs_event_count":{"type":"boolean"}},"required":["label","needs_event_count","value"]},"CapacityObservedSource":{"type":"object","description":"A scan source seen in the metering ledger, used to pre-fill the questionnaire.","properties":{"scan_type":{"type":"string"},"runs_observed":{"type":"integer"},"median_submitted":{"type":"integer"},"first_seen":{"type":"string"},"last_seen":{"type":"string"}},"required":["first_seen","last_seen","median_submitted","runs_observed","scan_type"]},"CapacityProjection":{"type":"object","description":"The projection, with the ladder it was matched against.","properties":{"projection":{"type":"object","additionalProperties":{}},"ladder":{"type":"array","items":{"type":"object","additionalProperties":{}}},"observed":{"type":"object","additionalProperties":{}}},"required":["ladder","observed","projection"]},"CapacityQuestionnaire":{"type":"object","description":"Everything the questionnaire screen needs in one call.","properties":{"answers":{"type":"object","additionalProperties":{}},"observed_sources":{"type":"array","items":{"$ref":"#/components/schemas/CapacityObservedSource"}},"observation_days":{"type":"integer"},"cadence_choices":{"type":"array","items":{"$ref":"#/components/schemas/CapacityCadenceChoice"}},"coverage_choices":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["answers","cadence_choices","coverage_choices","observation_days","observed_sources"]},"CapacitySourceCadenceRequest":{"type":"object","description":"One scan source's stated production cadence.","properties":{"cadence":{"enum":["hourly","daily","weekly","monthly","ad_hoc","realtime","per_commit"],"type":"string","description":"* `hourly` - hourly\n* `daily` - daily\n* `weekly` - weekly\n* `monthly` - monthly\n* `ad_hoc` - ad_hoc\n* `realtime` - realtime\n* `per_commit` - per_commit","x-spec-enum-id":"adb6e87e81b29e99"},"events_per_week":{"type":"integer","maximum":100000,"minimum":1,"nullable":true}},"required":["cadence"]},"CeleryQueueTaskDetail":{"type":"object","properties":{"task_name":{"type":"string","readOnly":true},"count":{"type":"integer","readOnly":true},"oldest_position":{"type":"integer","readOnly":true},"newest_position":{"type":"integer","readOnly":true},"oldest_eta":{"type":"string","readOnly":true,"nullable":true},"newest_eta":{"type":"string","readOnly":true,"nullable":true},"earliest_expires":{"type":"string","readOnly":true,"nullable":true},"latest_expires":{"type":"string","readOnly":true,"nullable":true}},"required":["count","earliest_expires","latest_expires","newest_eta","newest_position","oldest_eta","oldest_position","task_name"]},"CeleryStatus":{"type":"object","properties":{"worker_status":{"type":"boolean","readOnly":true},"broker_status":{"type":"boolean","readOnly":true},"queue_length":{"type":"integer","readOnly":true,"nullable":true},"task_time_limit":{"type":"integer","readOnly":true,"nullable":true},"task_soft_time_limit":{"type":"integer","readOnly":true,"nullable":true},"task_default_expires":{"type":"integer","readOnly":true,"nullable":true}},"required":["broker_status","queue_length","task_default_expires","task_soft_time_limit","task_time_limit","worker_status"]},"ChangePlanApplyConflict":{"oneOf":[{"$ref":"#/components/schemas/PlanStale"},{"$ref":"#/components/schemas/PlanLocked"}]},"CheckRequest":{"type":"object","description":"``POST check`` — vet a proposed action synchronously.","properties":{"trace_id":{"type":"string","format":"uuid"},"action":{"type":"string","minLength":1,"maxLength":10000}},"required":["action","trace_id"]},"ClassicMigrationRequestRequest":{"type":"object","description":"Omit template_ids to migrate every classic template.","properties":{"template_ids":{"type":"array","items":{"type":"integer"}}}},"ClassicMigrationStatus":{"type":"object","description":"Drives the banner: how much is left to carry across.","properties":{"classic_template_count":{"type":"integer"},"unmigrated_template_count":{"type":"integer"},"removal_version":{"type":"string"},"removal_date":{"type":"string"}},"required":["classic_template_count","removal_date","removal_version","unmigrated_template_count"]},"ClassicMigrationSummary":{"type":"object","properties":{"migrated":{"type":"integer"},"already_migrated":{"type":"integer"},"failed":{"type":"integer"},"templates":{"type":"array","items":{"$ref":"#/components/schemas/ClassicTemplateOutcome"}}},"required":["already_migrated","failed","migrated","templates"]},"ClassicTemplateOutcome":{"type":"object","description":"One classic template's fate, with a per-widget breakdown so the UI can show\nexactly what did and did not carry across rather than a bare success count.","properties":{"source_id":{"type":"integer"},"source_name":{"type":"string"},"status":{"enum":["migrated","already_migrated","failed"],"type":"string","description":"* `migrated` - migrated\n* `already_migrated` - already_migrated\n* `failed` - failed","x-spec-enum-id":"78c0779789874548"},"target_id":{"type":"integer","nullable":true},"detail":{"type":"string"},"converted_count":{"type":"integer"},"skipped_count":{"type":"integer"},"widgets":{"type":"array","items":{"$ref":"#/components/schemas/ClassicWidgetOutcome"}}},"required":["converted_count","detail","skipped_count","source_id","source_name","status","target_id","widgets"]},"ClassicWidgetOutcome":{"type":"object","description":"One classic widget's fate during a migration run.","properties":{"widget":{"type":"string"},"status":{"enum":["converted","skipped"],"type":"string","description":"* `converted` - converted\n* `skipped` - skipped","x-spec-enum-id":"3bd8b246985b481e"},"detail":{"type":"string"},"block_name":{"type":"string"}},"required":["block_name","detail","status","widget"]},"ClassifierCall":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"use":{"type":"string","readOnly":true},"feature":{"type":"string","readOnly":true},"backend":{"type":"string","readOnly":true},"model":{"type":"string","readOnly":true},"questions":{"type":"integer","readOnly":true},"confidence":{"type":"number","format":"double","readOnly":true,"nullable":true},"accepted":{"type":"boolean","readOnly":true},"succeeded":{"type":"boolean","readOnly":true},"error":{"type":"string","readOnly":true},"latency_ms":{"type":"integer","readOnly":true},"input_tokens":{"type":"integer","readOnly":true,"nullable":true},"output_tokens":{"type":"integer","readOnly":true,"nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true}},"required":["accepted","backend","confidence","created_at","error","feature","id","input_tokens","latency_ms","model","output_tokens","questions","succeeded","use"]},"ClassifierSettings":{"type":"object","description":"The Jev connection. The API key is write-only; reads say only whether one is stored.","properties":{"has_jev_api_key":{"type":"boolean","readOnly":true},"jev_base_url":{"oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]},"jev_model":{"type":"string","maxLength":64},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["has_jev_api_key","updated_at"]},"ClassifierUse":{"type":"object","description":"One registered use, with its backend and threshold. The use's description and whether it\ncarries customer data come from code; only the backend and threshold are editable.","properties":{"use":{"type":"string","readOnly":true},"title":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true},"customer_data":{"type":"boolean","readOnly":true},"allowed_backends":{"type":"array","items":{"type":"string"},"readOnly":true},"backend":{"enum":["off","claude","jev"],"type":"string","description":"* `off` - Off\n* `claude` - Claude\n* `jev` - Jev","x-spec-enum-id":"b3d270b088e453f2"},"min_confidence":{"type":"number","format":"double","maximum":1.0,"minimum":0.0},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["allowed_backends","customer_data","description","title","updated_at","use"]},"CmmcAssessment":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","description":"The product (system) being assessed"},"catalog":{"type":"integer","title":"Control Catalog","description":"The 800-171 catalog this assessment scores against"},"level":{"enum":["1","2","3"],"type":"string","x-spec-enum-id":"117ff2bd42599a29","title":"CMMC Level","description":"The CMMC level being assessed\n\n* `1` - Level 1\n* `2` - Level 2\n* `3` - Level 3"},"status":{"enum":["in_progress","conditional","final","expired"],"type":"string","x-spec-enum-id":"049f865152329835","readOnly":true,"description":"Assessment lifecycle status\n\n* `in_progress` - In progress\n* `conditional` - Conditional\n* `final` - Final\n* `expired` - Expired (conditional closeout lapsed)"},"assessment_date":{"type":"string","format":"date","nullable":true,"description":"The date of the assessment"},"conditional_since":{"type":"string","format":"date","readOnly":true,"nullable":true,"description":"When conditional status began; the 180-day POA&M closeout clock runs from here"},"summary":{"type":"object","additionalProperties":{},"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["catalog","conditional_since","created_at","id","product","status","summary","updated_at"]},"CmmcAssessmentRequest":{"type":"object","description":"Base serializer for all models.","properties":{"product":{"type":"integer","description":"The product (system) being assessed"},"catalog":{"type":"integer","title":"Control Catalog","description":"The 800-171 catalog this assessment scores against"},"level":{"enum":["1","2","3"],"type":"string","x-spec-enum-id":"117ff2bd42599a29","title":"CMMC Level","description":"The CMMC level being assessed\n\n* `1` - Level 1\n* `2` - Level 2\n* `3` - Level 3"},"assessment_date":{"type":"string","format":"date","nullable":true,"description":"The date of the assessment"}},"required":["catalog","product"]},"CmmcRequirementResult":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"assessment":{"type":"integer","description":"The assessment this result belongs to"},"control":{"type":"integer","title":"Control / Requirement","description":"The 800-171 requirement being scored"},"control_label":{"type":"string","readOnly":true},"control_title":{"type":"string","readOnly":true},"sprs_weight":{"type":"integer","readOnly":true},"sprs_partial_weight":{"type":"integer","nullable":true,"readOnly":true},"sprs_partial_note":{"type":"string","readOnly":true},"has_posture_evidence":{"type":"boolean","description":"Whether the assessment's posture_evidence action speaks to this requirement (3.4.1, 3.4.2, 3.4.6,\n3.4.7), so the page can offer it without computing the evidence for every row it shows.","readOnly":true},"status":{"enum":["met","not_met","na","planned"],"type":"string","x-spec-enum-id":"d36b34e3703ead72","title":"Result","description":"Whether the requirement is met, not met, not applicable, or planned on a POA&M\n\n* `met` - Met\n* `not_met` - Not met\n* `na` - Not applicable\n* `planned` - Planned (on POA&M)"},"partial_credit":{"type":"boolean","description":"The requirement's documented partial condition holds (for 3.13.11: encryption is employed but is not FIPS-validated), so the reduced deduction from the control's metadata applies. Ignored for requirements whose methodology defines no partial credit."},"notes":{"type":"string","description":"Assessor notes for this requirement"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["assessment","control","control_label","control_title","created_at","has_posture_evidence","id","sprs_partial_note","sprs_partial_weight","sprs_weight","updated_at"]},"CmmcRequirementResultRequest":{"type":"object","description":"Base serializer for all models.","properties":{"assessment":{"type":"integer","description":"The assessment this result belongs to"},"control":{"type":"integer","title":"Control / Requirement","description":"The 800-171 requirement being scored"},"status":{"enum":["met","not_met","na","planned"],"type":"string","x-spec-enum-id":"d36b34e3703ead72","title":"Result","description":"Whether the requirement is met, not met, not applicable, or planned on a POA&M\n\n* `met` - Met\n* `not_met` - Not met\n* `na` - Not applicable\n* `planned` - Planned (on POA&M)"},"partial_credit":{"type":"boolean","description":"The requirement's documented partial condition holds (for 3.13.11: encryption is employed but is not FIPS-validated), so the reduced deduction from the control's metadata applies. Ignored for requirements whose methodology defines no partial credit."},"notes":{"type":"string","description":"Assessor notes for this requirement"}},"required":["assessment","control"]},"CommandCenterSceneRequestRequest":{"type":"object","properties":{"window_days":{"enum":[7,30,90,365],"type":"integer","description":"* `7` - 7\n* `30` - 30\n* `90` - 90\n* `365` - 365","x-spec-enum-id":"e3be5ce60fdca6fe"},"scope":{"enum":["authorized","global"],"type":"string","description":"* `authorized` - authorized\n* `global` - global","x-spec-enum-id":"277897e33919e7cc"},"product_ids":{"type":"array","items":{"type":"integer"}},"as_of":{"type":"string","format":"date","nullable":true}}},"CommentRequestRequest":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":10000}},"required":["body"]},"ComplianceSystemProfile":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"enabled":{"type":"boolean","description":"Master switch: no POA&M sync or exports run while disabled"},"poam_prefix":{"type":"string","title":"POA&M ID Prefix","description":"Prefix for POA&M display IDs, e.g. 'V' produces V-1, V-2, ...","maxLength":10},"csp_name":{"type":"string","description":"The cloud service provider name, as it should appear on deliverables","maxLength":300},"system_name":{"type":"string","description":"The system / cloud service offering name, as it should appear on deliverables","maxLength":300},"system_id":{"type":"string","title":"System Identifier","description":"The FedRAMP (or agency) system identifier for OSCAL system-id","maxLength":100},"impact_level":{"enum":["LI-SaaS","Low","Moderate","High",""],"type":"string","x-spec-enum-id":"aacc09af6f4563f1","description":"The FedRAMP impact level, as it appears on the POA&M workbook header\n\n* `LI-SaaS` - LI-SaaS\n* `Low` - Low\n* `Moderate` - Moderate\n* `High` - High"},"oscal_ssp_href":{"type":"string","title":"OSCAL SSP Reference","description":"href for the OSCAL POA&M import-ssp reference","maxLength":500},"oscal_ssp_uuid":{"type":"string","format":"uuid","nullable":true,"description":"UUID of the system security plan this POA&M belongs to, if known"},"oscal_version_pin":{"type":"string","description":"The OSCAL version exports target (FedRAMP pins an older version than NIST's latest)","maxLength":20},"default_poc":{"type":"string","title":"Default Point of Contact","description":"Default Point of Contact for new POA&M items","maxLength":300},"scan_item_policy":{"enum":["all_open","past_due_only"],"type":"string","x-spec-enum-id":"c504c2edc0f29589","description":"Which scan-derived items appear on exported POA&M deliverables\n\n* `all_open` - Include all open items\n* `past_due_only` - Include only past-due scan items (FedRAMP ConMon minimum)"},"auto_sync":{"type":"boolean","description":"Keep POA&M items in sync with findings automatically"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"},"product":{"type":"integer","description":"The product this compliance profile configures"},"default_scan_controls":{"type":"array","items":{"type":"integer","title":"Default Scan Controls"},"description":"Controls assigned to scan-derived POA&M items by default (FedRAMP practice: RA-5)"},"config_test_types":{"type":"array","items":{"type":"integer","title":"Configuration Test Types"},"title":"Configuration Test Types","description":"Findings from these scanner types are treated as configuration findings (Configuration Findings tab plus one consolidated CM-6 item)"}},"required":["created_at","id","product","updated_at"]},"ComplianceSystemProfileRequest":{"type":"object","description":"Base serializer for all models.","properties":{"enabled":{"type":"boolean","description":"Master switch: no POA&M sync or exports run while disabled"},"poam_prefix":{"type":"string","minLength":1,"title":"POA&M ID Prefix","description":"Prefix for POA&M display IDs, e.g. 'V' produces V-1, V-2, ...","maxLength":10},"csp_name":{"type":"string","description":"The cloud service provider name, as it should appear on deliverables","maxLength":300},"system_name":{"type":"string","description":"The system / cloud service offering name, as it should appear on deliverables","maxLength":300},"system_id":{"type":"string","title":"System Identifier","description":"The FedRAMP (or agency) system identifier for OSCAL system-id","maxLength":100},"impact_level":{"enum":["LI-SaaS","Low","Moderate","High",""],"type":"string","x-spec-enum-id":"aacc09af6f4563f1","description":"The FedRAMP impact level, as it appears on the POA&M workbook header\n\n* `LI-SaaS` - LI-SaaS\n* `Low` - Low\n* `Moderate` - Moderate\n* `High` - High"},"oscal_ssp_href":{"type":"string","title":"OSCAL SSP Reference","description":"href for the OSCAL POA&M import-ssp reference","maxLength":500},"oscal_ssp_uuid":{"type":"string","format":"uuid","nullable":true,"description":"UUID of the system security plan this POA&M belongs to, if known"},"oscal_version_pin":{"type":"string","minLength":1,"description":"The OSCAL version exports target (FedRAMP pins an older version than NIST's latest)","maxLength":20},"default_poc":{"type":"string","title":"Default Point of Contact","description":"Default Point of Contact for new POA&M items","maxLength":300},"scan_item_policy":{"enum":["all_open","past_due_only"],"type":"string","x-spec-enum-id":"c504c2edc0f29589","description":"Which scan-derived items appear on exported POA&M deliverables\n\n* `all_open` - Include all open items\n* `past_due_only` - Include only past-due scan items (FedRAMP ConMon minimum)"},"auto_sync":{"type":"boolean","description":"Keep POA&M items in sync with findings automatically"},"product":{"type":"integer","description":"The product this compliance profile configures"},"default_scan_controls":{"type":"array","items":{"type":"integer","title":"Default Scan Controls"},"description":"Controls assigned to scan-derived POA&M items by default (FedRAMP practice: RA-5)"},"config_test_types":{"type":"array","items":{"type":"integer","title":"Configuration Test Types"},"title":"Configuration Test Types","description":"Findings from these scanner types are treated as configuration findings (Configuration Findings tab plus one consolidated CM-6 item)"}},"required":["product"]},"ConflictDetail":{"type":"object","description":"The 409 body of ``POST deliveries/{id}/resend/``.","properties":{"detail":{"type":"string"}},"required":["detail"]},"ConnectorPushResult":{"type":"object","description":"What an explicitly requested ``push_to_connector`` did (the ``connector_push_result`` field).","properties":{"dispatched":{"type":"boolean","description":"True when the finding or finding group was handed to at least one downstream connector. The ticket itself is created or updated afterwards by the connector service, so true does not mean a ticket exists yet."},"reason":{"type":"string","enum":["disabled","no_assignment","not_found","not_eligible","send_failed",null],"nullable":true,"description":"Why nothing was sent, or null when dispatched is true. no_assignment: no issue tracker assignment covers the engagement or asset. disabled: Downstream Connectors are off. send_failed: the push could not be started. not_found: the object no longer exists. not_eligible: no assignment takes this push."},"failed_count":{"type":"integer","minimum":0,"description":"How many connectors the push could not be started on. With dispatched true, the push reached some connectors and failed on others."},"as_group":{"type":"boolean","description":"True when a finding in a finding group was pushed as its group, so its ticket is the group's."}},"required":["as_group","dispatched","failed_count","reason"]},"ContainerImage":{"type":"object","description":"Serializer for the ContainerImage model with primary keys for related objects.","properties":{"id":{"type":"integer","readOnly":true},"string":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true},"tags":{"type":"array","items":{"type":"string"}},"digest_known":{"type":"boolean","readOnly":true},"purl":{"type":"string","readOnly":true},"registry":{"type":"string","description":"The registry host, normalised: index.docker.io for Docker Hub, lower-case, no scheme.","maxLength":255},"repository":{"type":"string","description":"The path within the registry, e.g. library/nginx or acme/payments-api.","maxLength":512},"digest":{"type":"string","description":"The manifest digest (sha256: plus 64 hex characters). The identity when present.","maxLength":71},"tag":{"type":"string","description":"The tag as reported. Descriptive when a digest is present; the identity when it is not.","maxLength":128},"oci_source":{"type":"string","description":"The org.opencontainers.image.source label: the repository the image was built from.","maxLength":2048},"oci_revision":{"type":"string","description":"The org.opencontainers.image.revision label: the commit the image was built from.","maxLength":128}},"required":["digest_known","id","purl","registry","repository","string","type"]},"ControlCatalog":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"The name of the control catalog, e.g. 'NIST SP 800-53'","maxLength":300},"version":{"type":"string","description":"The catalog version, e.g. 'Rev 5.2.0' or '5.2.0'","maxLength":50},"source_url":{"description":"Where this catalog was sourced from","oneOf":[{"type":"string","format":"uri","maxLength":500},{"type":"string","maxLength":0}]},"oscal_version":{"type":"string","description":"The OSCAL schema version the source document declared","maxLength":20},"catalog_uuid":{"type":"string","format":"uuid","nullable":true,"description":"The uuid from the OSCAL catalog document, used for export back-references"},"metadata":{"description":"Catalog-level OSCAL properties and links, including regulatory classification"},"enabled":{"type":"boolean","description":"Whether this catalog is available for use"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["created_at","id","name","updated_at","version"]},"ConvertFromV1RequestRequest":{"type":"object","description":"The body of ``POST rules/convert_from_v1/``.","properties":{"rule_ids":{"type":"array","items":{"type":"integer"},"description":"The Rules Engine 1.0 rule ids to convert. Omit to convert every 1.0 rule"},"dry_run":{"type":"boolean","default":true,"description":"Report what would happen and write nothing"},"overwrite":{"type":"boolean","default":false,"description":"Replace the graph of an already-converted rule, bumping its version"}}},"ConvertFromV1Row":{"type":"object","description":"One row of the ``POST rules/convert_from_v1/`` report.","properties":{"rule_id":{"type":"integer","description":"The Rules Engine 1.0 rule this row is about"},"label":{"type":"string","description":"The Rules Engine 1.0 rule's label"},"status":{"type":"string","description":"converted, skipped-already-converted, or failed"},"v2_rule_id":{"type":"integer","nullable":true,"description":"The Triage Engine rule, once one exists"},"name":{"type":"string","description":"The name the Triage Engine rule has, or would be given"},"graph":{"nullable":true,"description":"The graph the conversion produced"},"problems":{"type":"array","items":{"type":"string"},"description":"Any problem means the rule was not converted"},"warnings":{"type":"array","items":{"type":"string"},"description":"Converted, but the semantics moved and are worth reviewing"}},"required":["graph","label","name","problems","rule_id","status","v2_rule_id","warnings"]},"CopyGroupRequestRequest":{"type":"object","description":"Where a copied template should land, and the term it is about.","properties":{"name":{"type":"string"},"product":{"type":"integer","nullable":true},"product_type":{"type":"integer","nullable":true},"fill":{"type":"string","maxLength":255}}},"CreateCaseFromAdvisoriesRequestRequest":{"type":"object","description":"Open a case straight off the triage queue, matches or no matches.","properties":{"advisory_ids":{"type":"array","items":{"type":"integer"}},"title":{"type":"string"},"mitigation_priority":{"enum":["p0k_crisis","p1_high","p2_medium","p3_low",null],"type":"string","description":"* `p0k_crisis` - P0/K — Crisis\n* `p1_high` - P1 — High\n* `p2_medium` - P2 — Medium\n* `p3_low` - P3 — Low","x-spec-enum-id":"4cf17c56b9aa4d22","nullable":true},"analysis_notes":{"type":"string","default":""}},"required":["advisory_ids"]},"CreateCaseRequestRequest":{"type":"object","description":"Group a set of matches into a new case.","properties":{"match_ids":{"type":"array","items":{"type":"integer"}},"title":{"type":"string"},"mitigation_priority":{"enum":["p0k_crisis","p1_high","p2_medium","p3_low",null],"type":"string","description":"* `p0k_crisis` - P0/K — Crisis\n* `p1_high` - P1 — High\n* `p2_medium` - P2 — Medium\n* `p3_low` - P3 — Low","x-spec-enum-id":"4cf17c56b9aa4d22","nullable":true},"analysis_notes":{"type":"string","default":""}},"required":["match_ids"]},"CriticalitySLAMapping":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"business_criticality":{"enum":["very high","high","medium","low","very low","none"],"type":"string","x-spec-enum-id":"ef412461eb271471","description":"The product business-criticality band this mapping applies to.\n\n* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None"},"enabled":{"type":"boolean","description":"When off, this mapping is ignored and no product is reassigned from it."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the mapping was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the mapping was updated"},"sla_configuration":{"type":"integer","description":"The SLA configuration products in this criticality band should be moved to."}},"required":["business_criticality","created_at","id","sla_configuration","updated_at"]},"CriticalitySLAMappingRequest":{"type":"object","description":"Base serializer for all models.","properties":{"business_criticality":{"enum":["very high","high","medium","low","very low","none"],"type":"string","x-spec-enum-id":"ef412461eb271471","description":"The product business-criticality band this mapping applies to.\n\n* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None"},"enabled":{"type":"boolean","description":"When off, this mapping is ignored and no product is reassigned from it."},"sla_configuration":{"type":"integer","description":"The SLA configuration products in this criticality band should be moved to."}},"required":["business_criticality","sla_configuration"]},"CustomFieldDefinition":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"entity_type":{"enum":["finding","product","product_type","engagement","test","risk_acceptance"],"type":"string","x-spec-enum-id":"a16da54e71f2f35c","default":"finding","description":"The object type this custom field applies to\n\n* `finding` - Finding\n* `product` - Asset\n* `product_type` - Organization\n* `engagement` - Engagement\n* `test` - Test\n* `risk_acceptance` - Risk Acceptance"},"name":{"type":"string","description":"The stable identifier used in URLs and as the column/filter/sort key (a slug)","pattern":"^[a-z0-9_]+$","maxLength":120},"label":{"type":"string","description":"The human-readable display label shown as the column header and field label; falls back to the name when blank","maxLength":120},"field_type":{"enum":["text","integer","decimal","date","boolean","single_select","multi_select"],"type":"string","x-spec-enum-id":"973e59d42cfa7372","title":"Data Type","description":"The datatype used to validate values and to filter and sort the field\n\n* `text` - Text\n* `integer` - Integer\n* `decimal` - Decimal\n* `date` - Date\n* `boolean` - Boolean\n* `single_select` - Single select\n* `multi_select` - Multi select"},"options":{"description":"Allowed values for single/multi-select fields; ignored for other types"},"required":{"type":"boolean","description":"Whether a value for this field is required on its entity"},"created":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the definition was created"},"updated":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the definition was updated"}},"required":["created","id","name","updated"]},"CustomFieldDefinitionRequest":{"type":"object","properties":{"entity_type":{"enum":["finding","product","product_type","engagement","test","risk_acceptance"],"type":"string","x-spec-enum-id":"a16da54e71f2f35c","default":"finding","description":"The object type this custom field applies to\n\n* `finding` - Finding\n* `product` - Asset\n* `product_type` - Organization\n* `engagement` - Engagement\n* `test` - Test\n* `risk_acceptance` - Risk Acceptance"},"name":{"type":"string","minLength":1,"description":"The stable identifier used in URLs and as the column/filter/sort key (a slug)","pattern":"^[a-z0-9_]+$","maxLength":120},"label":{"type":"string","description":"The human-readable display label shown as the column header and field label; falls back to the name when blank","maxLength":120},"field_type":{"enum":["text","integer","decimal","date","boolean","single_select","multi_select"],"type":"string","x-spec-enum-id":"973e59d42cfa7372","title":"Data Type","description":"The datatype used to validate values and to filter and sort the field\n\n* `text` - Text\n* `integer` - Integer\n* `decimal` - Decimal\n* `date` - Date\n* `boolean` - Boolean\n* `single_select` - Single select\n* `multi_select` - Multi select"},"options":{"description":"Allowed values for single/multi-select fields; ignored for other types"},"required":{"type":"boolean","description":"Whether a value for this field is required on its entity"}},"required":["name"]},"CustomFieldValue":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"definition":{"type":"integer"},"finding":{"type":"integer","nullable":true},"product":{"type":"integer","nullable":true},"product_type":{"type":"integer","nullable":true},"engagement":{"type":"integer","nullable":true},"test":{"type":"integer","nullable":true},"risk_acceptance":{"type":"integer","nullable":true},"value":{"type":"string","description":"The raw value as entered; the canonical form that always round-trips"},"value_options":{"description":"Selected options for multi-select fields"},"created":{"type":"string","format":"date-time","readOnly":true},"updated":{"type":"string","format":"date-time","readOnly":true}},"required":["created","definition","id","updated"]},"CustomFieldValueMeta":{"type":"object","description":"A ``{\"name\", \"value\"}`` shape, used to document the ``*_meta`` fields in the OpenAPI schema.\n\nThe ``*_meta`` fields keep their historical name/value wire shape; this serializer describes it\nfor ``@extend_schema_field``. It is not used to produce ``*_meta`` data (see\n``meta_field_representation``).","properties":{"name":{"type":"string","readOnly":true},"value":{"type":"string","description":"Given the *incoming* primitive data, return the value for this field\nthat should be validated and transformed to a native value.","readOnly":true}},"required":["name","value"]},"CustomFieldValueRequest":{"type":"object","properties":{"definition":{"type":"integer"},"finding":{"type":"integer","nullable":true},"product":{"type":"integer","nullable":true},"product_type":{"type":"integer","nullable":true},"engagement":{"type":"integer","nullable":true},"test":{"type":"integer","nullable":true},"risk_acceptance":{"type":"integer","nullable":true},"value":{"type":"string","description":"The raw value as entered; the canonical form that always round-trips"},"value_options":{"description":"Selected options for multi-select fields"}},"required":["definition"]},"DashboardConfiguration":{"type":"object","properties":{"user":{"type":"array","items":{"type":"integer","title":"Configuration Owner"},"title":"Configuration Owner"},"tiles":{"type":"array","items":{"$ref":"#/components/schemas/DashboardTile"},"readOnly":true},"graphs":{"type":"boolean","title":"Show Graphs"},"tables":{"type":"boolean","title":"Show Tables"},"questionnaires":{"type":"boolean","title":"Show Questionaires"},"prefetch":{"type":"object","properties":{"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["tiles","user"]},"DashboardConfigurationRequest":{"type":"object","properties":{"user":{"type":"array","items":{"type":"integer","title":"Configuration Owner"},"title":"Configuration Owner"},"graphs":{"type":"boolean","title":"Show Graphs"},"tables":{"type":"boolean","title":"Show Tables"},"questionnaires":{"type":"boolean","title":"Show Questionaires"}},"required":["user"]},"DashboardInsightsPlotRequestRequest":{"type":"object","properties":{"plot":{"type":"string","minLength":1},"date_range":{"type":"integer"}},"required":["plot"]},"DashboardLayout":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":100},"is_shared":{"type":"boolean","title":"Shared","description":"If true, this layout is published as a template available to every user."},"is_collaborative":{"type":"boolean","title":"Collaborative","description":"When enabled, other users can make modifications to this configuration that all users using it will see."},"is_starter":{"type":"boolean","readOnly":true,"title":"Starter","description":"Marks the system-seeded \"Default Dashboard\" template used for new users."},"is_default":{"type":"boolean","readOnly":true},"is_owned":{"type":"boolean","readOnly":true},"can_edit":{"type":"boolean","readOnly":true},"can_manage":{"type":"boolean","readOnly":true},"is_catalog":{"type":"boolean","description":"True iff the layout is a curated catalog entry.\n\nThe frontend uses this to distinguish curated showcase / starter\ntemplates from layouts another user happened to publish as\nshared. Both surfaces appear under the same \"shared\" endpoint;\nthe Add Existing Widget picker only sources from catalog\nentries so a user-published team layout's widgets don't pollute\nthe curated gallery.\n\nWe cannot use ``user IS NULL`` as the discriminator — the create\npath (``DashboardLayoutViewSet.perform_create``) explicitly nulls\nthe owner whenever ``is_shared=True`` so the shared-name unique\nconstraint isn't tied to a particular author. That means *any*\nshared layout posted via the API also ends up with ``user=None``,\nnot just the migration-seeded catalog rows.\n\nInstead we lean on the catalog registry as the source of truth.\nThe catalog's display names are the canonical identifiers; the\nunique-on-(name) constraint scoped to ``is_shared=True`` ensures\na coincidental collision (user publishes \"Default Dashboard\"\nthemselves) is impossible at the DB level.","readOnly":true},"description":{"type":"string","readOnly":true},"category":{"type":"string","readOnly":true},"icon":{"type":"string","readOnly":true},"layout":{"description":"Map of widget id -> grid position {x, y, w, h, min_w, min_h}."},"widgets":{"description":"Ordered list of widget configurations (type, title, refresh_interval, config)."},"settings":{"description":"Layout-level options such as grid density and column count."},"cloned_from":{"type":"integer","readOnly":true,"nullable":true,"description":"Reference to the layout this one was cloned from, if any."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created."},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated."},"etag":{"type":"string","description":"Opaque version token for optimistic concurrency on this row.\n\nDerived from ``updated_at`` (``auto_now``, so every ORM save and the Go\ncore's ``UPDATE ... updated_at = now()`` both move it), never stored.\nPostgres keeps microseconds, so two saves of the same row in the same\nrequest cycle still produce distinct tags. Quoted, so the value is a\nvalid RFC 7232 strong entity-tag and can go straight into ``If-Match``.","readOnly":true}},"required":["can_edit","can_manage","category","cloned_from","created_at","description","etag","icon","id","is_catalog","is_default","is_owned","is_starter","name","updated_at"]},"DashboardLayoutCloneRequestRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Name for the clone. Defaults to \"Copy of <source name>\"."}}},"DashboardLayoutRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"is_shared":{"type":"boolean","title":"Shared","description":"If true, this layout is published as a template available to every user."},"is_collaborative":{"type":"boolean","title":"Collaborative","description":"When enabled, other users can make modifications to this configuration that all users using it will see."},"layout":{"description":"Map of widget id -> grid position {x, y, w, h, min_w, min_h}."},"widgets":{"description":"Ordered list of widget configurations (type, title, refresh_interval, config)."},"settings":{"description":"Layout-level options such as grid density and column count."}},"required":["name"]},"DashboardLayoutsForCurrentUserResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/DashboardLayout"}},"default_id":{"type":"integer","nullable":true,"description":"Layout id the UI should render by default. Null if the caller has no owned layouts."},"shared_default_id":{"type":"integer","nullable":true,"description":"Admin-designated global default layout id. Null if none is set."}},"required":["default_id","results","shared_default_id"]},"DashboardSharedDefaultResponse":{"type":"object","properties":{"layout_id":{"type":"integer","nullable":true},"name":{"type":"string","nullable":true}},"required":["layout_id","name"]},"DashboardTile":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"model":{"enum":["product","engagement","test","finding","endpoint","sla","scan-time","prod-grade",""],"type":"string","x-spec-enum-id":"a6e596d1d03709b5","title":"Tile Type","description":"The type of data to display within this tile.\n\n* `product` - Product\n* `engagement` - Engagement\n* `test` - Test\n* `finding` - Finding\n* `endpoint` - Endpoint\n* `sla` - SLA Violation\n* `scan-time` - Scan Time Violation\n* `prod-grade` - Product Grade"},"filters":{"nullable":true,"title":"Tile Filters","description":"The filters to obtain the data count for this tile."},"icon":{"enum":["align-left","box-archive","bars","ban","bolt","bug","bullseye","calendar-days","certificate","check","code","gear","clock","download","circle-exclamation","file","filter","fire-extinguisher","flag","house","circle-info","lock","circle-question","magnifying-glass","list-check","lock-open","user",""],"type":"string","x-spec-enum-id":"c3556497146d88cf","title":"Tile Icon","description":"The icon to display within this tile.\n\n* `align-left` - Align Left\n* `box-archive` - Archive\n* `bars` - Bars\n* `ban` - Ban\n* `bolt` - Bolt\n* `bug` - Bug\n* `bullseye` - Bullseye\n* `calendar-days` - Calendar\n* `certificate` - Certificate\n* `check` - Check\n* `code` - Code\n* `gear` - Cog\n* `clock` - Clock\n* `download` - Download\n* `circle-exclamation` - Exclamation\n* `file` - File\n* `filter` - Filter\n* `fire-extinguisher` - Fire Extinguisher\n* `flag` - Flag\n* `house` - Home\n* `circle-info` - Info\n* `lock` - Lock\n* `circle-question` - Question\n* `magnifying-glass` - Search\n* `list-check` - Tasks\n* `lock-open` - Unlock\n* `user` - User"},"header":{"type":"string","title":"Tile Header","description":"The header text to display under the count of this tile.","maxLength":64},"footer":{"type":"string","title":"Tile Footer","description":"The footer text to display in the button of this tile.","maxLength":64},"color":{"enum":["red","orange","yellow","green","teal","cyan","blue","indigo","purple","pink","dark","light",""],"type":"string","x-spec-enum-id":"9c9a36b0f59676ad","title":"Tile Color","description":"The color of this tile (if dynamic tile is enabled, selected color will be ignored).\n\n* `red` - Red\n* `orange` - Orange\n* `yellow` - Yellow\n* `green` - Green\n* `teal` - Teal\n* `cyan` - Cyan\n* `blue` - Blue\n* `indigo` - Indigo\n* `purple` - Purple\n* `pink` - Pink\n* `dark` - Dark\n* `light` - Light"},"dynamic":{"type":"boolean","title":"Dynamic Color Tile","description":"When selected, the color of this tile will dynamically change based on the minimum and maximum threshold."},"minimum":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"title":"Dynamic Color Minimum","description":"The minimum acceptable threshold for this tile's count (i.e. green in color)."},"maximum":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"title":"Dynamic Color Maximum","description":"The maximum acceptable threshold for this tile's count (i.e. red in color)."}},"required":["id"]},"DashboardTileRequest":{"type":"object","properties":{"model":{"enum":["product","engagement","test","finding","endpoint","sla","scan-time","prod-grade",""],"type":"string","x-spec-enum-id":"a6e596d1d03709b5","title":"Tile Type","description":"The type of data to display within this tile.\n\n* `product` - Product\n* `engagement` - Engagement\n* `test` - Test\n* `finding` - Finding\n* `endpoint` - Endpoint\n* `sla` - SLA Violation\n* `scan-time` - Scan Time Violation\n* `prod-grade` - Product Grade"},"filters":{"nullable":true,"title":"Tile Filters","description":"The filters to obtain the data count for this tile."},"icon":{"enum":["align-left","box-archive","bars","ban","bolt","bug","bullseye","calendar-days","certificate","check","code","gear","clock","download","circle-exclamation","file","filter","fire-extinguisher","flag","house","circle-info","lock","circle-question","magnifying-glass","list-check","lock-open","user",""],"type":"string","x-spec-enum-id":"c3556497146d88cf","title":"Tile Icon","description":"The icon to display within this tile.\n\n* `align-left` - Align Left\n* `box-archive` - Archive\n* `bars` - Bars\n* `ban` - Ban\n* `bolt` - Bolt\n* `bug` - Bug\n* `bullseye` - Bullseye\n* `calendar-days` - Calendar\n* `certificate` - Certificate\n* `check` - Check\n* `code` - Code\n* `gear` - Cog\n* `clock` - Clock\n* `download` - Download\n* `circle-exclamation` - Exclamation\n* `file` - File\n* `filter` - Filter\n* `fire-extinguisher` - Fire Extinguisher\n* `flag` - Flag\n* `house` - Home\n* `circle-info` - Info\n* `lock` - Lock\n* `circle-question` - Question\n* `magnifying-glass` - Search\n* `list-check` - Tasks\n* `lock-open` - Unlock\n* `user` - User"},"header":{"type":"string","title":"Tile Header","description":"The header text to display under the count of this tile.","maxLength":64},"footer":{"type":"string","title":"Tile Footer","description":"The footer text to display in the button of this tile.","maxLength":64},"color":{"enum":["red","orange","yellow","green","teal","cyan","blue","indigo","purple","pink","dark","light",""],"type":"string","x-spec-enum-id":"9c9a36b0f59676ad","title":"Tile Color","description":"The color of this tile (if dynamic tile is enabled, selected color will be ignored).\n\n* `red` - Red\n* `orange` - Orange\n* `yellow` - Yellow\n* `green` - Green\n* `teal` - Teal\n* `cyan` - Cyan\n* `blue` - Blue\n* `indigo` - Indigo\n* `purple` - Purple\n* `pink` - Pink\n* `dark` - Dark\n* `light` - Light"},"dynamic":{"type":"boolean","title":"Dynamic Color Tile","description":"When selected, the color of this tile will dynamically change based on the minimum and maximum threshold."},"minimum":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"title":"Dynamic Color Minimum","description":"The minimum acceptable threshold for this tile's count (i.e. green in color)."},"maximum":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"title":"Dynamic Color Maximum","description":"The maximum acceptable threshold for this tile's count (i.e. red in color)."}}},"DedupeFunnelRequestRequest":{"type":"object","properties":{"window_days":{"enum":[7,30,90],"type":"integer","description":"* `7` - 7\n* `30` - 30\n* `90` - 90","x-spec-enum-id":"2e5d1943e8d2dd5e"},"product_ids":{"type":"array","items":{"type":"integer"}},"scope":{"enum":["authorized","global"],"type":"string","description":"* `authorized` - authorized\n* `global` - global","x-spec-enum-id":"277897e33919e7cc"}}},"DeletePreview":{"type":"object","properties":{"model":{"type":"string","readOnly":true},"id":{"type":"integer","readOnly":true,"nullable":true},"name":{"type":"string","readOnly":true}},"required":["id","model","name"]},"DeltaStatistics":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/SeverityStatusStatistics"},"closed":{"$ref":"#/components/schemas/SeverityStatusStatistics"},"reactivated":{"$ref":"#/components/schemas/SeverityStatusStatistics"},"untouched":{"$ref":"#/components/schemas/SeverityStatusStatistics"}},"required":["closed","created","reactivated","untouched"]},"DeltaStatisticsRequest":{"type":"object","properties":{"created":{"$ref":"#/components/schemas/SeverityStatusStatisticsRequest"},"closed":{"$ref":"#/components/schemas/SeverityStatusStatisticsRequest"},"reactivated":{"$ref":"#/components/schemas/SeverityStatusStatisticsRequest"},"untouched":{"$ref":"#/components/schemas/SeverityStatusStatisticsRequest"}},"required":["closed","created","reactivated","untouched"]},"Dependency":{"type":"object","description":"Serializer for the Dependency model with primary keys for related objects.","properties":{"id":{"type":"integer","readOnly":true},"string":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true},"tags":{"type":"array","items":{"type":"string"}},"purl_type":{"type":"string","description":"The package type/ecosystem (e.g., maven, npm, pypi, golang).","maxLength":64},"namespace":{"type":"string","description":"The type-specific package namespace (e.g., groupId for Maven, scope for npm).","maxLength":256},"name":{"type":"string","description":"The name of the package.","maxLength":256},"version":{"type":"string","description":"The version of the package.","maxLength":128},"qualifiers":{"type":"string","description":"Package URL qualifiers (e.g., 'arch=x86_64&distro=ubuntu-22.04').","maxLength":1024},"subpath":{"type":"string","description":"A subpath within the package.","maxLength":512},"component_type":{"enum":["application","framework","library","container","platform","operating-system","device","device-driver","firmware","file","machine-learning-model","data","cryptographic-asset","service"],"type":"string","x-spec-enum-id":"c28aa1a9d112e7e7","description":"What kind of component this is, in CycloneDX terms (library, application, machine-learning-model, service, and so on). Not part of the identity: the Package URL alone decides which row a component is.\n\n* `application` - Application\n* `framework` - Framework\n* `library` - Library\n* `container` - Container\n* `platform` - Platform\n* `operating-system` - Operating system\n* `device` - Device\n* `device-driver` - Device driver\n* `firmware` - Firmware\n* `file` - File\n* `machine-learning-model` - Machine learning model\n* `data` - Data\n* `cryptographic-asset` - Cryptographic asset\n* `service` - Service"},"purl_validation_failure":{"type":"boolean","description":"Dictates whether the dependency was found to have Package URL validation issues during creation"},"artifact_hashes":{"description":"Mapping of hash algorithms to hash values for this dependency"},"supplier_name":{"type":"string","title":"Supplier","description":"The entity that supplies the component, as the bill of materials names it.","maxLength":256},"supplier_url":{"description":"Where the supplier publishes the component, when the document says.","oneOf":[{"type":"string","format":"uri","maxLength":512},{"type":"string","maxLength":0}]},"support_level":{"enum":["unknown","actively_maintained","security_fixes_only","community_only","unsupported","end_of_life",""],"type":"string","x-spec-enum-id":"1caff0b521c38598","description":"How the supplier maintains this component version. Unknown is a reportable answer; it is never inferred from anything else.\n\n* `unknown` - Unknown\n* `actively_maintained` - Actively maintained\n* `security_fixes_only` - Security fixes only\n* `community_only` - Community supported\n* `unsupported` - Unsupported\n* `end_of_life` - End of life"},"end_of_support_date":{"type":"string","format":"date","nullable":true,"title":"End of Support","description":"The date the supplier stops supporting this component version, when stated."},"support_source":{"enum":["unknown","import","manual","enrichment",""],"type":"string","x-spec-enum-id":"de4fae6dfdbf0c05","description":"Where the support facts came from. A manual edit outranks every later import, so an assessor can see which claims a person stands behind.\n\n* `unknown` - Unknown\n* `import` - Bill of materials\n* `manual` - Manual entry\n* `enrichment` - Enrichment"},"support_updated_at":{"type":"string","format":"date-time","nullable":true,"title":"Support Updated Timestamp","description":"When the support facts were last written."},"support_updated_by":{"type":"integer","nullable":true,"description":"The user who last edited the support facts by hand, when a person did."}},"required":["id","string","type"]},"DependencyRequest":{"type":"object","description":"Serializer for the Dependency model with primary keys for related objects.","properties":{"tags":{"type":"array","items":{"type":"string","minLength":1}},"purl_type":{"type":"string","minLength":1,"description":"The package type/ecosystem (e.g., maven, npm, pypi, golang).","maxLength":64},"namespace":{"type":"string","description":"The type-specific package namespace (e.g., groupId for Maven, scope for npm).","maxLength":256},"name":{"type":"string","description":"The name of the package.","maxLength":256},"version":{"type":"string","description":"The version of the package.","maxLength":128},"qualifiers":{"type":"string","description":"Package URL qualifiers (e.g., 'arch=x86_64&distro=ubuntu-22.04').","maxLength":1024},"subpath":{"type":"string","description":"A subpath within the package.","maxLength":512},"component_type":{"enum":["application","framework","library","container","platform","operating-system","device","device-driver","firmware","file","machine-learning-model","data","cryptographic-asset","service"],"type":"string","x-spec-enum-id":"c28aa1a9d112e7e7","description":"What kind of component this is, in CycloneDX terms (library, application, machine-learning-model, service, and so on). Not part of the identity: the Package URL alone decides which row a component is.\n\n* `application` - Application\n* `framework` - Framework\n* `library` - Library\n* `container` - Container\n* `platform` - Platform\n* `operating-system` - Operating system\n* `device` - Device\n* `device-driver` - Device driver\n* `firmware` - Firmware\n* `file` - File\n* `machine-learning-model` - Machine learning model\n* `data` - Data\n* `cryptographic-asset` - Cryptographic asset\n* `service` - Service"},"purl_validation_failure":{"type":"boolean","description":"Dictates whether the dependency was found to have Package URL validation issues during creation"},"artifact_hashes":{"description":"Mapping of hash algorithms to hash values for this dependency"},"supplier_name":{"type":"string","title":"Supplier","description":"The entity that supplies the component, as the bill of materials names it.","maxLength":256},"supplier_url":{"description":"Where the supplier publishes the component, when the document says.","oneOf":[{"type":"string","format":"uri","maxLength":512},{"type":"string","maxLength":0}]},"support_level":{"enum":["unknown","actively_maintained","security_fixes_only","community_only","unsupported","end_of_life",""],"type":"string","x-spec-enum-id":"1caff0b521c38598","description":"How the supplier maintains this component version. Unknown is a reportable answer; it is never inferred from anything else.\n\n* `unknown` - Unknown\n* `actively_maintained` - Actively maintained\n* `security_fixes_only` - Security fixes only\n* `community_only` - Community supported\n* `unsupported` - Unsupported\n* `end_of_life` - End of life"},"end_of_support_date":{"type":"string","format":"date","nullable":true,"title":"End of Support","description":"The date the supplier stops supporting this component version, when stated."},"support_source":{"enum":["unknown","import","manual","enrichment",""],"type":"string","x-spec-enum-id":"de4fae6dfdbf0c05","description":"Where the support facts came from. A manual edit outranks every later import, so an assessor can see which claims a person stands behind.\n\n* `unknown` - Unknown\n* `import` - Bill of materials\n* `manual` - Manual entry\n* `enrichment` - Enrichment"},"support_updated_at":{"type":"string","format":"date-time","nullable":true,"title":"Support Updated Timestamp","description":"When the support facts were last written."},"support_updated_by":{"type":"integer","nullable":true,"description":"The user who last edited the support facts by hand, when a person did."}}},"DevelopmentEnvironment":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":200}},"required":["id","name"]},"DevelopmentEnvironmentRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200}},"required":["name"]},"DiagnosticEvent":{"type":"object","description":"Read-only representation of one ledger row.","properties":{"id":{"type":"integer","readOnly":true},"source":{"enum":["connector","integrator","jira","sso","saml","ldap","scim","import","rules","scheduling","sensei","notification","system"],"type":"string","x-spec-enum-id":"7c37f2532b589587","readOnly":true,"description":"The subsystem that produced this event\n\n* `connector` - Connector\n* `integrator` - Downstream integrator\n* `jira` - Jira\n* `sso` - SSO (OIDC/OAuth2)\n* `saml` - SAML\n* `ldap` - LDAP\n* `scim` - SCIM provisioning\n* `import` - Import / Reimport\n* `rules` - Rules engine\n* `scheduling` - Scheduling\n* `sensei` - Sensei\n* `notification` - Notification\n* `system` - System"},"source_display":{"type":"string","readOnly":true},"provider":{"type":"string","readOnly":true,"description":"The vendor or backend within the source, e.g. \"jira\", \"github\", \"okta\", \"servicenow\". Free-form because the set grows with every connector and identity provider."},"operation":{"type":"string","readOnly":true,"description":"What was attempted, e.g. \"push\", \"sync\", \"login\", \"reimport\""},"status":{"enum":["running","success","failed","queued","timeout","skipped","dry_run"],"type":"string","description":"* `running` - Running\n* `success` - Success\n* `failed` - Failed\n* `queued` - Queued\n* `timeout` - Timed out\n* `skipped` - Skipped\n* `dry_run` - Dry run","x-spec-enum-id":"1c09336461f460c3","readOnly":true},"status_display":{"type":"string","readOnly":true},"severity":{"enum":["info","warning","error","critical"],"type":"string","description":"* `info` - Info\n* `warning` - Warning\n* `error` - Error\n* `critical` - Critical","x-spec-enum-id":"6e3b7b78d1fdfddc","readOnly":true},"severity_display":{"type":"string","readOnly":true},"trigger":{"enum":["ui","api","scheduled","webhook","auto","cli","system"],"type":"string","description":"* `ui` - UI\n* `api` - API\n* `scheduled` - Scheduled\n* `webhook` - Webhook\n* `auto` - Automatic\n* `cli` - Command line\n* `system` - System","x-spec-enum-id":"172a4c71b8361261","readOnly":true},"trigger_display":{"type":"string","readOnly":true},"summary":{"type":"string","readOnly":true,"description":"One-line, user-facing description of the outcome. Written to be safe for any viewer authorized on the target -- no credentials, no raw provider payloads."},"detail_message":{"type":"string","readOnly":true,"title":"Technical Detail","description":"The unabridged (but redacted) error or result text from the subsystem. Only serialized for superusers."},"detail":{"readOnly":true,"title":"Structured Detail","description":"Operation-specific context -- request identifiers, counts, provider response fields. Redacted on write. Only serialized for superusers."},"redaction_applied":{"type":"boolean","readOnly":true,"description":"At least one value was dropped as a suspected credential while recording this event"},"technical_detail_withheld":{"type":"boolean","description":"True when this viewer is seeing a reduced row.\n\nSurfaced so the UI can say \"an administrator can see more\" rather than\nimplying the subsystem reported nothing further. The instance is handed\nin directly, so this asks whether there is anything to withhold for *this*\nrow without a second query or a stash.","readOnly":true},"actor":{"type":"integer","readOnly":true,"nullable":true,"title":"Triggered By","description":"The user whose action produced this event, when there was one"},"actor_name":{"type":"string","description":"Who triggered it.\n\nFalls back to the label captured at write time so a deleted user still\nanswers the question -- the actor FK nulls out on delete, the label does\nnot.","readOnly":true},"remote_ip":{"type":"string","readOnly":true,"nullable":true,"description":"Source address for events that came in over the network"},"product":{"type":"integer","readOnly":true,"nullable":true,"title":"Asset","description":"The asset this event is scoped to. Null means system scope (instance-wide configuration, authentication, scheduling) and restricts the row to superusers."},"product_name":{"type":"string","readOnly":true},"object_model":{"type":"string","readOnly":true,"title":"Related Object Type","description":"Dotted label of the object this event is about, e.g. \"dojo.Finding\""},"object_id":{"type":"integer","readOnly":true,"nullable":true,"title":"Related Object ID"},"object_label":{"type":"string","readOnly":true,"title":"Related Object","description":"Human-readable name of the related object, captured at write time"},"config_label":{"type":"string","readOnly":true,"title":"Configuration","description":"The configuration behind the event -- connector name, integration instance, identity provider, Jira instance"},"config_id":{"type":"integer","readOnly":true,"nullable":true,"title":"Configuration ID"},"external_reference":{"type":"string","readOnly":true,"description":"Identifier at the far end, e.g. a Jira issue key or a vendor job id"},"correlation_id":{"type":"string","readOnly":true,"description":"Groups the events of one logical unit of work -- a retry chain, a batch push, a request that fanned out into tasks"},"origin_model":{"type":"string","readOnly":true,"default":"","description":"Dotted label of the per-domain row this event mirrors, e.g. \"pro.Operation\". Empty when the ledger is the only record."},"origin_id":{"type":"integer","readOnly":true,"nullable":true,"description":"Primary key of the mirrored row. Together with origin_model this keeps the mirror idempotent: a per-domain row that saves five times as it progresses updates one event instead of producing five."},"started_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Started","description":"When the underlying operation began, which may predate this row"},"finished_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Finished"},"duration_ms":{"type":"integer","readOnly":true,"nullable":true,"title":"Duration (ms)"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Recorded"},"is_failure":{"type":"boolean","readOnly":true}},"required":["actor","actor_name","config_id","config_label","correlation_id","created_at","detail","detail_message","duration_ms","external_reference","finished_at","id","is_failure","object_id","object_label","object_model","operation","origin_id","origin_model","product","product_name","provider","redaction_applied","remote_ip","severity","severity_display","source","source_display","started_at","status","status_display","summary","technical_detail_withheld","trigger","trigger_display"]},"DiagnosticEventSummary":{"type":"object","description":"Shape of the ledger's rollup response (see the viewset's ``summary`` action).","properties":{"total":{"type":"integer"},"failures":{"type":"integer"},"unresolved":{"type":"integer"},"window_days":{"type":"integer"},"by_source":{"type":"object","additionalProperties":{"type":"integer"}},"by_status":{"type":"object","additionalProperties":{"type":"integer"}},"by_severity":{"type":"object","additionalProperties":{"type":"integer"}}},"required":["by_severity","by_source","by_status","failures","total","unresolved","window_days"]},"DismissRequestRequest":{"type":"object","properties":{"reason":{"type":"string","default":""}}},"DisregardUnassignedFinding":{"type":"object","properties":{"unassigned_findings":{"type":"array","items":{"type":"integer"}}},"required":["unassigned_findings"]},"DisregardUnassignedFindingRequest":{"type":"object","properties":{"unassigned_findings":{"type":"array","items":{"type":"integer"}}},"required":["unassigned_findings"]},"DojoGroup":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"configuration_permissions":{"type":"array","items":{"type":"integer","nullable":true}},"email":{"nullable":true,"oneOf":[{"type":"string","format":"email","pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"},{"type":"string","maxLength":0}]},"name":{"type":"string","maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000},"social_provider":{"enum":["AzureAD","Remote","OIDC","SCIM","",null],"type":"string","x-spec-enum-id":"6fdea05504945238","nullable":true,"title":"Social Authentication Provider","description":"Group imported from a social provider.\n\n* `AzureAD` - AzureAD\n* `Remote` - Remote\n* `OIDC` - OIDC\n* `SCIM` - SCIM"},"users":{"type":"array","items":{"type":"integer"},"readOnly":true},"prefetch":{"type":"object","properties":{"users":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["id","name","users"]},"DojoGroupRequest":{"type":"object","description":"Base serializer for all models.","properties":{"configuration_permissions":{"type":"array","items":{"type":"integer","nullable":true}},"email":{"nullable":true,"oneOf":[{"type":"string","format":"email","pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"},{"type":"string","maxLength":0}]},"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000},"social_provider":{"enum":["AzureAD","Remote","OIDC","SCIM","",null],"type":"string","x-spec-enum-id":"6fdea05504945238","nullable":true,"title":"Social Authentication Provider","description":"Group imported from a social provider.\n\n* `AzureAD` - AzureAD\n* `Remote` - Remote\n* `OIDC` - OIDC\n* `SCIM` - SCIM"}},"required":["name"]},"DomainSummary":{"type":"object","properties":{"key":{"type":"string"},"title":{"type":"string"},"requires_llm":{"type":"boolean"},"open_count":{"type":"integer"},"applied_count":{"type":"integer"}},"required":["applied_count","key","open_count","requires_llm","title"]},"DraftAdvisoryRequestRequest":{"type":"object","description":"Open a draft advisory covering a case. The title defaults to the case's own.","properties":{"title":{"type":"string","default":""}}},"DuplicateName":{"type":"object","properties":{"name":{"type":"string"},"asset_ids":{"type":"array","items":{"type":"integer"},"minItems":2}},"required":["asset_ids","name"]},"Edge":{"type":"object","properties":{"source_id":{"type":"integer"},"target_id":{"type":"integer"},"relationship_code":{"type":"string"},"relationship_label":{"type":"string"}},"required":["relationship_code","relationship_label","source_id","target_id"]},"EditRequestRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":512},"action_type":{"enum":["upgrade","patch","configuration","code_change","rebuild","removal","certificate","permission","decommission","other"],"type":"string","description":"* `upgrade` - Upgrade\n* `patch` - Patch\n* `configuration` - Configuration change\n* `code_change` - Code change\n* `rebuild` - Rebuild\n* `removal` - Removal\n* `certificate` - Certificate replacement\n* `permission` - Permission change\n* `decommission` - Decommission\n* `other` - Other","x-spec-enum-id":"2130e743922de2cc"},"target_version":{"type":"string","maxLength":256},"solution":{"type":"string","maxLength":4000}}},"Endpoint":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"active_finding_count":{"type":"integer","readOnly":true},"protocol":{"type":"string","nullable":true,"description":"The communication protocol/scheme such as 'http', 'ftp', 'dns', etc.","maxLength":20},"userinfo":{"type":"string","nullable":true,"description":"User info as 'alice', 'bob', etc.","maxLength":500},"host":{"type":"string","nullable":true,"description":"The host name or IP address. It must not include the port number. For example '127.0.0.1', 'localhost', 'yourdomain.com'.","maxLength":500},"port":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"The network port associated with the endpoint."},"path":{"type":"string","nullable":true,"description":"The location of the resource, it must not start with a '/'. For example endpoint/420/edit","maxLength":500},"query":{"type":"string","nullable":true,"description":"The query string, the question mark should be omitted.For example 'group=4&team=8'","maxLength":1000},"fragment":{"type":"string","nullable":true,"description":"The fragment identifier which follows the hash mark. The hash mark should be omitted. For example 'section-13', 'paragraph-2'.","maxLength":500},"product":{"type":"integer","nullable":true},"endpoint_params":{"type":"array","items":{"type":"integer"},"readOnly":true},"findings":{"type":"array","items":{"type":"integer"},"readOnly":true},"tags":{"type":"array","items":{"type":"string"}}},"required":["active_finding_count","endpoint_params","findings","id"]},"EndpointMetaImporter":{"type":"object","properties":{"file":{"type":"string","format":"uri"},"create_endpoints":{"type":"boolean","default":true},"create_tags":{"type":"boolean","default":true},"create_dojo_meta":{"type":"boolean","default":false},"product_name":{"type":"string"},"product":{"type":"integer"},"product_id":{"type":"integer","readOnly":true}},"required":["file","product_id"]},"EndpointMetaImporterRequest":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"create_endpoints":{"type":"boolean","default":true},"create_tags":{"type":"boolean","default":true},"create_dojo_meta":{"type":"boolean","default":false},"product_name":{"type":"string","minLength":1},"product":{"type":"integer"}},"required":["file"]},"EndpointStatus":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"date":{"type":"string","format":"date"},"last_modified":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"mitigated":{"type":"boolean"},"mitigated_time":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"false_positive":{"type":"boolean"},"out_of_scope":{"type":"boolean"},"risk_accepted":{"type":"boolean"},"mitigated_by":{"type":"integer","nullable":true},"endpoint":{"type":"integer"},"finding":{"type":"integer"}},"required":["endpoint","finding","id","last_modified","mitigated_time"]},"EndpointStatusRequest":{"type":"object","properties":{"date":{"type":"string","format":"date"},"mitigated":{"type":"boolean"},"false_positive":{"type":"boolean"},"out_of_scope":{"type":"boolean"},"risk_accepted":{"type":"boolean"},"mitigated_by":{"type":"integer","nullable":true},"endpoint":{"type":"integer"},"finding":{"type":"integer"}},"required":["endpoint","finding"]},"Engagement":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"name":{"type":"string","nullable":true,"maxLength":300},"description":{"type":"string","nullable":true,"maxLength":2000},"version":{"type":"string","nullable":true,"description":"Version of the product the engagement tested.","maxLength":100},"first_contacted":{"type":"string","format":"date","nullable":true},"target_start":{"type":"string","format":"date"},"target_end":{"type":"string","format":"date"},"reason":{"type":"string","nullable":true,"maxLength":2000},"active":{"type":"boolean","readOnly":true},"tracker":{"nullable":true,"description":"Link to epic or ticket system with changes to version.","oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]},"test_strategy":{"nullable":true,"oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]},"threat_model":{"type":"boolean"},"api_test":{"type":"boolean"},"pen_test":{"type":"boolean"},"check_list":{"type":"boolean"},"status":{"enum":["Not Started","Blocked","Cancelled","Completed","In Progress","On Hold","Scheduled","Waiting for Resource",null],"type":"string","description":"* `Not Started` - Not Started\n* `Blocked` - Blocked\n* `Cancelled` - Cancelled\n* `Completed` - Completed\n* `In Progress` - In Progress\n* `On Hold` - On Hold\n* `Scheduled` - Scheduled\n* `Waiting for Resource` - Waiting for Resource","x-spec-enum-id":"ff79738e944f9d44","nullable":true},"progress":{"type":"string","readOnly":true},"tmodel_path":{"type":"string","readOnly":true,"nullable":true},"done_testing":{"type":"boolean","readOnly":true},"engagement_type":{"enum":["Interactive","CI/CD",null],"type":"string","description":"* `Interactive` - Interactive\n* `CI/CD` - CI/CD","x-spec-enum-id":"531df25eeddb1f62","nullable":true},"build_id":{"type":"string","nullable":true,"description":"Build ID of the product the engagement tested.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash from repo","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch of the product the engagement tested.","maxLength":150},"source_code_management_uri":{"nullable":true,"title":"Repo","description":"Resource link to source code","oneOf":[{"type":"string","format":"uri","maxLength":600},{"type":"string","maxLength":0}]},"deduplication_on_engagement":{"type":"boolean","title":"Deduplication within this engagement only","description":"If enabled deduplication will only mark a finding in this engagement as duplicate of another finding if both findings are in this engagement. If disabled, deduplication is on the product level."},"lead":{"type":"integer","nullable":true},"requester":{"type":"integer","nullable":true},"preset":{"type":"integer","nullable":true,"description":"Settings and notes for performing this engagement."},"report_type":{"type":"integer","nullable":true},"product":{"type":"integer"},"cicd_scm_server":{"type":"integer","nullable":true,"title":"SCM Server","description":"Source code management server used for this CI/CD engagement"},"cicd_build_server":{"type":"integer","nullable":true,"title":"Build Server","description":"Build server used for this CI/CD engagement"},"cicd_orchestration_engine":{"type":"integer","nullable":true,"title":"Orchestration Engine","description":"Orchestration engine used for this CI/CD engagement"},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"},"readOnly":true},"files":{"type":"array","items":{"$ref":"#/components/schemas/File"},"readOnly":true},"risk_acceptance":{"type":"array","items":{"type":"integer"},"readOnly":true},"tags":{"type":"array","items":{"type":"string"}}},"required":["active","created","done_testing","files","id","notes","product","progress","risk_acceptance","target_end","target_start","tmodel_path","updated"]},"EngagementCheckList":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"session_management":{"type":"string","maxLength":50},"encryption_crypto":{"type":"string","maxLength":50},"configuration_management":{"type":"string","maxLength":50},"authentication":{"type":"string","maxLength":50},"authorization_and_access_control":{"type":"string","maxLength":50},"data_input_sanitization_validation":{"type":"string","maxLength":50},"sensitive_data":{"type":"string","maxLength":50},"other":{"type":"string","maxLength":50},"engagement":{"type":"integer","readOnly":true},"session_issues":{"type":"array","items":{"type":"integer"}},"crypto_issues":{"type":"array","items":{"type":"integer"}},"config_issues":{"type":"array","items":{"type":"integer"}},"auth_issues":{"type":"array","items":{"type":"integer"}},"author_issues":{"type":"array","items":{"type":"integer"}},"data_issues":{"type":"array","items":{"type":"integer"}},"sensitive_issues":{"type":"array","items":{"type":"integer"}},"other_issues":{"type":"array","items":{"type":"integer"}}},"required":["engagement","id"]},"EngagementCheckListRequest":{"type":"object","properties":{"session_management":{"type":"string","minLength":1,"maxLength":50},"encryption_crypto":{"type":"string","minLength":1,"maxLength":50},"configuration_management":{"type":"string","minLength":1,"maxLength":50},"authentication":{"type":"string","minLength":1,"maxLength":50},"authorization_and_access_control":{"type":"string","minLength":1,"maxLength":50},"data_input_sanitization_validation":{"type":"string","minLength":1,"maxLength":50},"sensitive_data":{"type":"string","minLength":1,"maxLength":50},"other":{"type":"string","minLength":1,"maxLength":50},"session_issues":{"type":"array","items":{"type":"integer"}},"crypto_issues":{"type":"array","items":{"type":"integer"}},"config_issues":{"type":"array","items":{"type":"integer"}},"auth_issues":{"type":"array","items":{"type":"integer"}},"author_issues":{"type":"array","items":{"type":"integer"}},"data_issues":{"type":"array","items":{"type":"integer"}},"sensitive_issues":{"type":"array","items":{"type":"integer"}},"other_issues":{"type":"array","items":{"type":"integer"}}}},"EngagementPresets":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","description":"Brief description of preset.","maxLength":500},"notes":{"type":"string","nullable":true,"description":"Description of what needs to be tested or setting up environment for testing","maxLength":2000},"scope":{"type":"string","description":"Scope of Engagement testing, IP's/Resources/URL's)","maxLength":800},"created":{"type":"string","format":"date-time","readOnly":true},"product":{"type":"integer"},"test_type":{"type":"array","items":{"type":"integer"}},"network_locations":{"type":"array","items":{"type":"integer"}},"prefetch":{"type":"object","properties":{"network_locations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/NetworkLocations"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"test_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/TestType"}}}}},"required":["created","id","product"]},"EngagementPresetsRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"description":"Brief description of preset.","maxLength":500},"notes":{"type":"string","nullable":true,"description":"Description of what needs to be tested or setting up environment for testing","maxLength":2000},"scope":{"type":"string","description":"Scope of Engagement testing, IP's/Resources/URL's)","maxLength":800},"product":{"type":"integer"},"test_type":{"type":"array","items":{"type":"integer"}},"network_locations":{"type":"array","items":{"type":"integer"}}},"required":["product"]},"EngagementToFiles":{"type":"object","properties":{"engagement_id":{"type":"integer","nullable":true},"files":{"type":"array","items":{"$ref":"#/components/schemas/File"}}},"required":["engagement_id","files"]},"EngagementToNotes":{"type":"object","properties":{"engagement_id":{"type":"integer","nullable":true},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"}}},"required":["engagement_id","notes"]},"EngagementUpdateJiraEpic":{"type":"object","properties":{"epic_name":{"type":"string","maxLength":200},"epic_priority":{"type":"string","nullable":true}}},"EngagementUpdateJiraEpicRequest":{"type":"object","properties":{"epic_name":{"type":"string","minLength":1,"maxLength":200},"epic_priority":{"type":"string","nullable":true,"minLength":1}}},"EnhancedDojoGroupMember":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"group":{"type":"integer"},"user":{"type":"integer"},"role":{"type":"integer","title":"Group role","description":"This role determines the permissions of the user to manage the group."},"prefetch":{"type":"object","properties":{"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["group","id","role","user"]},"EnhancedDojoGroupMemberRequest":{"type":"object","properties":{"group":{"type":"integer"},"user":{"type":"integer"},"role":{"type":"integer","title":"Group role","description":"This role determines the permissions of the user to manage the group."}},"required":["group","role","user"]},"EnhancedEngagement":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"id":{"type":"integer","readOnly":true},"pentest_kind":{"enum":["none","internal","external","application","segmentation"],"type":"string","x-spec-enum-id":"a0c02d669cc5c530","description":"What kind of penetration test this engagement represents (Requirement 11.4)\n\n* `none` - Not a penetration test\n* `internal` - Internal penetration test\n* `external` - External penetration test\n* `application` - Application penetration test\n* `segmentation` - Segmentation test"},"retest_of":{"type":"integer","nullable":true,"description":"The penetration test engagement this one retests (Requirement 11.4.4)"},"pentest_methodology_reference":{"type":"string","description":"The entity's reference for the methodology this test followed (Requirement 11.4.1)"},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"name":{"type":"string","nullable":true,"maxLength":300},"description":{"type":"string","nullable":true,"maxLength":2000},"version":{"type":"string","nullable":true,"description":"Version of the product the engagement tested.","maxLength":100},"first_contacted":{"type":"string","format":"date","nullable":true},"target_start":{"type":"string","format":"date"},"target_end":{"type":"string","format":"date"},"reason":{"type":"string","nullable":true,"maxLength":2000},"active":{"type":"boolean","readOnly":true},"tracker":{"nullable":true,"description":"Link to epic or ticket system with changes to version.","oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]},"test_strategy":{"nullable":true,"oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]},"threat_model":{"type":"boolean"},"api_test":{"type":"boolean"},"pen_test":{"type":"boolean"},"check_list":{"type":"boolean"},"status":{"enum":["Not Started","Blocked","Cancelled","Completed","In Progress","On Hold","Scheduled","Waiting for Resource",null],"type":"string","description":"* `Not Started` - Not Started\n* `Blocked` - Blocked\n* `Cancelled` - Cancelled\n* `Completed` - Completed\n* `In Progress` - In Progress\n* `On Hold` - On Hold\n* `Scheduled` - Scheduled\n* `Waiting for Resource` - Waiting for Resource","x-spec-enum-id":"ff79738e944f9d44","nullable":true},"progress":{"type":"string","readOnly":true},"tmodel_path":{"type":"string","readOnly":true,"nullable":true},"done_testing":{"type":"boolean","readOnly":true},"engagement_type":{"enum":["Interactive","CI/CD",null],"type":"string","description":"* `Interactive` - Interactive\n* `CI/CD` - CI/CD","x-spec-enum-id":"531df25eeddb1f62","nullable":true},"build_id":{"type":"string","nullable":true,"description":"Build ID of the product the engagement tested.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash from repo","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch of the product the engagement tested.","maxLength":150},"source_code_management_uri":{"nullable":true,"title":"Repo","description":"Resource link to source code","oneOf":[{"type":"string","format":"uri","maxLength":600},{"type":"string","maxLength":0}]},"deduplication_on_engagement":{"type":"boolean","title":"Deduplication within this engagement only","description":"If enabled deduplication will only mark a finding in this engagement as duplicate of another finding if both findings are in this engagement. If disabled, deduplication is on the product level."},"lead":{"type":"integer","nullable":true},"requester":{"type":"integer","nullable":true},"preset":{"type":"integer","nullable":true,"description":"Settings and notes for performing this engagement."},"report_type":{"type":"integer","nullable":true},"product":{"type":"integer"},"cicd_scm_server":{"type":"integer","nullable":true,"title":"SCM Server","description":"Source code management server used for this CI/CD engagement"},"cicd_build_server":{"type":"integer","nullable":true,"title":"Build Server","description":"Build server used for this CI/CD engagement"},"cicd_orchestration_engine":{"type":"integer","nullable":true,"title":"Orchestration Engine","description":"Orchestration engine used for this CI/CD engagement"},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"},"readOnly":true},"files":{"type":"array","items":{"$ref":"#/components/schemas/File"},"readOnly":true},"risk_acceptance":{"type":"array","items":{"type":"integer"},"readOnly":true},"tags":{"type":"array","items":{"type":"string"}},"prefetch":{"type":"object","properties":{"files":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/File"}},"lead":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"notes":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Note"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"risk_acceptance":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/RiskAcceptance"}}}}},"required":["active","created","done_testing","files","id","notes","product","progress","risk_acceptance","target_end","target_start","tmodel_path","updated"]},"EnhancedEngagementRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"pentest_kind":{"enum":["none","internal","external","application","segmentation"],"type":"string","x-spec-enum-id":"a0c02d669cc5c530","description":"What kind of penetration test this engagement represents (Requirement 11.4)\n\n* `none` - Not a penetration test\n* `internal` - Internal penetration test\n* `external` - External penetration test\n* `application` - Application penetration test\n* `segmentation` - Segmentation test"},"retest_of":{"type":"integer","nullable":true,"description":"The penetration test engagement this one retests (Requirement 11.4.4)"},"pentest_methodology_reference":{"type":"string","description":"The entity's reference for the methodology this test followed (Requirement 11.4.1)"},"name":{"type":"string","nullable":true,"maxLength":300},"description":{"type":"string","nullable":true,"maxLength":2000},"version":{"type":"string","nullable":true,"description":"Version of the product the engagement tested.","maxLength":100},"first_contacted":{"type":"string","format":"date","nullable":true},"target_start":{"type":"string","format":"date"},"target_end":{"type":"string","format":"date"},"reason":{"type":"string","nullable":true,"maxLength":2000},"tracker":{"nullable":true,"description":"Link to epic or ticket system with changes to version.","oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]},"test_strategy":{"nullable":true,"oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]},"threat_model":{"type":"boolean"},"api_test":{"type":"boolean"},"pen_test":{"type":"boolean"},"check_list":{"type":"boolean"},"status":{"enum":["Not Started","Blocked","Cancelled","Completed","In Progress","On Hold","Scheduled","Waiting for Resource",null],"type":"string","description":"* `Not Started` - Not Started\n* `Blocked` - Blocked\n* `Cancelled` - Cancelled\n* `Completed` - Completed\n* `In Progress` - In Progress\n* `On Hold` - On Hold\n* `Scheduled` - Scheduled\n* `Waiting for Resource` - Waiting for Resource","x-spec-enum-id":"ff79738e944f9d44","nullable":true},"engagement_type":{"enum":["Interactive","CI/CD",null],"type":"string","description":"* `Interactive` - Interactive\n* `CI/CD` - CI/CD","x-spec-enum-id":"531df25eeddb1f62","nullable":true},"build_id":{"type":"string","nullable":true,"description":"Build ID of the product the engagement tested.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash from repo","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch of the product the engagement tested.","maxLength":150},"source_code_management_uri":{"nullable":true,"title":"Repo","description":"Resource link to source code","oneOf":[{"type":"string","format":"uri","maxLength":600},{"type":"string","maxLength":0}]},"deduplication_on_engagement":{"type":"boolean","title":"Deduplication within this engagement only","description":"If enabled deduplication will only mark a finding in this engagement as duplicate of another finding if both findings are in this engagement. If disabled, deduplication is on the product level."},"lead":{"type":"integer","nullable":true},"requester":{"type":"integer","nullable":true},"preset":{"type":"integer","nullable":true,"description":"Settings and notes for performing this engagement."},"report_type":{"type":"integer","nullable":true},"product":{"type":"integer"},"cicd_scm_server":{"type":"integer","nullable":true,"title":"SCM Server","description":"Source code management server used for this CI/CD engagement"},"cicd_build_server":{"type":"integer","nullable":true,"title":"Build Server","description":"Build server used for this CI/CD engagement"},"cicd_orchestration_engine":{"type":"integer","nullable":true,"title":"Orchestration Engine","description":"Orchestration engine used for this CI/CD engagement"},"tags":{"type":"array","items":{"type":"string","minLength":1}}},"required":["product","target_end","target_start"]},"EnhancedOrganization":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"id":{"type":"integer","readOnly":true},"critical_asset":{"type":"boolean","default":false},"key_asset":{"type":"boolean","default":false},"members":{"type":"array","items":{"type":"integer"},"readOnly":true},"authorization_groups":{"type":"array","items":{"type":"integer"},"readOnly":true},"org_type":{"enum":["team","business_app","compliance_scope","portfolio","custom"],"type":"string","x-spec-enum-id":"6ba9512199a7c3f4","description":"The organization's facet: team, business application, compliance scope, portfolio, or custom.\n\n* `team` - Team\n* `business_app` - Business Application\n* `compliance_scope` - Compliance Scope\n* `portfolio` - Portfolio\n* `custom` - Custom"},"parent_organization":{"type":"integer","nullable":true,"description":"Optional parent organization for drill-down nesting WITHIN the same facet. Reporting/navigation only -- nesting does not grant RBAC."},"parent_organization_name":{"type":"string","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"name":{"type":"string","maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000},"prefetch":{"type":"object","properties":{"authorized_users":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["authorization_groups","created","id","members","name","parent_organization_name","updated"]},"EnhancedOrganizationRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"critical_asset":{"type":"boolean","default":false},"key_asset":{"type":"boolean","default":false},"org_type":{"enum":["team","business_app","compliance_scope","portfolio","custom"],"type":"string","x-spec-enum-id":"6ba9512199a7c3f4","description":"The organization's facet: team, business application, compliance scope, portfolio, or custom.\n\n* `team` - Team\n* `business_app` - Business Application\n* `compliance_scope` - Compliance Scope\n* `portfolio` - Portfolio\n* `custom` - Custom"},"parent_organization":{"type":"integer","nullable":true,"description":"Optional parent organization for drill-down nesting WITHIN the same facet. Reporting/navigation only -- nesting does not grant RBAC."},"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000}},"required":["name"]},"EnhancedProductGroup":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer"},"group":{"type":"integer"},"role":{"type":"integer"},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}}}}},"required":["group","id","product","role"]},"EnhancedProductGroupRequest":{"type":"object","properties":{"product":{"type":"integer"},"group":{"type":"integer"},"role":{"type":"integer"}},"required":["group","product","role"]},"EnhancedProductMember":{"type":"object","description":"Pro-owned base class for the Product_Member API serializer.\n\nSee the matching note on\n``pro.product_type_groups.api.serializers.ProductTypeGroupSerializer``.","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer"},"user":{"type":"integer"},"role":{"type":"integer"},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["id","product","role","user"]},"EnhancedProductMemberRequest":{"type":"object","description":"Pro-owned base class for the Product_Member API serializer.\n\nSee the matching note on\n``pro.product_type_groups.api.serializers.ProductTypeGroupSerializer``.","properties":{"product":{"type":"integer"},"user":{"type":"integer"},"role":{"type":"integer"}},"required":["product","role","user"]},"EnhancedProductType":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"id":{"type":"integer","readOnly":true},"members":{"type":"array","items":{"type":"integer"},"readOnly":true},"authorization_groups":{"type":"array","items":{"type":"integer"},"readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"name":{"type":"string","maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000},"critical_product":{"type":"boolean"},"key_product":{"type":"boolean"},"prefetch":{"type":"object","properties":{"authorized_users":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["authorization_groups","created","id","members","name","updated"]},"EnhancedProductTypeGroup":{"type":"object","description":"Pro-owned base class for the Product_Type_Group API serializer.\n\nThe OS authorization takeover (pro.0052_pro_authorization_takeover)\ndeleted the upstream ``dojo.api_v2.serializers.ProductTypeGroupSerializer``;\npro carries the canonical class here.  ``EnhancedProductTypeGroupSerializer``\nextends it so the documented inheritance check still holds.","properties":{"id":{"type":"integer","readOnly":true},"product_type":{"type":"integer"},"group":{"type":"integer"},"role":{"type":"integer"},"prefetch":{"type":"object","properties":{"product_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ProductType"}}}}},"required":["group","id","product_type","role"]},"EnhancedProductTypeGroupRequest":{"type":"object","description":"Pro-owned base class for the Product_Type_Group API serializer.\n\nThe OS authorization takeover (pro.0052_pro_authorization_takeover)\ndeleted the upstream ``dojo.api_v2.serializers.ProductTypeGroupSerializer``;\npro carries the canonical class here.  ``EnhancedProductTypeGroupSerializer``\nextends it so the documented inheritance check still holds.","properties":{"product_type":{"type":"integer"},"group":{"type":"integer"},"role":{"type":"integer"}},"required":["group","product_type","role"]},"EnhancedProductTypeMember":{"type":"object","description":"Pro-owned base class for the Product_Type_Member API serializer.\n\nSee the matching note on\n``pro.product_type_groups.api.serializers.ProductTypeGroupSerializer``.","properties":{"id":{"type":"integer","readOnly":true},"product_type":{"type":"integer"},"user":{"type":"integer"},"role":{"type":"integer"},"prefetch":{"type":"object","properties":{"product_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ProductType"}},"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["id","product_type","role","user"]},"EnhancedProductTypeMemberRequest":{"type":"object","description":"Pro-owned base class for the Product_Type_Member API serializer.\n\nSee the matching note on\n``pro.product_type_groups.api.serializers.ProductTypeGroupSerializer``.","properties":{"product_type":{"type":"integer"},"user":{"type":"integer"},"role":{"type":"integer"}},"required":["product_type","role","user"]},"EnhancedProductTypeRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000},"critical_product":{"type":"boolean"},"key_product":{"type":"boolean"}},"required":["name"]},"EnhancedRiskAcceptance":{"type":"object","description":"``path`` served from the acceptance's prefetched ``engagement_set``.\n\nThe open-source ``get_path`` runs ``Engagement.objects.filter(...).first()`` for every\nacceptance, which ignores the ``engagement_set`` prefetch the list querysets already\ncarry, and it looks the engagement up even when there is no proof to link to. Iterating\n``engagement_set.all()`` reads the prefetch (in the same ``-target_start`` default order\n``.first()`` used), and checking for a proof first skips the lookup entirely for the\ncommon no-proof acceptance.","properties":{"id":{"type":"integer","readOnly":true},"path":{"type":"string","readOnly":true},"is_global":{"type":"boolean","default":false},"acceptance_criteria":{"description":"Findings this risk acceptance stands for, so matching findings are accepted as they are imported. Requires a scope; only applies while the acceptance is active."},"workflow_state":{"type":"string","readOnly":true},"recommendation":{"enum":["A","V","M","F","T"],"type":"string","description":"* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)","x-spec-enum-id":"8690fff015f0d4c3"},"decision":{"enum":["A","V","M","F","T"],"type":"string","description":"* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)","x-spec-enum-id":"8690fff015f0d4c3"},"accepted_findings":{"type":"array","items":{"type":"integer","nullable":true}},"has_proof":{"type":"boolean","readOnly":true},"proof_filename":{"type":"boolean","readOnly":true},"name":{"type":"string","description":"Descriptive name which in the future may also be used to group risk acceptances together across engagements and products","maxLength":300},"recommendation_details":{"type":"string","nullable":true,"title":"Security Recommendation Details","description":"Explanation of security recommendation"},"decision_details":{"type":"string","nullable":true,"description":"If a compensating control exists to mitigate the finding or reduce risk, then list the compensating control(s)."},"accepted_by":{"type":"string","nullable":true,"description":"The person that accepts the risk, can be outside of DefectDojo.","maxLength":200},"expiration_date":{"type":"string","format":"date-time","nullable":true,"description":"When the risk acceptance expires, the findings will be reactivated (unless disabled below)."},"expiration_date_warned":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"(readonly) Date at which notice about the risk acceptance expiration was sent."},"expiration_date_handled":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"(readonly) When the risk acceptance expiration was handled (manually or by the daily job)."},"reactivate_expired":{"type":"boolean","title":"Reactivate findings on expiration","description":"Reactivate findings when risk acceptance expires?"},"restart_sla_expired":{"type":"boolean","title":"Restart SLA on expiration","description":"When enabled, the SLA for findings is restarted when the risk acceptance expires."},"restore_verified_expired":{"type":"boolean","title":"Restore Verified on expiration","description":"When enabled, reactivated findings are also marked Verified when the risk acceptance expires. Only applies when 'Reactivate findings on expiration' is enabled."},"created":{"type":"string","format":"date-time","readOnly":true},"updated":{"type":"string","format":"date-time","readOnly":true},"owner":{"type":"integer","description":"User in DefectDojo owning this acceptance. Only the owner and staff users can edit the risk acceptance."},"notes":{"type":"array","items":{"type":"integer"},"readOnly":true}},"required":["accepted_findings","created","decision","expiration_date_handled","expiration_date_warned","has_proof","id","name","notes","owner","path","proof_filename","recommendation","updated","workflow_state"]},"EnhancedRiskAcceptanceProof":{"type":"object","properties":{"file":{"type":"string","format":"uri"}},"required":["file"]},"EnhancedRiskAcceptanceProofRequest":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]},"EnhancedRiskAcceptanceRequest":{"type":"object","description":"``path`` served from the acceptance's prefetched ``engagement_set``.\n\nThe open-source ``get_path`` runs ``Engagement.objects.filter(...).first()`` for every\nacceptance, which ignores the ``engagement_set`` prefetch the list querysets already\ncarry, and it looks the engagement up even when there is no proof to link to. Iterating\n``engagement_set.all()`` reads the prefetch (in the same ``-target_start`` default order\n``.first()`` used), and checking for a proof first skips the lookup entirely for the\ncommon no-proof acceptance.","properties":{"is_global":{"type":"boolean","default":false},"acceptance_criteria":{"description":"Findings this risk acceptance stands for, so matching findings are accepted as they are imported. Requires a scope; only applies while the acceptance is active."},"recommendation":{"enum":["A","V","M","F","T"],"type":"string","description":"* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)","x-spec-enum-id":"8690fff015f0d4c3"},"decision":{"enum":["A","V","M","F","T"],"type":"string","description":"* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)","x-spec-enum-id":"8690fff015f0d4c3"},"accepted_findings":{"type":"array","items":{"type":"integer","nullable":true}},"name":{"type":"string","minLength":1,"description":"Descriptive name which in the future may also be used to group risk acceptances together across engagements and products","maxLength":300},"recommendation_details":{"type":"string","nullable":true,"title":"Security Recommendation Details","description":"Explanation of security recommendation"},"decision_details":{"type":"string","nullable":true,"description":"If a compensating control exists to mitigate the finding or reduce risk, then list the compensating control(s)."},"accepted_by":{"type":"string","nullable":true,"description":"The person that accepts the risk, can be outside of DefectDojo.","maxLength":200},"expiration_date":{"type":"string","format":"date-time","nullable":true,"description":"When the risk acceptance expires, the findings will be reactivated (unless disabled below)."},"reactivate_expired":{"type":"boolean","title":"Reactivate findings on expiration","description":"Reactivate findings when risk acceptance expires?"},"restart_sla_expired":{"type":"boolean","title":"Restart SLA on expiration","description":"When enabled, the SLA for findings is restarted when the risk acceptance expires."},"restore_verified_expired":{"type":"boolean","title":"Restore Verified on expiration","description":"When enabled, reactivated findings are also marked Verified when the risk acceptance expires. Only applies when 'Reactivate findings on expiration' is enabled."},"owner":{"type":"integer","description":"User in DefectDojo owning this acceptance. Only the owner and staff users can edit the risk acceptance."}},"required":["accepted_findings","decision","name","owner","recommendation"]},"EnhancedSystemSettings":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"risk_acceptance_block_self_approval":{"type":"boolean","description":"When enabled, whoever requested a risk acceptance cannot approve or activate it themselves, even if they hold the approve permission. Only applies while Risk Acceptances 2.0 is enabled."},"risk_acceptance_require_review_on_extension":{"type":"boolean","description":"When enabled, an expired risk acceptance has to be reviewed again before it can be extended -- reinstating it directly is refused, and it must go back through proposed. Turn off to allow approvers to reinstate an expired acceptance directly. Only applies while Risk Acceptances 2.0 is enabled."},"generated_report_retention_days":{"type":"integer","maximum":36500,"minimum":0,"description":"Generated reports older than this many days are deleted each night, file and all. 0 keeps them indefinitely."},"ai_governance_needs_review_findings":{"type":"boolean","description":"When enabled, an AI component no AI component policy decides on raises an Info-severity Finding. Only applies while AI Inventory and Governance is enabled."},"restrict_layout_customization":{"type":"boolean","description":"When enabled, only superusers can create or change dashboards, page layouts, and table views. Everyone else is shown the defaults an administrator chose, or the built-in defaults when none were chosen. Personal layouts saved earlier are kept and reappear if this is turned back off."},"api_async_import":{"type":"boolean","description":"When enabled, all API based imports and reimports will be processed asynchronously in the background after parsing the submitted report for errors. Query the test ID returned in the response for the 'processing' field to monitor the status of the process"},"ui_async_import":{"type":"boolean","description":"When enabled, all UI based imports and reimports will be processed asynchronously in the background after parsing the submitted report for errors."},"default_group":{"type":"integer","nullable":true,"description":"Dojo_Group ID that newly-created users will be auto-assigned to."},"default_group_role":{"type":"integer","nullable":true,"description":"Role ID applied when newly-created users are auto-assigned to the default group."},"default_group_email_pattern":{"type":"string","description":"Regex pattern matched against a new user's email; the default group is only assigned when the email matches. Empty string disables the pattern check.","maxLength":200},"ui_color_theme":{"description":"Instance-wide theme for the Vue UI. A partial object; every key is optional. 'preset' is 'brand' or 'legacy'. 'primary' is a 6-digit hex color. The metric groups 'severity', 'risk', 'grade' and 'cvss' map their token names to hex colors. The scheme groups 'neutral', 'surfaces', 'text', 'components' and 'status' map 'light' and/or 'dark' to an object of token names and hex colors. Text colors stored alongside a surface color must reach a 4.5:1 contrast ratio. An empty object restores the default colors."},"pci_entity_type":{"enum":["unspecified","merchant","service_provider","both"],"type":"string","x-spec-enum-id":"f82730b58cc957a2","description":"How this instance's organization is assessed under PCI DSS: merchant, service provider, both, or unspecified. Service providers confirm scope and test segmentation every six months rather than annually, so several PCI cadence checks read this.\n\n* `unspecified` - Unspecified\n* `merchant` - Merchant\n* `service_provider` - Service provider\n* `both` - Both merchant and service provider"},"enable_deduplication":{"type":"boolean","title":"Deduplicate findings","description":"With this setting turned on, DefectDojo deduplicates findings by comparing endpoints, cwe fields, and titles. If two findings share a URL and have the same CWE or title, DefectDojo marks the recent finding as a duplicate. When deduplication is enabled, a list of deduplicated findings is added to the engagement view."},"delete_duplicates":{"type":"boolean","description":"Requires next setting: maximum number of duplicates to retain."},"max_dupes":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Max Duplicates","description":"When enabled, if a single issue reaches the maximum number of duplicates, the oldest will be deleted. Duplicate will not be deleted when left empty. A value of 0 will remove all duplicates."},"email_from":{"type":"string","maxLength":200},"enable_jira":{"type":"boolean","title":"Enable JIRA integration"},"enable_jira_web_hook":{"type":"boolean","description":"Please note: It is strongly recommended to use a secret below and / or IP whitelist the JIRA server using a proxy such as Nginx."},"disable_jira_webhook_secret":{"type":"boolean","title":"Disable web hook secret","description":"Allows incoming requests without a secret (discouraged legacy behaviour)"},"jira_webhook_secret":{"type":"string","nullable":true,"title":"JIRA Webhook URL","description":"Secret needed in URL for incoming JIRA Webhook","maxLength":64},"jira_minimum_severity":{"enum":["Critical","High","Medium","Low","Info","",null],"type":"string","description":"* `Critical` - Critical\n* `High` - High\n* `Medium` - Medium\n* `Low` - Low\n* `Info` - Info","x-spec-enum-id":"fc5d16a20ed06136","nullable":true},"jira_labels":{"type":"string","nullable":true,"description":"JIRA issue labels space seperated","maxLength":200},"add_vulnerability_id_to_jira_label":{"type":"boolean","title":"Add vulnerability Id as a JIRA label"},"enable_github":{"type":"boolean","title":"Enable GITHUB integration"},"enable_slack_notifications":{"type":"boolean"},"slack_channel":{"type":"string","description":"Optional. Needed if you want to send global notifications.","maxLength":100},"slack_token":{"type":"string","description":"Token required for interacting with Slack. Get one at https://api.slack.com/tokens","maxLength":100},"slack_username":{"type":"string","description":"Optional. Will take your bot name otherwise.","maxLength":100},"enable_msteams_notifications":{"type":"boolean","title":"Enable Microsoft Teams notifications"},"msteams_url":{"type":"string","description":"The full URL of the incoming webhook","maxLength":400},"enable_mail_notifications":{"type":"boolean"},"mail_notifications_to":{"type":"string","maxLength":200},"enable_webhooks_notifications":{"type":"boolean","title":"Enable Webhook notifications"},"webhooks_notifications_timeout":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"How many seconds will DefectDojo waits for response from webhook endpoint"},"enforce_verified_status":{"type":"boolean","title":"Enforce Verified Status - Globally","description":"When enabled, features such as product grading, jira integration, metrics, and reports will only interact with verified findings. This setting will override individually scoped verified toggles."},"enforce_verified_status_jira":{"type":"boolean","title":"Enforce Verified Status - Jira","description":"When enabled, findings must have a verified status to be pushed to jira."},"enforce_verified_status_product_grading":{"type":"boolean","title":"Enforce Verified Status - Product Grading","description":"When enabled, findings must have a verified status to be considered as part of a product's grading."},"enforce_verified_status_metrics":{"type":"boolean","title":"Enforce Verified Status - Metrics","description":"When enabled, findings must have a verified status to be counted in metric calculations, be included in reports, and filters."},"false_positive_history":{"type":"boolean","description":"(EXPERIMENTAL) DefectDojo will automatically mark the finding as a false positive if an equal finding (according to its dedupe algorithm) has been previously marked as a false positive on the same product. ATTENTION: Although the deduplication algorithm is used to determine if a finding should be marked as a false positive, this feature will not work if deduplication is enabled since it doesn't make sense to use both."},"retroactive_false_positive_history":{"type":"boolean","description":"(EXPERIMENTAL) FP History will also retroactively mark/unmark all existing equal findings in the same product as a false positives. Only works if the False Positive History feature is also enabled."},"url_prefix":{"type":"string","description":"URL prefix if DefectDojo is installed in it's own virtual subdirectory.","maxLength":300},"team_name":{"type":"string","maxLength":100},"enable_product_grade":{"type":"boolean","title":"Enable Product Grading","description":"Displays a grade letter next to a product to show the overall health."},"product_grade_a":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade A","description":"Percentage score for an 'A' >="},"product_grade_b":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade B","description":"Percentage score for a 'B' >="},"product_grade_c":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade C","description":"Percentage score for a 'C' >="},"product_grade_d":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade D","description":"Percentage score for a 'D' >="},"product_grade_f":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade F","description":"Percentage score for an 'F' <="},"enable_product_tag_inheritance":{"type":"boolean","description":"Enables product tag inheritance globally for all products. Any tags added on a product will automatically be added to all Engagements, Tests, and Findings"},"enable_benchmark":{"type":"boolean","title":"Enable Benchmarks","description":"Enables Benchmarks such as the OWASP ASVS (Application Security Verification Standard)"},"enable_similar_findings":{"type":"boolean","description":"Enable the query of similar findings on the view finding page. This feature can involve potentially large queries and negatively impact performance"},"engagement_auto_close":{"type":"boolean","title":"Enable Engagement Auto-Close","description":"Closes an engagement after 3 days (default) past due date including last update."},"engagement_auto_close_days":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Closes an engagement after the specified number of days past due date including last update."},"enable_finding_sla":{"type":"boolean","title":"Enable Finding SLA's","description":"Enables Finding SLA's for time to remediate."},"enable_notify_sla_active":{"type":"boolean","title":"Enable Notify SLA's Breach for active Findings","description":"Enables Notify when time to remediate according to Finding SLA's is breached for active Findings."},"enable_notify_sla_active_verified":{"type":"boolean","title":"Enable Notify SLA's Breach for active, verified Findings","description":"Enables Notify when time to remediate according to Finding SLA's is breached for active, verified Findings."},"enable_notify_sla_jira_only":{"type":"boolean","title":"Enable Notify SLA's Breach only for Findings linked to JIRA","description":"Enables Notify when time to remediate according to Finding SLA's is breached for Findings that are linked to JIRA issues. Notification is disabled for Findings not linked to JIRA issues"},"enable_notify_sla_exponential_backoff":{"type":"boolean","title":"Enable an exponential backoff strategy for SLA breach notifications.","description":"Enable an exponential backoff strategy for SLA breach notifications, e.g. 1, 2, 4, 8, etc. Otherwise it alerts every day"},"allow_anonymous_survey_repsonse":{"type":"boolean","title":"Allow Anonymous Survey Responses","description":"Enable anyone with a link to the survey to answer a survey"},"disclaimer_notifications":{"type":"string","title":"Custom Disclaimer for Notifications","description":"Include this custom disclaimer on all notifications","maxLength":3000},"disclaimer_reports":{"type":"string","title":"Custom Disclaimer for Reports","description":"Include this custom disclaimer on generated reports","maxLength":5000},"disclaimer_reports_forced":{"type":"boolean","title":"Force to add disclaimer reports","description":"Disclaimer will be added to all reports even if user didn't selected 'Include disclaimer'."},"disclaimer_notes":{"type":"string","title":"Custom Disclaimer for Notes","description":"Include this custom disclaimer next to input form for notes","maxLength":3000},"risk_acceptance_form_default_days":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"Default expiry period for risk acceptance form."},"risk_acceptance_notify_before_expiration":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Risk acceptance expiration heads up days","description":"Notify X days before risk acceptance expires. Leave empty to disable."},"enable_questionnaires":{"type":"boolean","description":"With this setting turned off, questionnaires will be disabled in the user interface."},"enable_checklists":{"type":"boolean","description":"With this setting turned off, checklists will be disabled in the user interface."},"enable_endpoint_metadata_import":{"type":"boolean","description":"With this setting turned off, endpoint metadata import will be disabled in the user interface."},"enable_user_profile_editable":{"type":"boolean","title":"Enable user profile for writing","description":"When turned on users can edit their profiles"},"enable_product_tracking_files":{"type":"boolean","description":"With this setting turned off, the product tracking files will be disabled in the user interface."},"enable_finding_groups":{"type":"boolean","description":"With this setting turned off, the Finding Groups will be disabled."},"enable_ui_table_based_searching":{"type":"boolean","title":"Enable UI Table Based Filtering/Sorting","description":"With this setting enabled, table headings will contain sort buttons for the current page of data in addition to sorting buttons that consider data from all pages."},"enable_calendar":{"type":"boolean","description":"With this setting turned off, the Calendar will be disabled in the user interface."},"enable_cvss3_display":{"type":"boolean","description":"With this setting turned off, CVSS3 fields will be hidden in the user interface."},"enable_cvss4_display":{"type":"boolean","description":"With this setting turned off, CVSS4 fields will be hidden in the user interface."},"minimum_password_length":{"type":"integer","maximum":48,"minimum":9,"description":"Requires user to set passwords greater than minimum length."},"maximum_password_length":{"type":"integer","maximum":48,"minimum":9,"description":"Requires user to set passwords less than maximum length."},"number_character_required":{"type":"boolean","title":"Password must contain one digit","description":"Requires user passwords to contain at least one digit (0-9)."},"special_character_required":{"type":"boolean","title":"Password must contain one special character","description":"Requires user passwords to contain at least one special character (()[]{}|\\`~!@#$%^&*_-+=;:'\",<>./?)."},"lowercase_character_required":{"type":"boolean","title":"Password must contain one lowercase letter","description":"Requires user passwords to contain at least one lowercase letter (a-z)."},"uppercase_character_required":{"type":"boolean","title":"Password must contain one uppercase letter","description":"Requires user passwords to contain at least one uppercase letter (A-Z)."},"non_common_password_required":{"type":"boolean","title":"Password must not be common","description":"Requires user passwords to not be part of list of common passwords."},"api_expose_error_details":{"type":"boolean","description":"When turned on, the API will expose error details in the response."},"filter_string_matching":{"type":"boolean","title":"Filter String Matching Optimization","description":"When turned on, all filter operations in the UI will require string matches rather than ID. This is a performance enhancement to avoid fetching objects unnecessarily."},"install_id":{"type":"string","format":"uuid","readOnly":true,"description":"A random id that identifies this instance. Exports carry it so a migration tool can tell two instances apart."}},"required":["id","install_id"]},"EnhancedSystemSettingsRequest":{"type":"object","description":"Base serializer for all models.","properties":{"risk_acceptance_block_self_approval":{"type":"boolean","description":"When enabled, whoever requested a risk acceptance cannot approve or activate it themselves, even if they hold the approve permission. Only applies while Risk Acceptances 2.0 is enabled."},"risk_acceptance_require_review_on_extension":{"type":"boolean","description":"When enabled, an expired risk acceptance has to be reviewed again before it can be extended -- reinstating it directly is refused, and it must go back through proposed. Turn off to allow approvers to reinstate an expired acceptance directly. Only applies while Risk Acceptances 2.0 is enabled."},"generated_report_retention_days":{"type":"integer","maximum":36500,"minimum":0,"description":"Generated reports older than this many days are deleted each night, file and all. 0 keeps them indefinitely."},"ai_governance_needs_review_findings":{"type":"boolean","description":"When enabled, an AI component no AI component policy decides on raises an Info-severity Finding. Only applies while AI Inventory and Governance is enabled."},"restrict_layout_customization":{"type":"boolean","description":"When enabled, only superusers can create or change dashboards, page layouts, and table views. Everyone else is shown the defaults an administrator chose, or the built-in defaults when none were chosen. Personal layouts saved earlier are kept and reappear if this is turned back off."},"api_async_import":{"type":"boolean","description":"When enabled, all API based imports and reimports will be processed asynchronously in the background after parsing the submitted report for errors. Query the test ID returned in the response for the 'processing' field to monitor the status of the process"},"ui_async_import":{"type":"boolean","description":"When enabled, all UI based imports and reimports will be processed asynchronously in the background after parsing the submitted report for errors."},"default_group":{"type":"integer","nullable":true,"description":"Dojo_Group ID that newly-created users will be auto-assigned to."},"default_group_role":{"type":"integer","nullable":true,"description":"Role ID applied when newly-created users are auto-assigned to the default group."},"default_group_email_pattern":{"type":"string","description":"Regex pattern matched against a new user's email; the default group is only assigned when the email matches. Empty string disables the pattern check.","maxLength":200},"ui_color_theme":{"description":"Instance-wide theme for the Vue UI. A partial object; every key is optional. 'preset' is 'brand' or 'legacy'. 'primary' is a 6-digit hex color. The metric groups 'severity', 'risk', 'grade' and 'cvss' map their token names to hex colors. The scheme groups 'neutral', 'surfaces', 'text', 'components' and 'status' map 'light' and/or 'dark' to an object of token names and hex colors. Text colors stored alongside a surface color must reach a 4.5:1 contrast ratio. An empty object restores the default colors."},"pci_entity_type":{"enum":["unspecified","merchant","service_provider","both"],"type":"string","x-spec-enum-id":"f82730b58cc957a2","description":"How this instance's organization is assessed under PCI DSS: merchant, service provider, both, or unspecified. Service providers confirm scope and test segmentation every six months rather than annually, so several PCI cadence checks read this.\n\n* `unspecified` - Unspecified\n* `merchant` - Merchant\n* `service_provider` - Service provider\n* `both` - Both merchant and service provider"},"enable_deduplication":{"type":"boolean","title":"Deduplicate findings","description":"With this setting turned on, DefectDojo deduplicates findings by comparing endpoints, cwe fields, and titles. If two findings share a URL and have the same CWE or title, DefectDojo marks the recent finding as a duplicate. When deduplication is enabled, a list of deduplicated findings is added to the engagement view."},"delete_duplicates":{"type":"boolean","description":"Requires next setting: maximum number of duplicates to retain."},"max_dupes":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Max Duplicates","description":"When enabled, if a single issue reaches the maximum number of duplicates, the oldest will be deleted. Duplicate will not be deleted when left empty. A value of 0 will remove all duplicates."},"email_from":{"type":"string","maxLength":200},"enable_jira":{"type":"boolean","title":"Enable JIRA integration"},"enable_jira_web_hook":{"type":"boolean","description":"Please note: It is strongly recommended to use a secret below and / or IP whitelist the JIRA server using a proxy such as Nginx."},"disable_jira_webhook_secret":{"type":"boolean","title":"Disable web hook secret","description":"Allows incoming requests without a secret (discouraged legacy behaviour)"},"jira_webhook_secret":{"type":"string","nullable":true,"minLength":1,"title":"JIRA Webhook URL","description":"Secret needed in URL for incoming JIRA Webhook","maxLength":64},"jira_minimum_severity":{"enum":["Critical","High","Medium","Low","Info","",null],"type":"string","description":"* `Critical` - Critical\n* `High` - High\n* `Medium` - Medium\n* `Low` - Low\n* `Info` - Info","x-spec-enum-id":"fc5d16a20ed06136","nullable":true},"jira_labels":{"type":"string","nullable":true,"description":"JIRA issue labels space seperated","maxLength":200},"add_vulnerability_id_to_jira_label":{"type":"boolean","title":"Add vulnerability Id as a JIRA label"},"enable_github":{"type":"boolean","title":"Enable GITHUB integration"},"enable_slack_notifications":{"type":"boolean"},"slack_channel":{"type":"string","description":"Optional. Needed if you want to send global notifications.","maxLength":100},"slack_token":{"type":"string","description":"Token required for interacting with Slack. Get one at https://api.slack.com/tokens","maxLength":100},"slack_username":{"type":"string","description":"Optional. Will take your bot name otherwise.","maxLength":100},"enable_msteams_notifications":{"type":"boolean","title":"Enable Microsoft Teams notifications"},"msteams_url":{"type":"string","description":"The full URL of the incoming webhook","maxLength":400},"enable_mail_notifications":{"type":"boolean"},"mail_notifications_to":{"type":"string","maxLength":200},"enable_webhooks_notifications":{"type":"boolean","title":"Enable Webhook notifications"},"webhooks_notifications_timeout":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"How many seconds will DefectDojo waits for response from webhook endpoint"},"enforce_verified_status":{"type":"boolean","title":"Enforce Verified Status - Globally","description":"When enabled, features such as product grading, jira integration, metrics, and reports will only interact with verified findings. This setting will override individually scoped verified toggles."},"enforce_verified_status_jira":{"type":"boolean","title":"Enforce Verified Status - Jira","description":"When enabled, findings must have a verified status to be pushed to jira."},"enforce_verified_status_product_grading":{"type":"boolean","title":"Enforce Verified Status - Product Grading","description":"When enabled, findings must have a verified status to be considered as part of a product's grading."},"enforce_verified_status_metrics":{"type":"boolean","title":"Enforce Verified Status - Metrics","description":"When enabled, findings must have a verified status to be counted in metric calculations, be included in reports, and filters."},"false_positive_history":{"type":"boolean","description":"(EXPERIMENTAL) DefectDojo will automatically mark the finding as a false positive if an equal finding (according to its dedupe algorithm) has been previously marked as a false positive on the same product. ATTENTION: Although the deduplication algorithm is used to determine if a finding should be marked as a false positive, this feature will not work if deduplication is enabled since it doesn't make sense to use both."},"retroactive_false_positive_history":{"type":"boolean","description":"(EXPERIMENTAL) FP History will also retroactively mark/unmark all existing equal findings in the same product as a false positives. Only works if the False Positive History feature is also enabled."},"url_prefix":{"type":"string","description":"URL prefix if DefectDojo is installed in it's own virtual subdirectory.","maxLength":300},"team_name":{"type":"string","maxLength":100},"enable_product_grade":{"type":"boolean","title":"Enable Product Grading","description":"Displays a grade letter next to a product to show the overall health."},"product_grade_a":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade A","description":"Percentage score for an 'A' >="},"product_grade_b":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade B","description":"Percentage score for a 'B' >="},"product_grade_c":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade C","description":"Percentage score for a 'C' >="},"product_grade_d":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade D","description":"Percentage score for a 'D' >="},"product_grade_f":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade F","description":"Percentage score for an 'F' <="},"enable_product_tag_inheritance":{"type":"boolean","description":"Enables product tag inheritance globally for all products. Any tags added on a product will automatically be added to all Engagements, Tests, and Findings"},"enable_benchmark":{"type":"boolean","title":"Enable Benchmarks","description":"Enables Benchmarks such as the OWASP ASVS (Application Security Verification Standard)"},"enable_similar_findings":{"type":"boolean","description":"Enable the query of similar findings on the view finding page. This feature can involve potentially large queries and negatively impact performance"},"engagement_auto_close":{"type":"boolean","title":"Enable Engagement Auto-Close","description":"Closes an engagement after 3 days (default) past due date including last update."},"engagement_auto_close_days":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Closes an engagement after the specified number of days past due date including last update."},"enable_finding_sla":{"type":"boolean","title":"Enable Finding SLA's","description":"Enables Finding SLA's for time to remediate."},"enable_notify_sla_active":{"type":"boolean","title":"Enable Notify SLA's Breach for active Findings","description":"Enables Notify when time to remediate according to Finding SLA's is breached for active Findings."},"enable_notify_sla_active_verified":{"type":"boolean","title":"Enable Notify SLA's Breach for active, verified Findings","description":"Enables Notify when time to remediate according to Finding SLA's is breached for active, verified Findings."},"enable_notify_sla_jira_only":{"type":"boolean","title":"Enable Notify SLA's Breach only for Findings linked to JIRA","description":"Enables Notify when time to remediate according to Finding SLA's is breached for Findings that are linked to JIRA issues. Notification is disabled for Findings not linked to JIRA issues"},"enable_notify_sla_exponential_backoff":{"type":"boolean","title":"Enable an exponential backoff strategy for SLA breach notifications.","description":"Enable an exponential backoff strategy for SLA breach notifications, e.g. 1, 2, 4, 8, etc. Otherwise it alerts every day"},"allow_anonymous_survey_repsonse":{"type":"boolean","title":"Allow Anonymous Survey Responses","description":"Enable anyone with a link to the survey to answer a survey"},"disclaimer_notifications":{"type":"string","title":"Custom Disclaimer for Notifications","description":"Include this custom disclaimer on all notifications","maxLength":3000},"disclaimer_reports":{"type":"string","title":"Custom Disclaimer for Reports","description":"Include this custom disclaimer on generated reports","maxLength":5000},"disclaimer_reports_forced":{"type":"boolean","title":"Force to add disclaimer reports","description":"Disclaimer will be added to all reports even if user didn't selected 'Include disclaimer'."},"disclaimer_notes":{"type":"string","title":"Custom Disclaimer for Notes","description":"Include this custom disclaimer next to input form for notes","maxLength":3000},"risk_acceptance_form_default_days":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"Default expiry period for risk acceptance form."},"risk_acceptance_notify_before_expiration":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Risk acceptance expiration heads up days","description":"Notify X days before risk acceptance expires. Leave empty to disable."},"enable_questionnaires":{"type":"boolean","description":"With this setting turned off, questionnaires will be disabled in the user interface."},"enable_checklists":{"type":"boolean","description":"With this setting turned off, checklists will be disabled in the user interface."},"enable_endpoint_metadata_import":{"type":"boolean","description":"With this setting turned off, endpoint metadata import will be disabled in the user interface."},"enable_user_profile_editable":{"type":"boolean","title":"Enable user profile for writing","description":"When turned on users can edit their profiles"},"enable_product_tracking_files":{"type":"boolean","description":"With this setting turned off, the product tracking files will be disabled in the user interface."},"enable_finding_groups":{"type":"boolean","description":"With this setting turned off, the Finding Groups will be disabled."},"enable_ui_table_based_searching":{"type":"boolean","title":"Enable UI Table Based Filtering/Sorting","description":"With this setting enabled, table headings will contain sort buttons for the current page of data in addition to sorting buttons that consider data from all pages."},"enable_calendar":{"type":"boolean","description":"With this setting turned off, the Calendar will be disabled in the user interface."},"enable_cvss3_display":{"type":"boolean","description":"With this setting turned off, CVSS3 fields will be hidden in the user interface."},"enable_cvss4_display":{"type":"boolean","description":"With this setting turned off, CVSS4 fields will be hidden in the user interface."},"minimum_password_length":{"type":"integer","maximum":48,"minimum":9,"description":"Requires user to set passwords greater than minimum length."},"maximum_password_length":{"type":"integer","maximum":48,"minimum":9,"description":"Requires user to set passwords less than maximum length."},"number_character_required":{"type":"boolean","title":"Password must contain one digit","description":"Requires user passwords to contain at least one digit (0-9)."},"special_character_required":{"type":"boolean","title":"Password must contain one special character","description":"Requires user passwords to contain at least one special character (()[]{}|\\`~!@#$%^&*_-+=;:'\",<>./?)."},"lowercase_character_required":{"type":"boolean","title":"Password must contain one lowercase letter","description":"Requires user passwords to contain at least one lowercase letter (a-z)."},"uppercase_character_required":{"type":"boolean","title":"Password must contain one uppercase letter","description":"Requires user passwords to contain at least one uppercase letter (A-Z)."},"non_common_password_required":{"type":"boolean","title":"Password must not be common","description":"Requires user passwords to not be part of list of common passwords."},"api_expose_error_details":{"type":"boolean","description":"When turned on, the API will expose error details in the response."},"filter_string_matching":{"type":"boolean","title":"Filter String Matching Optimization","description":"When turned on, all filter operations in the UI will require string matches rather than ID. This is a performance enhancement to avoid fetching objects unnecessarily."}}},"EnhancedUser":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"id":{"type":"integer","readOnly":true},"username":{"type":"string","description":"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.","pattern":"^[\\w.@+-]+$","maxLength":150},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150},"email":{"type":"string","format":"email","pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"},"date_joined":{"type":"string","format":"date-time","readOnly":true},"last_login":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"is_active":{"type":"boolean","title":"Active","description":"Designates whether this user should be treated as active. Unselect this instead of deleting accounts."},"is_staff":{"type":"boolean","title":"Staff status","description":"Designates whether the user can log into this admin site."},"is_superuser":{"type":"boolean","title":"Superuser status","description":"Designates that this user has all permissions without explicitly assigning them."},"token_last_reset":{"type":"string","format":"date-time","nullable":true,"readOnly":true},"token_expiry":{"type":"string","format":"date-time","nullable":true,"readOnly":true},"password_last_reset":{"type":"string","format":"date-time","nullable":true,"readOnly":true},"configuration_permissions":{"type":"array","items":{"type":"integer","nullable":true}}},"required":["date_joined","email","id","last_login","password_last_reset","token_expiry","token_last_reset","username"]},"EnhancedUserRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"username":{"type":"string","minLength":1,"description":"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.","pattern":"^[\\w.@+-]+$","maxLength":150},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150},"email":{"type":"string","format":"email","minLength":1,"pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"},"is_active":{"type":"boolean","title":"Active","description":"Designates whether this user should be treated as active. Unselect this instead of deleting accounts."},"is_staff":{"type":"boolean","title":"Staff status","description":"Designates whether the user can log into this admin site."},"is_superuser":{"type":"boolean","title":"Superuser status","description":"Designates that this user has all permissions without explicitly assigning them."},"password":{"type":"string","writeOnly":true,"minLength":1},"configuration_permissions":{"type":"array","items":{"type":"integer","nullable":true}}},"required":["email","username"]},"EvaluateRequestRequest":{"type":"object","properties":{"product":{"type":"integer","nullable":true}}},"EventRequest":{"type":"object","description":"``POST event`` — append one event to a run.","properties":{"trace_id":{"type":"string","format":"uuid"},"type":{"enum":["user","model_input","model_output","tool","environment","memory","system","error"],"type":"string","description":"* `user` - User\n* `model_input` - Model Input\n* `model_output` - Model Output\n* `tool` - Tool\n* `environment` - Environment\n* `memory` - Memory\n* `system` - System\n* `error` - Error","x-spec-enum-id":"d213754748ffeec0"},"content":{"type":"string","default":"","maxLength":20000},"event_schema":{"nullable":true},"timestamp":{"type":"string","format":"date-time","nullable":true}},"required":["trace_id","type"]},"EvidencePackArtifact":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"snapshot":{"type":"integer"},"kind":{"enum":["eu_evidence_xlsx","oscal_ar_json","cyclonedx_sbom_json"],"type":"string","description":"* `eu_evidence_xlsx` - EU evidence workbook (xlsx)\n* `oscal_ar_json` - OSCAL assessment results (json)\n* `cyclonedx_sbom_json` - Software bill of materials (CycloneDX json)","x-spec-enum-id":"a9db498899fb8f3b"},"kind_display":{"type":"string","readOnly":true},"sha256":{"type":"string","maxLength":64},"file_size":{"type":"integer","maximum":9223372036854775807,"minimum":0,"format":"int64"},"validation_status":{"enum":["schema_valid","not_validated",""],"type":"string","description":"* `schema_valid` - Validated against the OSCAL schema\n* `not_validated` - Not validated","x-spec-enum-id":"5a2342e87acfe267"},"validation_findings":{},"validated_at":{"type":"string","format":"date-time","nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true}},"required":["created_at","id","kind","kind_display","snapshot"]},"EvidencePackArtifactRequest":{"type":"object","description":"Base serializer for all models.","properties":{"snapshot":{"type":"integer"},"kind":{"enum":["eu_evidence_xlsx","oscal_ar_json","cyclonedx_sbom_json"],"type":"string","description":"* `eu_evidence_xlsx` - EU evidence workbook (xlsx)\n* `oscal_ar_json` - OSCAL assessment results (json)\n* `cyclonedx_sbom_json` - Software bill of materials (CycloneDX json)","x-spec-enum-id":"a9db498899fb8f3b"},"sha256":{"type":"string","maxLength":64},"file_size":{"type":"integer","maximum":9223372036854775807,"minimum":0,"format":"int64"},"validation_status":{"enum":["schema_valid","not_validated",""],"type":"string","description":"* `schema_valid` - Validated against the OSCAL schema\n* `not_validated` - Not validated","x-spec-enum-id":"5a2342e87acfe267"},"validation_findings":{},"validated_at":{"type":"string","format":"date-time","nullable":true}},"required":["kind","snapshot"]},"EvidencePackSnapshot":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"assessment":{"type":"integer","readOnly":true},"generated_by":{"type":"integer","readOnly":true,"nullable":true},"status":{"enum":["pending","processing","completed","failed"],"type":"string","description":"* `pending` - Pending\n* `processing` - Processing\n* `completed` - Completed\n* `failed` - Failed","x-spec-enum-id":"a8f61caf99619754","readOnly":true},"error_message":{"type":"string","readOnly":true},"completed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"metrics":{"readOnly":true},"artifacts":{"type":"array","items":{"$ref":"#/components/schemas/EvidencePackArtifact"},"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["artifacts","assessment","completed_at","created_at","error_message","generated_by","id","metrics","status","updated_at"]},"EvidencePackSnapshotDetail":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"assessment":{"type":"integer","readOnly":true},"generated_by":{"type":"integer","readOnly":true,"nullable":true},"status":{"enum":["pending","processing","completed","failed"],"type":"string","description":"* `pending` - Pending\n* `processing` - Processing\n* `completed` - Completed\n* `failed` - Failed","x-spec-enum-id":"a8f61caf99619754","readOnly":true},"error_message":{"type":"string","readOnly":true},"completed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"metrics":{"readOnly":true},"artifacts":{"type":"array","items":{"$ref":"#/components/schemas/EvidencePackArtifact"},"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"assessment_frozen":{}},"required":["artifacts","assessment","completed_at","created_at","error_message","generated_by","id","metrics","status","updated_at"]},"ExecPackSchedule":{"type":"object","description":"One user's standing order for the executive posture pack.\n\nThe owner is stamped server-side (never client-supplied), and the cadence\nday fields are validated in the same pairs the model's check constraints\nenforce, so a bad payload fails with a readable message instead of an\nIntegrityError.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"Display name, and the generated report's name prefix.","maxLength":100},"enabled":{"type":"boolean","description":"The unsubscribe switch. Disabled schedules are kept but never run."},"cadence":{"enum":["daily","weekly","monthly"],"type":"string","x-spec-enum-id":"4e3c483c900aad76","description":"How often the pack is generated.\n\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly"},"weekday":{"type":"integer","maximum":32767,"minimum":0,"nullable":true,"description":"0 (Monday) to 6 (Sunday). Required for the weekly cadence."},"day_of_month":{"type":"integer","maximum":32767,"minimum":0,"nullable":true,"description":"1 to 28, so every month qualifies. Required for the monthly cadence."},"hour_utc":{"type":"integer","maximum":32767,"minimum":0,"title":"Delivery Hour (UTC)","description":"The UTC hour the sweep generates and delivers the pack."},"window_days":{"type":"integer","maximum":32767,"minimum":0,"description":"How much history the pack summarizes."},"file_format":{"type":"string","description":"The generated artifact format.","maxLength":10},"last_run_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last Run Timestamp","description":"When the pack last generated. Used by the due sweep's idempotency guard."},"last_report_id":{"type":"integer","readOnly":true,"nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created."},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated."}},"required":["created_at","id","last_report_id","last_run_at","updated_at"]},"ExecPackScheduleRequest":{"type":"object","description":"One user's standing order for the executive posture pack.\n\nThe owner is stamped server-side (never client-supplied), and the cadence\nday fields are validated in the same pairs the model's check constraints\nenforce, so a bad payload fails with a readable message instead of an\nIntegrityError.","properties":{"name":{"type":"string","minLength":1,"description":"Display name, and the generated report's name prefix.","maxLength":100},"enabled":{"type":"boolean","description":"The unsubscribe switch. Disabled schedules are kept but never run."},"cadence":{"enum":["daily","weekly","monthly"],"type":"string","x-spec-enum-id":"4e3c483c900aad76","description":"How often the pack is generated.\n\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly"},"weekday":{"type":"integer","maximum":32767,"minimum":0,"nullable":true,"description":"0 (Monday) to 6 (Sunday). Required for the weekly cadence."},"day_of_month":{"type":"integer","maximum":32767,"minimum":0,"nullable":true,"description":"1 to 28, so every month qualifies. Required for the monthly cadence."},"hour_utc":{"type":"integer","maximum":32767,"minimum":0,"title":"Delivery Hour (UTC)","description":"The UTC hour the sweep generates and delivers the pack."},"window_days":{"type":"integer","maximum":32767,"minimum":0,"description":"How much history the pack summarizes."},"file_format":{"type":"string","minLength":1,"description":"The generated artifact format.","maxLength":10}}},"ExecutiveSummary":{"type":"object","properties":{"engagement_name":{"type":"string","maxLength":200},"engagement_target_start":{"type":"string","format":"date"},"engagement_target_end":{"type":"string","format":"date"},"test_type_name":{"type":"string","maxLength":200},"test_target_start":{"type":"string","format":"date-time"},"test_target_end":{"type":"string","format":"date-time"},"test_environment_name":{"type":"string","maxLength":200},"test_strategy_ref":{"oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]},"total_findings":{"type":"integer"}},"required":["engagement_name","engagement_target_end","engagement_target_start","test_environment_name","test_strategy_ref","test_target_end","test_target_start","test_type_name","total_findings"]},"ExpandNodeRequestRequest":{"type":"object","properties":{"node_id":{"type":"integer"},"depth":{"type":"integer","maximum":5,"minimum":1,"default":1},"limit":{"type":"integer","maximum":100,"minimum":1,"default":10},"offset":{"type":"integer","minimum":0,"default":0},"relationship_types":{"type":"array","items":{"type":"string","minLength":1}}},"required":["node_id"]},"ExpandNodeResponse":{"type":"object","properties":{"nodes":{"type":"array","items":{"$ref":"#/components/schemas/Node"}},"edges":{"type":"array","items":{"$ref":"#/components/schemas/Edge"}},"has_more":{"type":"boolean"},"total":{"type":"integer"}},"required":["edges","has_more","nodes","total"]},"ExpandedMapping":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"defectdojo_product_type_id":{"$ref":"#/components/schemas/MappingProductType"},"defectdojo_product_id":{"$ref":"#/components/schemas/MappingProduct"},"defectdojo_engagement_id":{"$ref":"#/components/schemas/MappingEngagement"},"subtypes":{"type":"array","items":{"$ref":"#/components/schemas/MappingSubtype"},"readOnly":true}},"required":["defectdojo_engagement_id","defectdojo_product_id","defectdojo_product_type_id","id","subtypes"]},"ExposureEvidenceRequest":{"type":"object","description":"One observation supporting a verdict. Every field is optional: sources differ in\nwhat they can say, and a Shodan banner and a Wiz resource carry different halves.","properties":{"channel":{"type":"string"},"ip":{"type":"string"},"port_range":{"type":"string"},"protocol":{"type":"string"},"url":{"type":"string"},"entity_name":{"type":"string"},"entity_type":{"type":"string"},"vendor_resource_id":{"type":"string"},"observed_at":{"type":"string"}}},"ExposureIngestResponse":{"type":"object","properties":{"run_id":{"type":"integer"},"received":{"type":"integer"},"matched_items":{"type":"integer"},"unmatched_items":{"type":"integer"},"match_rate":{"type":"number","format":"double"},"unmatched_sample":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["match_rate","matched_items","received","run_id","unmatched_items"]},"ExposureItemRequest":{"type":"object","description":"One exposure claim from a source.\n\n`verdict` is restricted to SOURCE_ASSERTABLE_VERDICTS, which excludes `internal_only`.\nThat is the wire half of the positive-tiers-only rule: a source that cannot tell an\nabsent field from a false one must not be able to assert isolation, and a rejection\nwith a machine-readable reason is a much better outcome than a wrong verdict that\nquietly dampens a live asset.","properties":{"verdict":{"enum":["exposed_limited","exposed_public","reachable_private"],"type":"string","description":"* `exposed_limited` - exposed_limited\n* `exposed_public` - exposed_public\n* `reachable_private` - reachable_private","x-spec-enum-id":"21c3fcc28c7caf87"},"confidence":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"default":1.0},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/ExposureEvidenceRequest"}}},"required":["verdict"]},"ExtendedConfigurationPermission":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255},"codename":{"type":"string","maxLength":100}},"required":["codename","id","name"]},"ExtendedUserContactInfo":{"type":"object","description":"Reject a language code the instance cannot serve.\n\nMix into any serializer that writes ``UserContactInfo.language``. Upstream\ndeclares the column without choices, so without this a typo is stored happily\nand then resolves to the instance default forever, which reads to the user as\n\"the setting did not save\".","properties":{"id":{"type":"integer","readOnly":true},"user_profile":{"allOf":[{"$ref":"#/components/schemas/User"}],"readOnly":true},"title":{"type":"string","nullable":true,"maxLength":150},"phone_number":{"description":"Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.","oneOf":[{"type":"string","pattern":"^\\+?1?\\d{9,15}$","maxLength":15},{"type":"string","maxLength":0}]},"cell_number":{"description":"Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.","oneOf":[{"type":"string","pattern":"^\\+?1?\\d{9,15}$","maxLength":15},{"type":"string","maxLength":0}]},"twitter_username":{"type":"string","nullable":true,"maxLength":150},"github_username":{"type":"string","nullable":true,"maxLength":150},"slack_username":{"type":"string","nullable":true,"title":"Slack Email Address","description":"Email address associated with your slack account","maxLength":150},"slack_user_id":{"type":"string","nullable":true,"maxLength":25},"block_execution":{"type":"boolean","description":"Instead of async deduping a finding the findings will be deduped synchronously and will 'block' the user until completion."},"deduplication_execution_mode":{"enum":["async","async_wait","sync","",null],"type":"string","x-spec-enum-id":"bf7fb8ff28520a46","nullable":true,"description":"Controls how import/reimport deduplication post-processing is executed. 'Async' dispatches it to the background and returns immediately (default). 'Async, wait for deduplication' dispatches to the background but waits for deduplication to finish before responding, so notifications and statistics reflect the deduplicated state. 'Synchronous' runs the import deduplication inline. Can be overridden per request. Independent of block_execution, which forces all async tasks (notifications, jira, ...) to the foreground.\n\n* `async` - Async (do not wait)\n* `async_wait` - Async, wait for deduplication\n* `sync` - Synchronous (block)"},"force_password_reset":{"type":"boolean","description":"Forces this user to reset their password on next login."},"token_last_reset":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of the most recent API token reset for this user."},"token_expiry":{"type":"string","format":"date-time","nullable":true,"description":"Explicit expiry for this user's API token. Overrides the instance-wide default from DD_API_TOKEN_DEFAULT_EXPIRY_DAYS. Leave empty to use that default. Once the effective expiry has passed the token is rejected at authentication."},"password_last_reset":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of the most recent password reset for this user."},"language":{"type":"string","description":"Preferred language for the DefectDojo UI. Leave blank to use the instance default.","maxLength":12},"user":{"type":"integer"},"prefetch":{"type":"object","properties":{"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["id","user","user_profile"]},"ExtendedUserContactInfoRequest":{"type":"object","description":"Reject a language code the instance cannot serve.\n\nMix into any serializer that writes ``UserContactInfo.language``. Upstream\ndeclares the column without choices, so without this a typo is stored happily\nand then resolves to the instance default forever, which reads to the user as\n\"the setting did not save\".","properties":{"title":{"type":"string","nullable":true,"maxLength":150},"phone_number":{"description":"Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.","oneOf":[{"type":"string","pattern":"^\\+?1?\\d{9,15}$","maxLength":15},{"type":"string","maxLength":0}]},"cell_number":{"description":"Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.","oneOf":[{"type":"string","pattern":"^\\+?1?\\d{9,15}$","maxLength":15},{"type":"string","maxLength":0}]},"twitter_username":{"type":"string","nullable":true,"maxLength":150},"github_username":{"type":"string","nullable":true,"maxLength":150},"slack_username":{"type":"string","nullable":true,"title":"Slack Email Address","description":"Email address associated with your slack account","maxLength":150},"slack_user_id":{"type":"string","nullable":true,"maxLength":25},"block_execution":{"type":"boolean","description":"Instead of async deduping a finding the findings will be deduped synchronously and will 'block' the user until completion."},"deduplication_execution_mode":{"enum":["async","async_wait","sync","",null],"type":"string","x-spec-enum-id":"bf7fb8ff28520a46","nullable":true,"description":"Controls how import/reimport deduplication post-processing is executed. 'Async' dispatches it to the background and returns immediately (default). 'Async, wait for deduplication' dispatches to the background but waits for deduplication to finish before responding, so notifications and statistics reflect the deduplicated state. 'Synchronous' runs the import deduplication inline. Can be overridden per request. Independent of block_execution, which forces all async tasks (notifications, jira, ...) to the foreground.\n\n* `async` - Async (do not wait)\n* `async_wait` - Async, wait for deduplication\n* `sync` - Synchronous (block)"},"force_password_reset":{"type":"boolean","description":"Forces this user to reset their password on next login."},"token_last_reset":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of the most recent API token reset for this user."},"token_expiry":{"type":"string","format":"date-time","nullable":true,"description":"Explicit expiry for this user's API token. Overrides the instance-wide default from DD_API_TOKEN_DEFAULT_EXPIRY_DAYS. Leave empty to use that default. Once the effective expiry has passed the token is rejected at authentication."},"password_last_reset":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of the most recent password reset for this user."},"language":{"type":"string","description":"Preferred language for the DefectDojo UI. Leave blank to use the instance default.","maxLength":12},"user":{"type":"integer"}},"required":["user"]},"FdaMetricsRequestRequest":{"type":"object","properties":{"window_days":{"enum":[30,90,365],"type":"integer","description":"* `30` - 30\n* `90` - 90\n* `365` - 365","x-spec-enum-id":"e9b2ed449ea4c0bb"}}},"FeatureFlag":{"type":"object","description":"Read serializer for the customer-facing admin list.","properties":{"key":{"type":"string","readOnly":true},"camel_alias":{"type":"string","readOnly":true},"title":{"type":"string","description":"The flag's title in the caller's language.\n\nThe stored value IS the msgid: the registry writes its English source into\nthe row (see `pro.features.sync`), and the catalog is looked up here, per\nrequest, rather than at sync time. Translating at sync time would freeze\nevery install in whichever language ran the deploy.\n\nAn untranslated string, or an install with no Pro catalogs at all, returns\nthe msgid, which is the English source. That is the same text the page\nshowed before any of this existed.","readOnly":true},"description":{"type":"string","description":"The flag's description in the caller's language. See `get_title`.","readOnly":true},"doc_url":{"type":"string","readOnly":true},"warnings":{"readOnly":true},"availability":{"type":"string","readOnly":true},"source":{"type":"string","readOnly":true},"env_setting":{"type":"string","readOnly":true},"reversible":{"type":"boolean","readOnly":true},"beta":{"type":"boolean","readOnly":true},"new":{"type":"boolean","readOnly":true},"default":{"type":"boolean","description":"Return the default value to use when validating data if no input\nis provided for this field.\n\nIf a default has not been set for this field then this will simply\nraise `SkipField`, indicating that no value should be set in the\nvalidated data for this field.","readOnly":true},"application_value":{"type":"boolean","nullable":true,"readOnly":true},"system_pinned":{"type":"boolean","readOnly":true},"effective":{"type":"boolean","readOnly":true},"editable":{"type":"boolean","readOnly":true},"locked_reason":{"type":"string","nullable":true,"readOnly":true},"requires_titles":{"type":"array","items":{"type":"string"},"description":"Registry titles of the flags this flag depends on, so the UI can name\nthe dependency behind a ``requires_unmet`` lock instead of a generic tag.","readOnly":true}},"required":["application_value","availability","beta","camel_alias","default","description","doc_url","editable","effective","env_setting","key","locked_reason","new","requires_titles","reversible","source","system_pinned","title","warnings"]},"File":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"file":{"type":"string","format":"uri"},"title":{"type":"string","maxLength":100}},"required":["file","id","title"]},"FileRequest":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"title":{"type":"string","minLength":1,"maxLength":100}},"required":["file","title"]},"Finding":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"mitigated":{"type":"string","format":"date-time","nullable":true},"mitigated_by":{"type":"integer","nullable":true},"request_response":{"allOf":[{"$ref":"#/components/schemas/BurpRawRequestResponse"}],"readOnly":true},"accepted_risks":{"type":"array","items":{"$ref":"#/components/schemas/RiskAcceptance"},"readOnly":true},"push_to_jira":{"type":"boolean","default":false},"found_by":{"type":"array","items":{"type":"integer"}},"age":{"type":"integer","readOnly":true},"sla_days_remaining":{"type":"integer","readOnly":true,"nullable":true},"finding_meta":{"type":"array","items":{"$ref":"#/components/schemas/FindingMeta"},"readOnly":true},"related_fields":{"allOf":[{"$ref":"#/components/schemas/FindingRelatedFields"}],"readOnly":true,"nullable":true},"test_type_name":{"type":"string","readOnly":true,"nullable":true},"jira_creation":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"jira_change":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"display_status":{"type":"string","readOnly":true},"finding_groups":{"type":"array","items":{"$ref":"#/components/schemas/FindingGroup"},"readOnly":true},"vulnerability_ids":{"type":"array","items":{"$ref":"#/components/schemas/VulnerabilityId"}},"cwes":{"type":"array","items":{"$ref":"#/components/schemas/FindingCwe"}},"reporter":{"type":"integer"},"endpoints":{"type":"array","items":{"type":"integer"}},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"title":{"type":"string","description":"A short description of the flaw.","maxLength":511},"date":{"type":"string","format":"date","description":"The date the flaw was discovered."},"sla_start_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date used as start date for SLA calculation. Set by expiring risk acceptances. Empty by default, causing a fallback to 'date'."},"sla_expiration_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date SLA expires for this finding. Empty by default, causing a fallback to 'date'."},"cwe":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"The CWE number associated with this flaw."},"epss_score":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS score for the CVE. Describes how likely it is the vulnerability will be exploited in the next 30 days."},"epss_percentile":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS percentile for the CVE. Describes how many CVEs are scored at or below this one."},"known_exploited":{"type":"boolean","description":"Whether this vulnerability is known to have been exploited in the wild."},"ransomware_used":{"type":"boolean","title":"Used in Ransomware","description":"Whether this vulnerability is known to have been leveraged as part of a ransomware campaign."},"kev_date":{"type":"string","format":"date","nullable":true,"title":"KEV Date Added","description":"The date the vulnerability was added to the KEV catalog."},"cvssv3":{"type":"string","nullable":true,"title":"CVSS3 Vector","description":"Common Vulnerability Scoring System version 3 (CVSS3) score associated with this finding.","maxLength":117},"cvssv3_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"title":"CVSS3 Score","description":"Numerical CVSSv3 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"cvssv4":{"type":"string","nullable":true,"title":"CVSS4 vector","description":"Common Vulnerability Scoring System version 4 (CVSS4) score associated with this finding.","maxLength":255},"cvssv4_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"description":"Numerical CVSSv4 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"url":{"type":"string","readOnly":true,"nullable":true,"description":"External reference that provides more information about this flaw."},"severity":{"type":"string","description":"The severity level of this flaw (Critical, High, Medium, Low, Info).","maxLength":200},"description":{"type":"string","description":"Longer more descriptive information about the flaw."},"mitigation":{"type":"string","nullable":true,"description":"Text describing how to best fix the flaw."},"fix_available":{"type":"boolean","nullable":true,"description":"Denotes if there is a fix available for this flaw."},"fix_version":{"type":"string","nullable":true,"description":"Version of the affected component in which the flaw is fixed.","maxLength":100},"impact":{"type":"string","nullable":true,"description":"Text describing the impact this flaw has on systems, products, enterprise, etc."},"steps_to_reproduce":{"type":"string","nullable":true,"description":"Text describing the steps that must be followed in order to reproduce the flaw / bug."},"severity_justification":{"type":"string","nullable":true,"description":"Text describing why a certain severity was associated with this flaw."},"references":{"type":"string","nullable":true,"description":"The external documentation available for this flaw."},"active":{"type":"boolean","description":"Denotes if this flaw is active or not."},"verified":{"type":"boolean","description":"Denotes if this flaw has been manually verified by the tester."},"false_p":{"type":"boolean","title":"False Positive","description":"Denotes if this flaw has been deemed a false positive by the tester."},"duplicate":{"type":"boolean","description":"Denotes if this flaw is a duplicate of other flaws reported."},"out_of_scope":{"type":"boolean","description":"Denotes if this flaw falls outside the scope of the test and/or engagement."},"risk_accepted":{"type":"boolean","description":"Denotes if this finding has been marked as an accepted risk."},"under_review":{"type":"boolean","description":"Denotes is this flaw is currently being reviewed."},"last_status_update":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Timestamp of latest status update (change in status related fields)."},"under_defect_review":{"type":"boolean","description":"Denotes if this finding is under defect review."},"is_mitigated":{"type":"boolean","description":"Denotes if this flaw has been fixed."},"thread_id":{"type":"integer","readOnly":true},"numerical_severity":{"type":"string","description":"The numerical representation of the severity (S0, S1, S2, S3, S4).","maxLength":4},"last_reviewed":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Provides the date the flaw was last 'touched' by a tester."},"param":{"type":"string","readOnly":true,"nullable":true,"title":"Parameter","description":"Parameter used to trigger the issue (DAST)."},"payload":{"type":"string","readOnly":true,"nullable":true,"description":"Payload used to attack the service / application and trigger the bug / problem."},"hash_code":{"type":"string","readOnly":true,"nullable":true,"description":"A hash over a configurable set of fields that is used for findings deduplication."},"line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Line number","description":"Source line number of the attack vector."},"file_path":{"type":"string","nullable":true,"description":"Identified file(s) containing the flaw.","maxLength":4000},"component_name":{"type":"string","nullable":true,"description":"Name of the affected component (library name, part of a system, ...).","maxLength":500},"component_version":{"type":"string","nullable":true,"description":"Version of the affected component.","maxLength":100},"static_finding":{"type":"boolean","title":"Static finding (SAST)","description":"Flaw has been detected from a Static Application Security Testing tool (SAST)."},"dynamic_finding":{"type":"boolean","title":"Dynamic finding (DAST)","description":"Flaw has been detected from a Dynamic Application Security Testing tool (DAST)."},"scanner_confidence":{"type":"integer","readOnly":true,"nullable":true,"description":"Confidence level of vulnerability which is supplied by the scanner."},"unique_id_from_tool":{"type":"string","nullable":true,"description":"Vulnerability technical id from the source tool. Allows to track unique vulnerabilities over time across subsequent scans.","maxLength":500},"vuln_id_from_tool":{"type":"string","nullable":true,"title":"Vulnerability ID from tool","description":"Non-unique technical id from the source tool associated with the vulnerability type.","maxLength":500},"sast_source_object":{"type":"string","nullable":true,"description":"Source object (variable, function...) of the attack vector.","maxLength":500},"sast_sink_object":{"type":"string","nullable":true,"description":"Sink object (variable, function...) of the attack vector.","maxLength":500},"sast_source_line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"SAST Source Line number","description":"Source line number of the attack vector."},"sast_source_file_path":{"type":"string","nullable":true,"description":"Source file path of the attack vector.","maxLength":4000},"nb_occurences":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of occurences","description":"Number of occurences in the source tool when several vulnerabilites were found and aggregated by the scanner."},"publish_date":{"type":"string","format":"date","nullable":true,"description":"Date when this vulnerability was made publicly available."},"service":{"type":"string","nullable":true,"description":"A service is a self-contained piece of functionality within a Product. This is an optional field which is used in deduplication of findings when set.","maxLength":200},"planned_remediation_date":{"type":"string","format":"date","nullable":true,"description":"The date the flaw is expected to be remediated."},"planned_remediation_version":{"type":"string","nullable":true,"description":"The target version when the vulnerability should be fixed / remediated","maxLength":99},"effort_for_fixing":{"type":"string","nullable":true,"description":"Effort for fixing / remediating the vulnerability (Low, Medium, High)","maxLength":99},"test":{"type":"integer","readOnly":true,"description":"The test that is associated with this flaw."},"duplicate_finding":{"type":"integer","readOnly":true,"nullable":true,"description":"Link to the original finding if this finding is a duplicate."},"review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a review for this finding."},"defect_review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a defect review for this flaw."},"last_reviewed_by":{"type":"integer","readOnly":true,"nullable":true,"description":"Provides the person who last reviewed the flaw."},"sonarqube_issue":{"type":"integer","readOnly":true,"nullable":true,"description":"The SonarQube issue associated with this finding."},"reviewers":{"type":"array","items":{"type":"integer"},"description":"Documents who reviewed the flaw."},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"},"readOnly":true},"files":{"type":"array","items":{"type":"integer"},"readOnly":true,"description":"Files(s) related to the flaw."},"tags":{"type":"array","items":{"type":"string"}}},"required":["accepted_risks","age","created","description","display_status","duplicate_finding","files","finding_groups","finding_meta","found_by","hash_code","id","jira_change","jira_creation","last_reviewed","last_reviewed_by","last_status_update","notes","numerical_severity","param","payload","related_fields","request_response","scanner_confidence","severity","sla_days_remaining","sonarqube_issue","test","test_type_name","thread_id","title","updated","url"]},"FindingClose":{"type":"object","properties":{"is_mitigated":{"type":"boolean"},"mitigated":{"type":"string","format":"date-time"},"false_p":{"type":"boolean"},"out_of_scope":{"type":"boolean"},"duplicate":{"type":"boolean"},"mitigated_by":{"type":"integer","nullable":true},"note":{"type":"string"},"note_type":{"type":"integer","nullable":true}}},"FindingCloseRequest":{"type":"object","properties":{"is_mitigated":{"type":"boolean"},"mitigated":{"type":"string","format":"date-time"},"false_p":{"type":"boolean"},"out_of_scope":{"type":"boolean"},"duplicate":{"type":"boolean"},"mitigated_by":{"type":"integer","nullable":true},"note":{"type":"string"},"note_type":{"type":"integer","nullable":true}}},"FindingControlMap":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"finding":{"type":"integer","description":"The finding this mapping belongs to"},"control":{"type":"integer","description":"The mapped security control"},"control_label":{"type":"string","readOnly":true},"control_title":{"type":"string","readOnly":true},"catalog_name":{"type":"string","readOnly":true},"source":{"enum":["default_rule","scanner","manual","crosswalk","classifier"],"type":"string","x-spec-enum-id":"2080f273f46fcb47","readOnly":true,"description":"How this mapping was produced\n\n* `default_rule` - Default rule\n* `scanner` - Scanner-provided\n* `manual` - Manual\n* `crosswalk` - Crosswalk suggestion\n* `classifier` - Suggested"},"confidence":{"type":"integer","maximum":32767,"minimum":0,"nullable":true,"description":"Confidence (0-100) for automated mappings; blank for manual ones"},"suppressed":{"type":"boolean","description":"Manual tombstone: automation must never re-create or re-enable this mapping"},"created_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who created this mapping, when created manually"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["catalog_name","control","control_label","control_title","created_at","created_by","finding","id","source","updated_at"]},"FindingControlMapRequest":{"type":"object","description":"Base serializer for all models.","properties":{"finding":{"type":"integer","description":"The finding this mapping belongs to"},"control":{"type":"integer","description":"The mapped security control"},"confidence":{"type":"integer","maximum":32767,"minimum":0,"nullable":true,"description":"Confidence (0-100) for automated mappings; blank for manual ones"},"suppressed":{"type":"boolean","description":"Manual tombstone: automation must never re-create or re-enable this mapping"}},"required":["control","finding"]},"FindingCreate":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"mitigated":{"type":"string","format":"date-time","nullable":true},"mitigated_by":{"type":"integer","nullable":true},"notes":{"type":"array","items":{"type":"integer","nullable":true},"readOnly":true},"test":{"type":"integer"},"thread_id":{"type":"integer","default":0},"found_by":{"type":"array","items":{"type":"integer"}},"url":{"type":"string","nullable":true},"push_to_jira":{"type":"boolean","default":false},"vulnerability_ids":{"type":"array","items":{"$ref":"#/components/schemas/VulnerabilityId"}},"cwes":{"type":"array","items":{"$ref":"#/components/schemas/FindingCwe"}},"reporter":{"type":"integer"},"priority":{"type":"number","format":"double","minimum":0,"nullable":true,"description":"The priority in which a finding should be considered for mitigation next"},"risk":{"enum":["Low","Medium","Needs Action","Urgent",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"The risk score in which a finding poses to the system it was discovered on\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"overridden_priority_risk_calculation":{"type":"boolean","default":false,"description":"Dictates whether this object has had its priority/risk calculation manually overridden. If true, the priority and risk values will not be automatically recalculated again until this setting is set to false."},"reachability":{"enum":["reachable_runtime","reachable_static","potentially_reachable","unreachable","unknown"],"type":"string","x-spec-enum-id":"eb84ddc6bfeee7ca","readOnly":true,"description":"The resolved reachability verdict for this finding, rolled up across all verdict sources and the finding's deduplication cluster.\n\n* `reachable_runtime` - Reachable (runtime)\n* `reachable_static` - Reachable (static)\n* `potentially_reachable` - Potentially reachable\n* `unreachable` - Unreachable\n* `unknown` - Unknown"},"reachability_evidence":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true,"description":"Ordered call-chain frames ({file, line, symbol}) from the winning reachability verdict."},"owners":{"type":"integer","nullable":true,"description":"The group of users responsible for this finding (Dojo_Group ID)."},"has_pending_exception":{"type":"boolean","readOnly":true,"default":false},"mitigation_policy":{"type":"integer","nullable":true,"description":"The standardized mitigation policy for this finding"},"vex_state":{"enum":["resolved","resolved_with_pedigree","exploitable","in_triage","false_positive","not_affected",null],"type":"string","x-spec-enum-id":"920cf602d3fa96ef","nullable":true,"description":"CycloneDX VEX analysis state — the exploitability verdict for this finding.\n\n* `resolved` - Resolved\n* `resolved_with_pedigree` - Resolved with Pedigree\n* `exploitable` - Exploitable\n* `in_triage` - In Triage\n* `false_positive` - False Positive\n* `not_affected` - Not Affected"},"vex_justification":{"enum":["code_not_present","code_not_reachable","requires_configuration","requires_dependency","requires_environment","protected_by_compiler","protected_at_runtime","protected_at_perimeter","protected_by_mitigating_control",null],"type":"string","x-spec-enum-id":"b2a6243bea66a552","nullable":true,"description":"CycloneDX VEX justification for why the finding does not affect the product; only meaningful when vex_state is 'not_affected'.\n\n* `code_not_present` - Code Not Present\n* `code_not_reachable` - Code Not Reachable\n* `requires_configuration` - Requires Configuration\n* `requires_dependency` - Requires Dependency\n* `requires_environment` - Requires Environment\n* `protected_by_compiler` - Protected by Compiler\n* `protected_at_runtime` - Protected at Runtime\n* `protected_at_perimeter` - Protected at Perimeter\n* `protected_by_mitigating_control` - Protected by Mitigating Control"},"vex_responses":{"type":"array","items":{"enum":["can_not_fix","will_not_fix","update","rollback","workaround_available"],"type":"string","description":"* `can_not_fix` - Can Not Fix\n* `will_not_fix` - Will Not Fix\n* `update` - Update\n* `rollback` - Rollback\n* `workaround_available` - Workaround Available","x-spec-enum-id":"42daaa5a4bd38bca"},"nullable":true,"description":"CycloneDX VEX responses — how the vendor intends to respond to the vulnerability."},"vex_detail":{"type":"string","nullable":true,"description":"Free-text elaboration on the VEX analysis, shared verbatim in VEX exports."},"exploit_maturity":{"enum":[0,10,20,30,null],"type":"integer","x-spec-enum-id":"01909932fa04343b","nullable":true,"description":"Exploit maturity (0 None / 10 PoC / 20 Weaponized / 30 Active in the wild). Editable for manual enrichment; the threat-intel sync overwrites it for findings that reference an enriched vulnerability id, so a hand-entered value is durable only on findings with no matching intel. Send null to clear it.\n\n* `0` - None\n* `10` - Proof-of-Concept\n* `20` - Weaponized\n* `30` - Active in the wild"},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"connector_push_result":{"allOf":[{"$ref":"#/components/schemas/ConnectorPushResult"}],"nullable":true,"readOnly":true},"endpoints":{"type":"array","items":{"type":"integer"}},"endpoints_to_add":{"type":"string","nullable":true,"description":"A space deliminated list of endpoints that will be added to this Finding."},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"title":{"type":"string","description":"A short description of the flaw.","maxLength":511},"date":{"type":"string","format":"date","description":"The date the flaw was discovered."},"sla_start_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date used as start date for SLA calculation. Set by expiring risk acceptances. Empty by default, causing a fallback to 'date'."},"sla_expiration_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date SLA expires for this finding. Empty by default, causing a fallback to 'date'."},"cwe":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"The CWE number associated with this flaw."},"epss_score":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS score for the CVE. Describes how likely it is the vulnerability will be exploited in the next 30 days."},"epss_percentile":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS percentile for the CVE. Describes how many CVEs are scored at or below this one."},"known_exploited":{"type":"boolean","description":"Whether this vulnerability is known to have been exploited in the wild."},"ransomware_used":{"type":"boolean","title":"Used in Ransomware","description":"Whether this vulnerability is known to have been leveraged as part of a ransomware campaign."},"kev_date":{"type":"string","format":"date","nullable":true,"title":"KEV Date Added","description":"The date the vulnerability was added to the KEV catalog."},"cvssv3":{"type":"string","nullable":true,"title":"CVSS3 Vector","description":"Common Vulnerability Scoring System version 3 (CVSS3) score associated with this finding.","maxLength":117},"cvssv3_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"title":"CVSS3 Score","description":"Numerical CVSSv3 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"cvssv4":{"type":"string","nullable":true,"title":"CVSS4 vector","description":"Common Vulnerability Scoring System version 4 (CVSS4) score associated with this finding.","maxLength":255},"cvssv4_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"description":"Numerical CVSSv4 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"severity":{"type":"string","description":"The severity level of this flaw (Critical, High, Medium, Low, Info).","maxLength":200},"description":{"type":"string","description":"Longer more descriptive information about the flaw."},"mitigation":{"type":"string","nullable":true,"description":"Text describing how to best fix the flaw."},"fix_available":{"type":"boolean","nullable":true,"description":"Denotes if there is a fix available for this flaw."},"fix_version":{"type":"string","nullable":true,"description":"Version of the affected component in which the flaw is fixed.","maxLength":100},"impact":{"type":"string","nullable":true,"description":"Text describing the impact this flaw has on systems, products, enterprise, etc."},"steps_to_reproduce":{"type":"string","nullable":true,"description":"Text describing the steps that must be followed in order to reproduce the flaw / bug."},"severity_justification":{"type":"string","nullable":true,"description":"Text describing why a certain severity was associated with this flaw."},"references":{"type":"string","nullable":true,"description":"The external documentation available for this flaw."},"active":{"type":"boolean","description":"Denotes if this flaw is active or not."},"verified":{"type":"boolean","description":"Denotes if this flaw has been manually verified by the tester."},"false_p":{"type":"boolean","title":"False Positive","description":"Denotes if this flaw has been deemed a false positive by the tester."},"duplicate":{"type":"boolean","description":"Denotes if this flaw is a duplicate of other flaws reported."},"out_of_scope":{"type":"boolean","description":"Denotes if this flaw falls outside the scope of the test and/or engagement."},"risk_accepted":{"type":"boolean","description":"Denotes if this finding has been marked as an accepted risk."},"under_review":{"type":"boolean","description":"Denotes is this flaw is currently being reviewed."},"last_status_update":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Timestamp of latest status update (change in status related fields)."},"under_defect_review":{"type":"boolean","description":"Denotes if this finding is under defect review."},"is_mitigated":{"type":"boolean","description":"Denotes if this flaw has been fixed."},"numerical_severity":{"type":"string","description":"The numerical representation of the severity (S0, S1, S2, S3, S4).","maxLength":4},"last_reviewed":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Provides the date the flaw was last 'touched' by a tester."},"param":{"type":"string","readOnly":true,"nullable":true,"title":"Parameter","description":"Parameter used to trigger the issue (DAST)."},"payload":{"type":"string","readOnly":true,"nullable":true,"description":"Payload used to attack the service / application and trigger the bug / problem."},"hash_code":{"type":"string","readOnly":true,"nullable":true,"description":"A hash over a configurable set of fields that is used for findings deduplication."},"line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Line number","description":"Source line number of the attack vector."},"file_path":{"type":"string","nullable":true,"description":"Identified file(s) containing the flaw.","maxLength":4000},"component_name":{"type":"string","nullable":true,"description":"Name of the affected component (library name, part of a system, ...).","maxLength":500},"component_version":{"type":"string","nullable":true,"description":"Version of the affected component.","maxLength":100},"static_finding":{"type":"boolean","title":"Static finding (SAST)","description":"Flaw has been detected from a Static Application Security Testing tool (SAST)."},"dynamic_finding":{"type":"boolean","title":"Dynamic finding (DAST)","description":"Flaw has been detected from a Dynamic Application Security Testing tool (DAST)."},"scanner_confidence":{"type":"integer","readOnly":true,"nullable":true,"description":"Confidence level of vulnerability which is supplied by the scanner."},"unique_id_from_tool":{"type":"string","nullable":true,"description":"Vulnerability technical id from the source tool. Allows to track unique vulnerabilities over time across subsequent scans.","maxLength":500},"vuln_id_from_tool":{"type":"string","nullable":true,"title":"Vulnerability ID from tool","description":"Non-unique technical id from the source tool associated with the vulnerability type.","maxLength":500},"sast_source_object":{"type":"string","nullable":true,"description":"Source object (variable, function...) of the attack vector.","maxLength":500},"sast_sink_object":{"type":"string","nullable":true,"description":"Sink object (variable, function...) of the attack vector.","maxLength":500},"sast_source_line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"SAST Source Line number","description":"Source line number of the attack vector."},"sast_source_file_path":{"type":"string","nullable":true,"description":"Source file path of the attack vector.","maxLength":4000},"nb_occurences":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of occurences","description":"Number of occurences in the source tool when several vulnerabilites were found and aggregated by the scanner."},"publish_date":{"type":"string","format":"date","nullable":true,"description":"Date when this vulnerability was made publicly available."},"service":{"type":"string","nullable":true,"description":"A service is a self-contained piece of functionality within a Product. This is an optional field which is used in deduplication of findings when set.","maxLength":200},"planned_remediation_date":{"type":"string","format":"date","nullable":true,"description":"The date the flaw is expected to be remediated."},"planned_remediation_version":{"type":"string","nullable":true,"description":"The target version when the vulnerability should be fixed / remediated","maxLength":99},"effort_for_fixing":{"type":"string","nullable":true,"description":"Effort for fixing / remediating the vulnerability (Low, Medium, High)","maxLength":99},"duplicate_finding":{"type":"integer","readOnly":true,"nullable":true,"description":"Link to the original finding if this finding is a duplicate."},"review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a review for this finding."},"defect_review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a defect review for this flaw."},"last_reviewed_by":{"type":"integer","readOnly":true,"nullable":true,"description":"Provides the person who last reviewed the flaw."},"sonarqube_issue":{"type":"integer","readOnly":true,"nullable":true,"description":"The SonarQube issue associated with this finding."},"reviewers":{"type":"array","items":{"type":"integer"},"description":"Documents who reviewed the flaw."},"files":{"type":"array","items":{"type":"integer"},"readOnly":true,"description":"Files(s) related to the flaw."},"tags":{"type":"array","items":{"type":"string"}}},"required":["active","connector_push_result","created","description","duplicate_finding","files","found_by","has_pending_exception","hash_code","id","last_reviewed","last_reviewed_by","last_status_update","notes","numerical_severity","param","payload","reachability","reachability_evidence","scanner_confidence","severity","sonarqube_issue","test","title","updated","verified"]},"FindingCreateRequest":{"type":"object","description":"Base serializer for all models.","properties":{"mitigated":{"type":"string","format":"date-time","nullable":true},"mitigated_by":{"type":"integer","nullable":true},"test":{"type":"integer"},"thread_id":{"type":"integer","default":0},"found_by":{"type":"array","items":{"type":"integer"}},"url":{"type":"string","nullable":true,"minLength":1},"push_to_jira":{"type":"boolean","default":false},"vulnerability_ids":{"type":"array","items":{"$ref":"#/components/schemas/VulnerabilityIdRequest"}},"cwes":{"type":"array","items":{"$ref":"#/components/schemas/FindingCweRequest"}},"reporter":{"type":"integer"},"priority":{"type":"number","format":"double","minimum":0,"nullable":true,"description":"The priority in which a finding should be considered for mitigation next"},"risk":{"enum":["Low","Medium","Needs Action","Urgent",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"The risk score in which a finding poses to the system it was discovered on\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"overridden_priority_risk_calculation":{"type":"boolean","default":false,"description":"Dictates whether this object has had its priority/risk calculation manually overridden. If true, the priority and risk values will not be automatically recalculated again until this setting is set to false."},"owners":{"type":"integer","nullable":true,"description":"The group of users responsible for this finding (Dojo_Group ID)."},"mitigation_policy":{"type":"integer","nullable":true,"description":"The standardized mitigation policy for this finding"},"vex_state":{"enum":["resolved","resolved_with_pedigree","exploitable","in_triage","false_positive","not_affected",null],"type":"string","x-spec-enum-id":"920cf602d3fa96ef","nullable":true,"description":"CycloneDX VEX analysis state — the exploitability verdict for this finding.\n\n* `resolved` - Resolved\n* `resolved_with_pedigree` - Resolved with Pedigree\n* `exploitable` - Exploitable\n* `in_triage` - In Triage\n* `false_positive` - False Positive\n* `not_affected` - Not Affected"},"vex_justification":{"enum":["code_not_present","code_not_reachable","requires_configuration","requires_dependency","requires_environment","protected_by_compiler","protected_at_runtime","protected_at_perimeter","protected_by_mitigating_control",null],"type":"string","x-spec-enum-id":"b2a6243bea66a552","nullable":true,"description":"CycloneDX VEX justification for why the finding does not affect the product; only meaningful when vex_state is 'not_affected'.\n\n* `code_not_present` - Code Not Present\n* `code_not_reachable` - Code Not Reachable\n* `requires_configuration` - Requires Configuration\n* `requires_dependency` - Requires Dependency\n* `requires_environment` - Requires Environment\n* `protected_by_compiler` - Protected by Compiler\n* `protected_at_runtime` - Protected at Runtime\n* `protected_at_perimeter` - Protected at Perimeter\n* `protected_by_mitigating_control` - Protected by Mitigating Control"},"vex_responses":{"type":"array","items":{"enum":["can_not_fix","will_not_fix","update","rollback","workaround_available"],"type":"string","description":"* `can_not_fix` - Can Not Fix\n* `will_not_fix` - Will Not Fix\n* `update` - Update\n* `rollback` - Rollback\n* `workaround_available` - Workaround Available","x-spec-enum-id":"42daaa5a4bd38bca"},"nullable":true,"description":"CycloneDX VEX responses — how the vendor intends to respond to the vulnerability."},"vex_detail":{"type":"string","nullable":true,"description":"Free-text elaboration on the VEX analysis, shared verbatim in VEX exports."},"exploit_maturity":{"enum":[0,10,20,30,null],"type":"integer","x-spec-enum-id":"01909932fa04343b","nullable":true,"description":"Exploit maturity (0 None / 10 PoC / 20 Weaponized / 30 Active in the wild). Editable for manual enrichment; the threat-intel sync overwrites it for findings that reference an enriched vulnerability id, so a hand-entered value is durable only on findings with no matching intel. Send null to clear it.\n\n* `0` - None\n* `10` - Proof-of-Concept\n* `20` - Weaponized\n* `30` - Active in the wild"},"reachability_override":{"enum":["reachable_runtime","reachable_static","potentially_reachable","unreachable","unknown",null],"type":"string","x-spec-enum-id":"eb84ddc6bfeee7ca","writeOnly":true,"nullable":true,"description":"Set a manual reachability verdict when no scanner supplies one. Recorded as a 'manual' verdict source; a stronger scanner verdict overrides it in the resolved value returned by the read-only 'reachability' field. Send null to clear the manual override.\n\n* `reachable_runtime` - Reachable (runtime)\n* `reachable_static` - Reachable (static)\n* `potentially_reachable` - Potentially reachable\n* `unreachable` - Unreachable\n* `unknown` - Unknown"},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"endpoints":{"type":"array","items":{"type":"integer"}},"endpoints_to_add":{"type":"string","nullable":true,"minLength":1,"description":"A space deliminated list of endpoints that will be added to this Finding."},"title":{"type":"string","minLength":1,"description":"A short description of the flaw.","maxLength":511},"date":{"type":"string","format":"date","description":"The date the flaw was discovered."},"sla_start_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date used as start date for SLA calculation. Set by expiring risk acceptances. Empty by default, causing a fallback to 'date'."},"sla_expiration_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date SLA expires for this finding. Empty by default, causing a fallback to 'date'."},"cwe":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"The CWE number associated with this flaw."},"epss_score":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS score for the CVE. Describes how likely it is the vulnerability will be exploited in the next 30 days."},"epss_percentile":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS percentile for the CVE. Describes how many CVEs are scored at or below this one."},"known_exploited":{"type":"boolean","description":"Whether this vulnerability is known to have been exploited in the wild."},"ransomware_used":{"type":"boolean","title":"Used in Ransomware","description":"Whether this vulnerability is known to have been leveraged as part of a ransomware campaign."},"kev_date":{"type":"string","format":"date","nullable":true,"title":"KEV Date Added","description":"The date the vulnerability was added to the KEV catalog."},"cvssv3":{"type":"string","nullable":true,"minLength":1,"title":"CVSS3 Vector","description":"Common Vulnerability Scoring System version 3 (CVSS3) score associated with this finding.","maxLength":117},"cvssv3_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"title":"CVSS3 Score","description":"Numerical CVSSv3 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"cvssv4":{"type":"string","nullable":true,"minLength":1,"title":"CVSS4 vector","description":"Common Vulnerability Scoring System version 4 (CVSS4) score associated with this finding.","maxLength":255},"cvssv4_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"description":"Numerical CVSSv4 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"severity":{"type":"string","minLength":1,"description":"The severity level of this flaw (Critical, High, Medium, Low, Info).","maxLength":200},"description":{"type":"string","minLength":1,"description":"Longer more descriptive information about the flaw."},"mitigation":{"type":"string","nullable":true,"description":"Text describing how to best fix the flaw."},"fix_available":{"type":"boolean","nullable":true,"description":"Denotes if there is a fix available for this flaw."},"fix_version":{"type":"string","nullable":true,"description":"Version of the affected component in which the flaw is fixed.","maxLength":100},"impact":{"type":"string","nullable":true,"description":"Text describing the impact this flaw has on systems, products, enterprise, etc."},"steps_to_reproduce":{"type":"string","nullable":true,"description":"Text describing the steps that must be followed in order to reproduce the flaw / bug."},"severity_justification":{"type":"string","nullable":true,"description":"Text describing why a certain severity was associated with this flaw."},"references":{"type":"string","nullable":true,"description":"The external documentation available for this flaw."},"active":{"type":"boolean","description":"Denotes if this flaw is active or not."},"verified":{"type":"boolean","description":"Denotes if this flaw has been manually verified by the tester."},"false_p":{"type":"boolean","title":"False Positive","description":"Denotes if this flaw has been deemed a false positive by the tester."},"duplicate":{"type":"boolean","description":"Denotes if this flaw is a duplicate of other flaws reported."},"out_of_scope":{"type":"boolean","description":"Denotes if this flaw falls outside the scope of the test and/or engagement."},"risk_accepted":{"type":"boolean","description":"Denotes if this finding has been marked as an accepted risk."},"under_review":{"type":"boolean","description":"Denotes is this flaw is currently being reviewed."},"under_defect_review":{"type":"boolean","description":"Denotes if this finding is under defect review."},"is_mitigated":{"type":"boolean","description":"Denotes if this flaw has been fixed."},"numerical_severity":{"type":"string","minLength":1,"description":"The numerical representation of the severity (S0, S1, S2, S3, S4).","maxLength":4},"line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Line number","description":"Source line number of the attack vector."},"file_path":{"type":"string","nullable":true,"description":"Identified file(s) containing the flaw.","maxLength":4000},"component_name":{"type":"string","nullable":true,"description":"Name of the affected component (library name, part of a system, ...).","maxLength":500},"component_version":{"type":"string","nullable":true,"description":"Version of the affected component.","maxLength":100},"static_finding":{"type":"boolean","title":"Static finding (SAST)","description":"Flaw has been detected from a Static Application Security Testing tool (SAST)."},"dynamic_finding":{"type":"boolean","title":"Dynamic finding (DAST)","description":"Flaw has been detected from a Dynamic Application Security Testing tool (DAST)."},"unique_id_from_tool":{"type":"string","nullable":true,"description":"Vulnerability technical id from the source tool. Allows to track unique vulnerabilities over time across subsequent scans.","maxLength":500},"vuln_id_from_tool":{"type":"string","nullable":true,"title":"Vulnerability ID from tool","description":"Non-unique technical id from the source tool associated with the vulnerability type.","maxLength":500},"sast_source_object":{"type":"string","nullable":true,"description":"Source object (variable, function...) of the attack vector.","maxLength":500},"sast_sink_object":{"type":"string","nullable":true,"description":"Sink object (variable, function...) of the attack vector.","maxLength":500},"sast_source_line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"SAST Source Line number","description":"Source line number of the attack vector."},"sast_source_file_path":{"type":"string","nullable":true,"description":"Source file path of the attack vector.","maxLength":4000},"nb_occurences":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of occurences","description":"Number of occurences in the source tool when several vulnerabilites were found and aggregated by the scanner."},"publish_date":{"type":"string","format":"date","nullable":true,"description":"Date when this vulnerability was made publicly available."},"service":{"type":"string","nullable":true,"description":"A service is a self-contained piece of functionality within a Product. This is an optional field which is used in deduplication of findings when set.","maxLength":200},"planned_remediation_date":{"type":"string","format":"date","nullable":true,"description":"The date the flaw is expected to be remediated."},"planned_remediation_version":{"type":"string","nullable":true,"description":"The target version when the vulnerability should be fixed / remediated","maxLength":99},"effort_for_fixing":{"type":"string","nullable":true,"description":"Effort for fixing / remediating the vulnerability (Low, Medium, High)","maxLength":99},"review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a review for this finding."},"defect_review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a defect review for this flaw."},"reviewers":{"type":"array","items":{"type":"integer"},"description":"Documents who reviewed the flaw."},"tags":{"type":"array","items":{"type":"string","minLength":1}}},"required":["active","description","found_by","numerical_severity","severity","test","title","verified"]},"FindingCwe":{"type":"object","properties":{"cwe":{"type":"string"}},"required":["cwe"]},"FindingCweRequest":{"type":"object","properties":{"cwe":{"type":"string","minLength":1}},"required":["cwe"]},"FindingDiff":{"type":"object","properties":{"equal":{"type":"boolean"},"status":{"type":"string","description":"Possible values:\n- `improvement` (Improvement): The comparison object contains a strict subset of the findings. This indicates an overall improvement with fewer findings present.\n- `regression` (Regression): The comparison object contains a strict superset of the findings. This indicates a regression with additional findings introduced.\n- `mixed` (Mixed changes): Some findings were added while others were removed. The overall change cannot be classified as purely positive or negative.\n- `unknown` (No change / Unknown): Both objects contain exactly the same findings. No improvement or regression can be determined."},"new_in_other":{"type":"array","items":{"$ref":"#/components/schemas/FindingMinimal"}},"removed_from_other":{"type":"array","items":{"$ref":"#/components/schemas/FindingMinimal"}}},"required":["equal","new_in_other","removed_from_other","status"]},"FindingEngagement":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","nullable":true,"maxLength":300},"description":{"type":"string","nullable":true,"maxLength":2000},"product":{"$ref":"#/components/schemas/FindingProduct"},"target_start":{"type":"string","format":"date"},"target_end":{"type":"string","format":"date"},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch of the product the engagement tested.","maxLength":150},"engagement_type":{"enum":["Interactive","CI/CD",null],"type":"string","description":"* `Interactive` - Interactive\n* `CI/CD` - CI/CD","x-spec-enum-id":"531df25eeddb1f62","nullable":true},"build_id":{"type":"string","nullable":true,"description":"Build ID of the product the engagement tested.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash from repo","maxLength":150},"version":{"type":"string","nullable":true,"description":"Version of the product the engagement tested.","maxLength":100},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"}},"required":["created","id","target_end","target_start","updated"]},"FindingEnvironment":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":200}},"required":["id","name"]},"FindingGroup":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255},"test":{"type":"integer"},"jira_issue":{"allOf":[{"$ref":"#/components/schemas/JIRAIssue"}],"readOnly":true,"nullable":true}},"required":["id","jira_issue","name","test"]},"FindingGroupRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"test":{"type":"integer"}},"required":["name","test"]},"FindingMerge":{"type":"object","description":"Request body for merging two or more findings into a single destination finding via the\npublic API (``POST /api/v2/findings/merge/``). The destination finding is kept and absorbs\nthe selected data from the source findings, which are then either marked inactive or deleted.","properties":{"source_finding_ids":{"type":"array","items":{"type":"integer"},"description":"IDs of the findings to merge into the destination finding. Provide two or more IDs. Every source finding must belong to the same product as the destination finding. If the destination finding ID is included here it is ignored."},"destination_finding_id":{"type":"integer","description":"ID of the finding that is kept and that the source findings are merged into. Selected data from the source findings is copied onto this finding."},"post_merge_action":{"enum":["inactive","deleted"],"type":"string","x-spec-enum-id":"f174dc7373f6f702","description":"What happens to the source findings after the merge: 'inactive' keeps them but marks them inactive; 'deleted' permanently removes them.\n\n* `inactive` - Mark the source findings as inactive (they remain in the database)\n* `deleted` - Permanently delete the source findings"},"destination_tags":{"type":"array","items":{"type":"string"},"description":"Tags to add to the destination finding after the merge."},"merged_tags":{"type":"array","items":{"type":"string"},"description":"Tags to add to each source finding. Only applied when post_merge_action is 'inactive', since deleted findings cannot be tagged."},"add_endpoints":{"type":"boolean","default":false,"description":"Copy the endpoints and locations from every source finding onto the destination finding."},"append_description":{"type":"boolean","default":false,"description":"Append each source finding's description (and file path, when set) to the destination finding's description."},"append_references":{"type":"boolean","default":false,"description":"Append each source finding's references to the destination finding's references."},"append_dynamic_scanner_raw_requests":{"type":"boolean","default":false,"description":"Move dynamic-scanner (Burp) raw request/response pairs from the source findings to the destination finding."},"append_vulnerability_ids":{"type":"boolean","default":false,"description":"Copy the vulnerability IDs (e.g. CVEs) from the source findings onto the destination finding."},"append_tags":{"type":"boolean","default":false,"description":"Copy the tags from every source finding onto the destination finding."}},"required":["destination_finding_id","post_merge_action","source_finding_ids"]},"FindingMergeRequest":{"type":"object","description":"Request body for merging two or more findings into a single destination finding via the\npublic API (``POST /api/v2/findings/merge/``). The destination finding is kept and absorbs\nthe selected data from the source findings, which are then either marked inactive or deleted.","properties":{"source_finding_ids":{"type":"array","items":{"type":"integer"},"description":"IDs of the findings to merge into the destination finding. Provide two or more IDs. Every source finding must belong to the same product as the destination finding. If the destination finding ID is included here it is ignored."},"destination_finding_id":{"type":"integer","description":"ID of the finding that is kept and that the source findings are merged into. Selected data from the source findings is copied onto this finding."},"post_merge_action":{"enum":["inactive","deleted"],"type":"string","x-spec-enum-id":"f174dc7373f6f702","description":"What happens to the source findings after the merge: 'inactive' keeps them but marks them inactive; 'deleted' permanently removes them.\n\n* `inactive` - Mark the source findings as inactive (they remain in the database)\n* `deleted` - Permanently delete the source findings"},"destination_tags":{"type":"array","items":{"type":"string","minLength":1},"description":"Tags to add to the destination finding after the merge."},"merged_tags":{"type":"array","items":{"type":"string","minLength":1},"description":"Tags to add to each source finding. Only applied when post_merge_action is 'inactive', since deleted findings cannot be tagged."},"add_endpoints":{"type":"boolean","default":false,"description":"Copy the endpoints and locations from every source finding onto the destination finding."},"append_description":{"type":"boolean","default":false,"description":"Append each source finding's description (and file path, when set) to the destination finding's description."},"append_references":{"type":"boolean","default":false,"description":"Append each source finding's references to the destination finding's references."},"append_dynamic_scanner_raw_requests":{"type":"boolean","default":false,"description":"Move dynamic-scanner (Burp) raw request/response pairs from the source findings to the destination finding."},"append_vulnerability_ids":{"type":"boolean","default":false,"description":"Copy the vulnerability IDs (e.g. CVEs) from the source findings onto the destination finding."},"append_tags":{"type":"boolean","default":false,"description":"Copy the tags from every source finding onto the destination finding."}},"required":["destination_finding_id","post_merge_action","source_finding_ids"]},"FindingMeta":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"value":{"type":"string","maxLength":300}},"required":["name","value"]},"FindingMinimal":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"hash_code":{"type":"string"},"severity":{"type":"string"},"file_path":{"type":"string","nullable":true},"line":{"type":"integer","nullable":true},"cwe":{"type":"integer","nullable":true},"test_type_name":{"type":"string","nullable":true},"priority":{"type":"number","format":"double","nullable":true},"risk":{"type":"string","nullable":true},"reachability":{"type":"string","nullable":true}},"required":["cwe","file_path","hash_code","id","line","priority","risk","severity","test_type_name","title"]},"FindingPreviewItem":{"type":"object","properties":{"title":{"type":"string"},"severity":{"type":"string"},"description":{"type":"string"},"mitigation":{"type":"string","nullable":true},"vulnerability_ids":{"type":"array","items":{"type":"string"}},"cwes":{"type":"array","items":{"type":"string"}}},"required":["description","mitigation","severity","title","vulnerability_ids"]},"FindingProdType":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255}},"required":["id","name"]},"FindingProduct":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255},"prod_type":{"$ref":"#/components/schemas/FindingProdType"}},"required":["id","name"]},"FindingRelatedFields":{"type":"object","properties":{"test":{"allOf":[{"$ref":"#/components/schemas/FindingTest"}],"readOnly":true},"jira":{"allOf":[{"$ref":"#/components/schemas/JIRAIssue"}],"readOnly":true}},"required":["jira","test"]},"FindingRelocationQueued":{"type":"object","description":"Response body of ``bulk_move`` and ``bulk_copy``, which queue the work rather than run it.","properties":{"operation":{"enum":["move","copy"],"type":"string","x-spec-enum-id":"ffbe57c1208dd403","description":"Which operation was queued.\n\n* `move` - move\n* `copy` - copy"},"status":{"type":"string","description":"Always \"queued\": the findings are moved or copied by a background task."},"queued":{"type":"integer","description":"How many findings were queued to be moved or copied."},"skipped_messages":{"type":"array","items":{"type":"string"},"description":"Why each finding left out of the queued work was left out (not found, or not authorized). The task can skip more, such as a finding already in the destination test."}},"required":["operation","queued","skipped_messages","status"]},"FindingRelocationRequest":{"type":"object","description":"Destination for moving or copying a finding (``POST /api/v2/findings/{id}/move/`` and\n``/copy/``; the Vue UI reaches the same actions under ``/api/vue/findings/``).\n\nGive either ``destination_test`` (an existing test, in any engagement or product the\ncaller may add findings to) or ``destination_product`` together with\n``create_missing=true`` (mirror the finding's engagement and test into that product,\ncreating them if absent). The rules live in ``pro.finding.relocation.validate_destination``\nso that every surface reports them identically.","properties":{"destination_test":{"type":"integer","nullable":true,"description":"ID of the existing test to move or copy the finding into. Mutually exclusive with destination_product."},"destination_product":{"type":"integer","nullable":true,"description":"ID of the product to move or copy the finding into. Requires create_missing=true, which mirrors the source engagement (matched by name) and test (matched by test type and title) into that product. Mutually exclusive with destination_test."},"create_missing":{"type":"boolean","default":false,"description":"Permit creating a matching engagement and test in destination_product when none exists. Required when destination_product is given."}}},"FindingRelocationResponse":{"type":"object","description":"Response body of the move and copy actions, single and bulk.","properties":{"operation":{"enum":["move","copy"],"type":"string","x-spec-enum-id":"ffbe57c1208dd403","description":"Which operation ran.\n\n* `move` - move\n* `copy` - copy"},"processed":{"type":"integer","description":"How many findings were moved, or how many copies were created."},"skipped_messages":{"type":"array","items":{"type":"string"},"description":"Why each skipped finding was skipped (not authorized, already in the destination test)."},"created_engagements":{"type":"integer","description":"Engagements created by create_missing."},"created_tests":{"type":"integer","description":"Tests created by create_missing."},"destination_test_ids":{"type":"array","items":{"type":"integer"},"description":"The tests the findings were moved or copied into."},"finding_ids":{"type":"array","items":{"type":"integer"},"description":"For a move, the moved findings; for a copy, the new findings, in source order."}},"required":["created_engagements","created_tests","destination_test_ids","finding_ids","operation","processed","skipped_messages"]},"FindingTemplate":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"vulnerability_ids":{"type":"array","items":{"type":"string"},"readOnly":true},"endpoints":{"type":"array","items":{"type":"string"},"readOnly":true},"title":{"type":"string","maxLength":1000},"cwe":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"cvssv3":{"type":"string","nullable":true,"title":"CVSS v3 vector","description":"Common Vulnerability Scoring System version 3 (CVSSv3) score associated with this finding.","maxLength":117},"cvssv3_score":{"type":"number","format":"double","nullable":true,"description":"CVSSv3 score"},"cvssv4":{"type":"string","nullable":true,"title":"CVSS4 vector","description":"Common Vulnerability Scoring System version 4 (CVSS4) score associated with this finding.","maxLength":255},"cvssv4_score":{"type":"number","format":"double","nullable":true,"description":"CVSSv4 score"},"severity":{"type":"string","nullable":true,"maxLength":200},"description":{"type":"string","nullable":true},"mitigation":{"type":"string","nullable":true},"impact":{"type":"string","nullable":true},"references":{"type":"string","nullable":true},"last_used":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"numerical_severity":{"type":"string","readOnly":true,"nullable":true},"fix_available":{"type":"boolean","nullable":true,"description":"Indicates if a fix is available for this vulnerability type"},"fix_version":{"type":"string","nullable":true,"description":"Version where fix is available","maxLength":100},"planned_remediation_version":{"type":"string","nullable":true,"description":"Target version for remediation","maxLength":99},"effort_for_fixing":{"type":"string","nullable":true,"description":"Effort estimate for fixing (e.g., Low/Medium/High)","maxLength":99},"steps_to_reproduce":{"type":"string","nullable":true,"description":"Standard reproduction steps for this vulnerability type"},"severity_justification":{"type":"string","nullable":true,"description":"Explanation of why this severity level is appropriate"},"component_name":{"type":"string","nullable":true,"description":"Affected component name (e.g., library name)","maxLength":500},"component_version":{"type":"string","nullable":true,"description":"Affected component version","maxLength":100},"notes":{"type":"string","nullable":true,"description":"Note content to add when applying this template"},"endpoints_text":{"type":"string","nullable":true,"description":"Endpoint URLs (one per line)"},"tags":{"type":"array","items":{"type":"string"}}},"required":["endpoints","id","last_used","numerical_severity","title","vulnerability_ids"]},"FindingTemplateRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":1000},"cwe":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"cvssv3":{"type":"string","nullable":true,"minLength":1,"title":"CVSS v3 vector","description":"Common Vulnerability Scoring System version 3 (CVSSv3) score associated with this finding.","maxLength":117},"cvssv3_score":{"type":"number","format":"double","nullable":true,"description":"CVSSv3 score"},"cvssv4":{"type":"string","nullable":true,"minLength":1,"title":"CVSS4 vector","description":"Common Vulnerability Scoring System version 4 (CVSS4) score associated with this finding.","maxLength":255},"cvssv4_score":{"type":"number","format":"double","nullable":true,"description":"CVSSv4 score"},"severity":{"type":"string","nullable":true,"maxLength":200},"description":{"type":"string","nullable":true},"mitigation":{"type":"string","nullable":true},"impact":{"type":"string","nullable":true},"references":{"type":"string","nullable":true},"fix_available":{"type":"boolean","nullable":true,"description":"Indicates if a fix is available for this vulnerability type"},"fix_version":{"type":"string","nullable":true,"description":"Version where fix is available","maxLength":100},"planned_remediation_version":{"type":"string","nullable":true,"description":"Target version for remediation","maxLength":99},"effort_for_fixing":{"type":"string","nullable":true,"description":"Effort estimate for fixing (e.g., Low/Medium/High)","maxLength":99},"steps_to_reproduce":{"type":"string","nullable":true,"description":"Standard reproduction steps for this vulnerability type"},"severity_justification":{"type":"string","nullable":true,"description":"Explanation of why this severity level is appropriate"},"component_name":{"type":"string","nullable":true,"description":"Affected component name (e.g., library name)","maxLength":500},"component_version":{"type":"string","nullable":true,"description":"Affected component version","maxLength":100},"notes":{"type":"string","nullable":true,"description":"Note content to add when applying this template"},"endpoints_text":{"type":"string","nullable":true,"description":"Endpoint URLs (one per line)"},"tags":{"type":"array","items":{"type":"string","minLength":1}}},"required":["title"]},"FindingTest":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","nullable":true,"maxLength":255},"test_type":{"$ref":"#/components/schemas/FindingTestType"},"engagement":{"$ref":"#/components/schemas/FindingEngagement"},"environment":{"$ref":"#/components/schemas/FindingEnvironment"},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch that was tested, a reimport may update this field.","maxLength":150},"build_id":{"type":"string","nullable":true,"description":"Build ID that was tested, a reimport may update this field.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash tested, a reimport may update this field.","maxLength":150},"version":{"type":"string","nullable":true,"maxLength":100}},"required":["id"]},"FindingTestType":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":200}},"required":["id","name"]},"FindingToFiles":{"type":"object","properties":{"finding_id":{"type":"integer","nullable":true},"files":{"type":"array","items":{"$ref":"#/components/schemas/File"}}},"required":["files","finding_id"]},"FindingToNotes":{"type":"object","properties":{"finding_id":{"type":"integer","nullable":true},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"}}},"required":["finding_id","notes"]},"FindingVerifyRequest":{"type":"object","properties":{"note":{"type":"string"},"note_type":{"type":"integer","nullable":true}}},"FindingVersionAffect":{"type":"object","description":"A found_in / fixed_in claim tying one finding to one version.\n\nThe claim is the whole point of Phase 3: a finding stays a single row on its home\nasset and accumulates per-version statements, instead of being copied per version.\nWrites here mint USER claims; ``origin`` is read-only so import-written rows stay\ndistinguishable from hand-recorded ones.","properties":{"id":{"type":"integer","readOnly":true},"finding":{"type":"integer","description":"The finding this per-version claim is about."},"asset_version":{"type":"integer"},"asset_version_name":{"type":"string","readOnly":true},"relation":{"enum":["found_in","fixed_in"],"type":"string","x-spec-enum-id":"7e7ed778a95ef6b3","description":"Whether the finding was observed in this version or fixed as of it.\n\n* `found_in` - Found In\n* `fixed_in` - Fixed In"},"origin":{"enum":["user","import"],"type":"string","x-spec-enum-id":"9aa4308b3b3f63d8","readOnly":true,"description":"Who recorded the claim: a user, or an import bound to a version. Machinery only reconciles rows of its own origin.\n\n* `user` - User\n* `import` - Import"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time the claim was recorded."},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the claim was updated."}},"required":["asset_version","asset_version_name","created_at","finding","id","origin","relation","updated_at"]},"FindingVersionAffectRequest":{"type":"object","description":"A found_in / fixed_in claim tying one finding to one version.\n\nThe claim is the whole point of Phase 3: a finding stays a single row on its home\nasset and accumulates per-version statements, instead of being copied per version.\nWrites here mint USER claims; ``origin`` is read-only so import-written rows stay\ndistinguishable from hand-recorded ones.","properties":{"finding":{"type":"integer","description":"The finding this per-version claim is about."},"asset_version":{"type":"integer"},"relation":{"enum":["found_in","fixed_in"],"type":"string","x-spec-enum-id":"7e7ed778a95ef6b3","description":"Whether the finding was observed in this version or fixed as of it.\n\n* `found_in` - Found In\n* `fixed_in` - Fixed In"}},"required":["asset_version","finding","relation"]},"Findings":{"type":"object","description":"Regression guard for Sentry DJANGO-D2P.\n\nDRF ``ModelSerializer.update()`` calls ``instance.<m2m>.set(new_list)`` for\nevery M2M field present in ``validated_data``, even when the new list is\nidentical to the current one. On tagulous ``TagField``s that triggers a\nfull teardown + re-add of the M2M, which runs SELECT + UPDATE ``count``\nbookkeeping per tag (N+1).\n\nThis mixin short-circuits the ``.set()`` call per ``TagListSerializerField``\nwhen the normalized incoming list equals ``instance.<attr>.get_tag_list()``.\nAll other M2M fields keep the stock DRF behavior.\n\nOpt in by adding ``SkipUnchangedTagsMixin`` to the base-class list of any\nserializer that exposes a ``TagListSerializerField`` for update.","properties":{"id":{"type":"integer","readOnly":true},"mitigated":{"type":"string","format":"date-time","nullable":true},"mitigated_by":{"type":"integer","nullable":true},"request_response":{"allOf":[{"$ref":"#/components/schemas/BurpRawRequestResponse"}],"readOnly":true},"accepted_risks":{"type":"array","items":{"$ref":"#/components/schemas/RiskAcceptance"},"readOnly":true},"push_to_jira":{"type":"boolean","default":false},"found_by":{"type":"array","items":{"type":"integer"}},"age":{"type":"integer","readOnly":true},"sla_days_remaining":{"type":"integer","readOnly":true,"nullable":true},"finding_meta":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldValueMeta"},"readOnly":true},"related_fields":{"allOf":[{"$ref":"#/components/schemas/FindingRelatedFields"}],"readOnly":true,"nullable":true},"test_type_name":{"type":"string","readOnly":true,"nullable":true},"jira_creation":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"jira_change":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"display_status":{"type":"string","readOnly":true},"finding_groups":{"type":"array","items":{"$ref":"#/components/schemas/FindingGroup"},"readOnly":true},"vulnerability_ids":{"type":"array","items":{"$ref":"#/components/schemas/VulnerabilityId"}},"cwes":{"type":"array","items":{"$ref":"#/components/schemas/FindingCwe"}},"reporter":{"type":"integer"},"endpoints":{"type":"array","items":{"type":"integer"}},"priority":{"type":"number","format":"double","minimum":0,"nullable":true,"description":"The priority in which a finding should be considered for mitigation next"},"risk":{"enum":["Low","Medium","Needs Action","Urgent",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"The risk score in which a finding poses to the system it was discovered on\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"overridden_priority_risk_calculation":{"type":"boolean","default":false,"description":"Dictates whether this object has had its priority/risk calculation manually overridden. If true, the priority and risk values will not be automatically recalculated again until this setting is set to false."},"reachability":{"enum":["reachable_runtime","reachable_static","potentially_reachable","unreachable","unknown"],"type":"string","x-spec-enum-id":"eb84ddc6bfeee7ca","readOnly":true,"description":"The resolved reachability verdict for this finding, rolled up across all verdict sources and the finding's deduplication cluster.\n\n* `reachable_runtime` - Reachable (runtime)\n* `reachable_static` - Reachable (static)\n* `potentially_reachable` - Potentially reachable\n* `unreachable` - Unreachable\n* `unknown` - Unknown"},"reachability_evidence":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true,"description":"Ordered call-chain frames ({file, line, symbol}) from the winning reachability verdict."},"owners":{"type":"integer","nullable":true,"description":"The group of users responsible for this finding (Dojo_Group ID)."},"has_pending_exception":{"type":"boolean","readOnly":true,"default":false},"mitigation_policy":{"type":"integer","nullable":true,"description":"The standardized mitigation policy for this finding"},"vex_state":{"enum":["resolved","resolved_with_pedigree","exploitable","in_triage","false_positive","not_affected",null],"type":"string","x-spec-enum-id":"920cf602d3fa96ef","nullable":true,"description":"CycloneDX VEX analysis state — the exploitability verdict for this finding.\n\n* `resolved` - Resolved\n* `resolved_with_pedigree` - Resolved with Pedigree\n* `exploitable` - Exploitable\n* `in_triage` - In Triage\n* `false_positive` - False Positive\n* `not_affected` - Not Affected"},"vex_justification":{"enum":["code_not_present","code_not_reachable","requires_configuration","requires_dependency","requires_environment","protected_by_compiler","protected_at_runtime","protected_at_perimeter","protected_by_mitigating_control",null],"type":"string","x-spec-enum-id":"b2a6243bea66a552","nullable":true,"description":"CycloneDX VEX justification for why the finding does not affect the product; only meaningful when vex_state is 'not_affected'.\n\n* `code_not_present` - Code Not Present\n* `code_not_reachable` - Code Not Reachable\n* `requires_configuration` - Requires Configuration\n* `requires_dependency` - Requires Dependency\n* `requires_environment` - Requires Environment\n* `protected_by_compiler` - Protected by Compiler\n* `protected_at_runtime` - Protected at Runtime\n* `protected_at_perimeter` - Protected at Perimeter\n* `protected_by_mitigating_control` - Protected by Mitigating Control"},"vex_responses":{"type":"array","items":{"enum":["can_not_fix","will_not_fix","update","rollback","workaround_available"],"type":"string","description":"* `can_not_fix` - Can Not Fix\n* `will_not_fix` - Will Not Fix\n* `update` - Update\n* `rollback` - Rollback\n* `workaround_available` - Workaround Available","x-spec-enum-id":"42daaa5a4bd38bca"},"nullable":true,"description":"CycloneDX VEX responses — how the vendor intends to respond to the vulnerability."},"vex_detail":{"type":"string","nullable":true,"description":"Free-text elaboration on the VEX analysis, shared verbatim in VEX exports."},"exploit_maturity":{"enum":[0,10,20,30,null],"type":"integer","x-spec-enum-id":"01909932fa04343b","nullable":true,"description":"Exploit maturity (0 None / 10 PoC / 20 Weaponized / 30 Active in the wild). Editable for manual enrichment; the threat-intel sync overwrites it for findings that reference an enriched vulnerability id, so a hand-entered value is durable only on findings with no matching intel. Send null to clear it.\n\n* `0` - None\n* `10` - Proof-of-Concept\n* `20` - Weaponized\n* `30` - Active in the wild"},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"connector_push_result":{"allOf":[{"$ref":"#/components/schemas/ConnectorPushResult"}],"nullable":true,"readOnly":true},"endpoints_to_add":{"type":"string","nullable":true,"description":"A space deliminated list of endpoints that will be added to this Finding."},"jira_push_result":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"title":{"type":"string","description":"A short description of the flaw.","maxLength":511},"date":{"type":"string","format":"date","description":"The date the flaw was discovered."},"sla_start_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date used as start date for SLA calculation. Set by expiring risk acceptances. Empty by default, causing a fallback to 'date'."},"sla_expiration_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date SLA expires for this finding. Empty by default, causing a fallback to 'date'."},"cwe":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"The CWE number associated with this flaw."},"epss_score":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS score for the CVE. Describes how likely it is the vulnerability will be exploited in the next 30 days."},"epss_percentile":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS percentile for the CVE. Describes how many CVEs are scored at or below this one."},"known_exploited":{"type":"boolean","description":"Whether this vulnerability is known to have been exploited in the wild."},"ransomware_used":{"type":"boolean","title":"Used in Ransomware","description":"Whether this vulnerability is known to have been leveraged as part of a ransomware campaign."},"kev_date":{"type":"string","format":"date","nullable":true,"title":"KEV Date Added","description":"The date the vulnerability was added to the KEV catalog."},"cvssv3":{"type":"string","nullable":true,"title":"CVSS3 Vector","description":"Common Vulnerability Scoring System version 3 (CVSS3) score associated with this finding.","maxLength":117},"cvssv3_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"title":"CVSS3 Score","description":"Numerical CVSSv3 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"cvssv4":{"type":"string","nullable":true,"title":"CVSS4 vector","description":"Common Vulnerability Scoring System version 4 (CVSS4) score associated with this finding.","maxLength":255},"cvssv4_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"description":"Numerical CVSSv4 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"url":{"type":"string","readOnly":true,"nullable":true,"description":"External reference that provides more information about this flaw."},"severity":{"type":"string","description":"The severity level of this flaw (Critical, High, Medium, Low, Info).","maxLength":200},"description":{"type":"string","description":"Longer more descriptive information about the flaw."},"mitigation":{"type":"string","nullable":true,"description":"Text describing how to best fix the flaw."},"fix_available":{"type":"boolean","nullable":true,"description":"Denotes if there is a fix available for this flaw."},"fix_version":{"type":"string","nullable":true,"description":"Version of the affected component in which the flaw is fixed.","maxLength":100},"impact":{"type":"string","nullable":true,"description":"Text describing the impact this flaw has on systems, products, enterprise, etc."},"steps_to_reproduce":{"type":"string","nullable":true,"description":"Text describing the steps that must be followed in order to reproduce the flaw / bug."},"severity_justification":{"type":"string","nullable":true,"description":"Text describing why a certain severity was associated with this flaw."},"references":{"type":"string","nullable":true,"description":"The external documentation available for this flaw."},"active":{"type":"boolean","description":"Denotes if this flaw is active or not."},"verified":{"type":"boolean","description":"Denotes if this flaw has been manually verified by the tester."},"false_p":{"type":"boolean","title":"False Positive","description":"Denotes if this flaw has been deemed a false positive by the tester."},"duplicate":{"type":"boolean","description":"Denotes if this flaw is a duplicate of other flaws reported."},"out_of_scope":{"type":"boolean","description":"Denotes if this flaw falls outside the scope of the test and/or engagement."},"risk_accepted":{"type":"boolean","description":"Denotes if this finding has been marked as an accepted risk."},"under_review":{"type":"boolean","description":"Denotes is this flaw is currently being reviewed."},"last_status_update":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Timestamp of latest status update (change in status related fields)."},"under_defect_review":{"type":"boolean","description":"Denotes if this finding is under defect review."},"is_mitigated":{"type":"boolean","description":"Denotes if this flaw has been fixed."},"thread_id":{"type":"integer","readOnly":true},"numerical_severity":{"type":"string","description":"The numerical representation of the severity (S0, S1, S2, S3, S4).","maxLength":4},"last_reviewed":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Provides the date the flaw was last 'touched' by a tester."},"param":{"type":"string","readOnly":true,"nullable":true,"title":"Parameter","description":"Parameter used to trigger the issue (DAST)."},"payload":{"type":"string","readOnly":true,"nullable":true,"description":"Payload used to attack the service / application and trigger the bug / problem."},"hash_code":{"type":"string","readOnly":true,"nullable":true,"description":"A hash over a configurable set of fields that is used for findings deduplication."},"line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Line number","description":"Source line number of the attack vector."},"file_path":{"type":"string","nullable":true,"description":"Identified file(s) containing the flaw.","maxLength":4000},"component_name":{"type":"string","nullable":true,"description":"Name of the affected component (library name, part of a system, ...).","maxLength":500},"component_version":{"type":"string","nullable":true,"description":"Version of the affected component.","maxLength":100},"static_finding":{"type":"boolean","title":"Static finding (SAST)","description":"Flaw has been detected from a Static Application Security Testing tool (SAST)."},"dynamic_finding":{"type":"boolean","title":"Dynamic finding (DAST)","description":"Flaw has been detected from a Dynamic Application Security Testing tool (DAST)."},"scanner_confidence":{"type":"integer","readOnly":true,"nullable":true,"description":"Confidence level of vulnerability which is supplied by the scanner."},"unique_id_from_tool":{"type":"string","nullable":true,"description":"Vulnerability technical id from the source tool. Allows to track unique vulnerabilities over time across subsequent scans.","maxLength":500},"vuln_id_from_tool":{"type":"string","nullable":true,"title":"Vulnerability ID from tool","description":"Non-unique technical id from the source tool associated with the vulnerability type.","maxLength":500},"sast_source_object":{"type":"string","nullable":true,"description":"Source object (variable, function...) of the attack vector.","maxLength":500},"sast_sink_object":{"type":"string","nullable":true,"description":"Sink object (variable, function...) of the attack vector.","maxLength":500},"sast_source_line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"SAST Source Line number","description":"Source line number of the attack vector."},"sast_source_file_path":{"type":"string","nullable":true,"description":"Source file path of the attack vector.","maxLength":4000},"nb_occurences":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of occurences","description":"Number of occurences in the source tool when several vulnerabilites were found and aggregated by the scanner."},"publish_date":{"type":"string","format":"date","nullable":true,"description":"Date when this vulnerability was made publicly available."},"service":{"type":"string","nullable":true,"description":"A service is a self-contained piece of functionality within a Product. This is an optional field which is used in deduplication of findings when set.","maxLength":200},"planned_remediation_date":{"type":"string","format":"date","nullable":true,"description":"The date the flaw is expected to be remediated."},"planned_remediation_version":{"type":"string","nullable":true,"description":"The target version when the vulnerability should be fixed / remediated","maxLength":99},"effort_for_fixing":{"type":"string","nullable":true,"description":"Effort for fixing / remediating the vulnerability (Low, Medium, High)","maxLength":99},"test":{"type":"integer","readOnly":true,"description":"The test that is associated with this flaw."},"duplicate_finding":{"type":"integer","readOnly":true,"nullable":true,"description":"Link to the original finding if this finding is a duplicate."},"review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a review for this finding."},"defect_review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a defect review for this flaw."},"last_reviewed_by":{"type":"integer","readOnly":true,"nullable":true,"description":"Provides the person who last reviewed the flaw."},"sonarqube_issue":{"type":"integer","readOnly":true,"nullable":true,"description":"The SonarQube issue associated with this finding."},"reviewers":{"type":"array","items":{"type":"integer"},"description":"Documents who reviewed the flaw."},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"},"readOnly":true},"files":{"type":"array","items":{"type":"integer"},"readOnly":true,"description":"Files(s) related to the flaw."},"tags":{"type":"array","items":{"type":"string"}},"prefetch":{"type":"object","properties":{"auth_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"author_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"config_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"crypto_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"data_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"defect_review_requested_by":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"duplicate_finding":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Finding"}},"endpoint_set":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Endpoint"}},"endpoints":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Endpoint"}},"files":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/File"}},"finding_group_set":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/FindingGroup"}},"found_by":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/TestType"}},"last_reviewed_by":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"mitigated_by":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"notes":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Note"}},"other_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"reporter":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"review_requested_by":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"reviewers":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"risk_acceptance_set":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/RiskAcceptance"}},"sensitive_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"session_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"sonarqube_issue":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/SonarqubeIssue"}},"test":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Test"}},"locations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/LocationFindingReference"}}}}},"required":["accepted_risks","age","connector_push_result","created","description","display_status","duplicate_finding","files","finding_groups","finding_meta","found_by","has_pending_exception","hash_code","id","jira_change","jira_creation","jira_push_result","last_reviewed","last_reviewed_by","last_status_update","notes","numerical_severity","param","payload","reachability","reachability_evidence","related_fields","request_response","scanner_confidence","severity","sla_days_remaining","sonarqube_issue","test","test_type_name","thread_id","title","updated","url"]},"FindingsRequest":{"type":"object","description":"Regression guard for Sentry DJANGO-D2P.\n\nDRF ``ModelSerializer.update()`` calls ``instance.<m2m>.set(new_list)`` for\nevery M2M field present in ``validated_data``, even when the new list is\nidentical to the current one. On tagulous ``TagField``s that triggers a\nfull teardown + re-add of the M2M, which runs SELECT + UPDATE ``count``\nbookkeeping per tag (N+1).\n\nThis mixin short-circuits the ``.set()`` call per ``TagListSerializerField``\nwhen the normalized incoming list equals ``instance.<attr>.get_tag_list()``.\nAll other M2M fields keep the stock DRF behavior.\n\nOpt in by adding ``SkipUnchangedTagsMixin`` to the base-class list of any\nserializer that exposes a ``TagListSerializerField`` for update.","properties":{"mitigated":{"type":"string","format":"date-time","nullable":true},"mitigated_by":{"type":"integer","nullable":true},"push_to_jira":{"type":"boolean","default":false},"found_by":{"type":"array","items":{"type":"integer"}},"vulnerability_ids":{"type":"array","items":{"$ref":"#/components/schemas/VulnerabilityIdRequest"}},"cwes":{"type":"array","items":{"$ref":"#/components/schemas/FindingCweRequest"}},"reporter":{"type":"integer"},"endpoints":{"type":"array","items":{"type":"integer"}},"priority":{"type":"number","format":"double","minimum":0,"nullable":true,"description":"The priority in which a finding should be considered for mitigation next"},"risk":{"enum":["Low","Medium","Needs Action","Urgent",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"The risk score in which a finding poses to the system it was discovered on\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"overridden_priority_risk_calculation":{"type":"boolean","default":false,"description":"Dictates whether this object has had its priority/risk calculation manually overridden. If true, the priority and risk values will not be automatically recalculated again until this setting is set to false."},"owners":{"type":"integer","nullable":true,"description":"The group of users responsible for this finding (Dojo_Group ID)."},"mitigation_policy":{"type":"integer","nullable":true,"description":"The standardized mitigation policy for this finding"},"vex_state":{"enum":["resolved","resolved_with_pedigree","exploitable","in_triage","false_positive","not_affected",null],"type":"string","x-spec-enum-id":"920cf602d3fa96ef","nullable":true,"description":"CycloneDX VEX analysis state — the exploitability verdict for this finding.\n\n* `resolved` - Resolved\n* `resolved_with_pedigree` - Resolved with Pedigree\n* `exploitable` - Exploitable\n* `in_triage` - In Triage\n* `false_positive` - False Positive\n* `not_affected` - Not Affected"},"vex_justification":{"enum":["code_not_present","code_not_reachable","requires_configuration","requires_dependency","requires_environment","protected_by_compiler","protected_at_runtime","protected_at_perimeter","protected_by_mitigating_control",null],"type":"string","x-spec-enum-id":"b2a6243bea66a552","nullable":true,"description":"CycloneDX VEX justification for why the finding does not affect the product; only meaningful when vex_state is 'not_affected'.\n\n* `code_not_present` - Code Not Present\n* `code_not_reachable` - Code Not Reachable\n* `requires_configuration` - Requires Configuration\n* `requires_dependency` - Requires Dependency\n* `requires_environment` - Requires Environment\n* `protected_by_compiler` - Protected by Compiler\n* `protected_at_runtime` - Protected at Runtime\n* `protected_at_perimeter` - Protected at Perimeter\n* `protected_by_mitigating_control` - Protected by Mitigating Control"},"vex_responses":{"type":"array","items":{"enum":["can_not_fix","will_not_fix","update","rollback","workaround_available"],"type":"string","description":"* `can_not_fix` - Can Not Fix\n* `will_not_fix` - Will Not Fix\n* `update` - Update\n* `rollback` - Rollback\n* `workaround_available` - Workaround Available","x-spec-enum-id":"42daaa5a4bd38bca"},"nullable":true,"description":"CycloneDX VEX responses — how the vendor intends to respond to the vulnerability."},"vex_detail":{"type":"string","nullable":true,"description":"Free-text elaboration on the VEX analysis, shared verbatim in VEX exports."},"exploit_maturity":{"enum":[0,10,20,30,null],"type":"integer","x-spec-enum-id":"01909932fa04343b","nullable":true,"description":"Exploit maturity (0 None / 10 PoC / 20 Weaponized / 30 Active in the wild). Editable for manual enrichment; the threat-intel sync overwrites it for findings that reference an enriched vulnerability id, so a hand-entered value is durable only on findings with no matching intel. Send null to clear it.\n\n* `0` - None\n* `10` - Proof-of-Concept\n* `20` - Weaponized\n* `30` - Active in the wild"},"reachability_override":{"enum":["reachable_runtime","reachable_static","potentially_reachable","unreachable","unknown",null],"type":"string","x-spec-enum-id":"eb84ddc6bfeee7ca","writeOnly":true,"nullable":true,"description":"Set a manual reachability verdict when no scanner supplies one. Recorded as a 'manual' verdict source; a stronger scanner verdict overrides it in the resolved value returned by the read-only 'reachability' field. Send null to clear the manual override.\n\n* `reachable_runtime` - Reachable (runtime)\n* `reachable_static` - Reachable (static)\n* `potentially_reachable` - Potentially reachable\n* `unreachable` - Unreachable\n* `unknown` - Unknown"},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"endpoints_to_add":{"type":"string","nullable":true,"minLength":1,"description":"A space deliminated list of endpoints that will be added to this Finding."},"recalculate_hash_code":{"type":"boolean","writeOnly":true,"default":false,"description":"When set to True, the hash code of the finding will be recalculated. This is flag is intended for power users. Please note, this may have an adverse effect on identifying duplicates through deduplication and reimport."},"title":{"type":"string","minLength":1,"description":"A short description of the flaw.","maxLength":511},"date":{"type":"string","format":"date","description":"The date the flaw was discovered."},"sla_start_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date used as start date for SLA calculation. Set by expiring risk acceptances. Empty by default, causing a fallback to 'date'."},"sla_expiration_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date SLA expires for this finding. Empty by default, causing a fallback to 'date'."},"cwe":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"The CWE number associated with this flaw."},"epss_score":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS score for the CVE. Describes how likely it is the vulnerability will be exploited in the next 30 days."},"epss_percentile":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS percentile for the CVE. Describes how many CVEs are scored at or below this one."},"known_exploited":{"type":"boolean","description":"Whether this vulnerability is known to have been exploited in the wild."},"ransomware_used":{"type":"boolean","title":"Used in Ransomware","description":"Whether this vulnerability is known to have been leveraged as part of a ransomware campaign."},"kev_date":{"type":"string","format":"date","nullable":true,"title":"KEV Date Added","description":"The date the vulnerability was added to the KEV catalog."},"cvssv3":{"type":"string","nullable":true,"minLength":1,"title":"CVSS3 Vector","description":"Common Vulnerability Scoring System version 3 (CVSS3) score associated with this finding.","maxLength":117},"cvssv3_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"title":"CVSS3 Score","description":"Numerical CVSSv3 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"cvssv4":{"type":"string","nullable":true,"minLength":1,"title":"CVSS4 vector","description":"Common Vulnerability Scoring System version 4 (CVSS4) score associated with this finding.","maxLength":255},"cvssv4_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"description":"Numerical CVSSv4 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"severity":{"type":"string","minLength":1,"description":"The severity level of this flaw (Critical, High, Medium, Low, Info).","maxLength":200},"description":{"type":"string","minLength":1,"description":"Longer more descriptive information about the flaw."},"mitigation":{"type":"string","nullable":true,"description":"Text describing how to best fix the flaw."},"fix_available":{"type":"boolean","nullable":true,"description":"Denotes if there is a fix available for this flaw."},"fix_version":{"type":"string","nullable":true,"description":"Version of the affected component in which the flaw is fixed.","maxLength":100},"impact":{"type":"string","nullable":true,"description":"Text describing the impact this flaw has on systems, products, enterprise, etc."},"steps_to_reproduce":{"type":"string","nullable":true,"description":"Text describing the steps that must be followed in order to reproduce the flaw / bug."},"severity_justification":{"type":"string","nullable":true,"description":"Text describing why a certain severity was associated with this flaw."},"references":{"type":"string","nullable":true,"description":"The external documentation available for this flaw."},"active":{"type":"boolean","description":"Denotes if this flaw is active or not."},"verified":{"type":"boolean","description":"Denotes if this flaw has been manually verified by the tester."},"false_p":{"type":"boolean","title":"False Positive","description":"Denotes if this flaw has been deemed a false positive by the tester."},"duplicate":{"type":"boolean","description":"Denotes if this flaw is a duplicate of other flaws reported."},"out_of_scope":{"type":"boolean","description":"Denotes if this flaw falls outside the scope of the test and/or engagement."},"risk_accepted":{"type":"boolean","description":"Denotes if this finding has been marked as an accepted risk."},"under_review":{"type":"boolean","description":"Denotes is this flaw is currently being reviewed."},"under_defect_review":{"type":"boolean","description":"Denotes if this finding is under defect review."},"is_mitigated":{"type":"boolean","description":"Denotes if this flaw has been fixed."},"numerical_severity":{"type":"string","minLength":1,"description":"The numerical representation of the severity (S0, S1, S2, S3, S4).","maxLength":4},"line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Line number","description":"Source line number of the attack vector."},"file_path":{"type":"string","nullable":true,"description":"Identified file(s) containing the flaw.","maxLength":4000},"component_name":{"type":"string","nullable":true,"description":"Name of the affected component (library name, part of a system, ...).","maxLength":500},"component_version":{"type":"string","nullable":true,"description":"Version of the affected component.","maxLength":100},"static_finding":{"type":"boolean","title":"Static finding (SAST)","description":"Flaw has been detected from a Static Application Security Testing tool (SAST)."},"dynamic_finding":{"type":"boolean","title":"Dynamic finding (DAST)","description":"Flaw has been detected from a Dynamic Application Security Testing tool (DAST)."},"unique_id_from_tool":{"type":"string","nullable":true,"description":"Vulnerability technical id from the source tool. Allows to track unique vulnerabilities over time across subsequent scans.","maxLength":500},"vuln_id_from_tool":{"type":"string","nullable":true,"title":"Vulnerability ID from tool","description":"Non-unique technical id from the source tool associated with the vulnerability type.","maxLength":500},"sast_source_object":{"type":"string","nullable":true,"description":"Source object (variable, function...) of the attack vector.","maxLength":500},"sast_sink_object":{"type":"string","nullable":true,"description":"Sink object (variable, function...) of the attack vector.","maxLength":500},"sast_source_line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"SAST Source Line number","description":"Source line number of the attack vector."},"sast_source_file_path":{"type":"string","nullable":true,"description":"Source file path of the attack vector.","maxLength":4000},"nb_occurences":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of occurences","description":"Number of occurences in the source tool when several vulnerabilites were found and aggregated by the scanner."},"publish_date":{"type":"string","format":"date","nullable":true,"description":"Date when this vulnerability was made publicly available."},"service":{"type":"string","nullable":true,"description":"A service is a self-contained piece of functionality within a Product. This is an optional field which is used in deduplication of findings when set.","maxLength":200},"planned_remediation_date":{"type":"string","format":"date","nullable":true,"description":"The date the flaw is expected to be remediated."},"planned_remediation_version":{"type":"string","nullable":true,"description":"The target version when the vulnerability should be fixed / remediated","maxLength":99},"effort_for_fixing":{"type":"string","nullable":true,"description":"Effort for fixing / remediating the vulnerability (Low, Medium, High)","maxLength":99},"review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a review for this finding."},"defect_review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a defect review for this flaw."},"reviewers":{"type":"array","items":{"type":"integer"},"description":"Documents who reviewed the flaw."},"tags":{"type":"array","items":{"type":"string","minLength":1}}},"required":["description","found_by","numerical_severity","severity","title"]},"FindingsRequestRequest":{"type":"object","properties":{"finding_ids":{"type":"array","items":{"type":"integer"},"maxItems":5000},"title":{"type":"string","maxLength":512}},"required":["finding_ids"]},"FireWall":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"ip_ranges":{"type":"array","items":{"$ref":"#/components/schemas/IpMask"}},"locked":{"type":"boolean"},"external_services":{"nullable":true}},"required":["id","ip_ranges"]},"FirewallExternalServices":{"type":"object","properties":{"external_services":{"nullable":true}}},"FirewallExternalServicesRequest":{"type":"object","properties":{"external_services":{"nullable":true}}},"FixDurabilityRequestRequest":{"type":"object","properties":{"group_by":{"enum":["product","product_type"],"type":"string","description":"* `product` - product\n* `product_type` - product_type","x-spec-enum-id":"a4e5f443bef0a800"},"limit":{"type":"integer"}}},"FixUsageReportRequest":{"type":"object","description":"Payload the scan-and-fix action POSTs after a ``/fix`` command applies fixes.\n\n``fixed_count`` is the number of findings successfully fixed in that command —\nthe billable unit. Repo/PR/finding context is recorded for read-only visibility.","properties":{"repo_full_name":{"type":"string","default":""},"pr_number":{"type":"integer","nullable":true},"fixed_count":{"type":"integer","minimum":0},"finding_ids":{"type":"array","items":{"type":"integer"}},"pr_url":{"nullable":true,"oneOf":[{"type":"string","format":"uri"},{"type":"string","maxLength":0}]},"kind":{"type":"string","default":""},"tokens_in":{"type":"integer","nullable":true,"default":0},"tokens_out":{"type":"integer","nullable":true,"default":0},"llm_model":{"type":"string","default":""},"llm_provider":{"type":"string","default":""},"scan_run_id":{"type":"integer","minimum":1,"nullable":true}},"required":["fixed_count"]},"FrameworkPreset":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"items":{"type":"array","items":{"$ref":"#/components/schemas/PresetItem"},"readOnly":true},"variants":{"type":"array","items":{"$ref":"#/components/schemas/PresetVariant"},"readOnly":true},"superseded_by_name":{"type":"string","readOnly":true},"superseded_by_key":{"type":"string","readOnly":true},"applications_count":{"type":"integer","readOnly":true,"default":0},"latest_application":{"allOf":[{"$ref":"#/components/schemas/PresetLatestApplication"}],"nullable":true,"readOnly":true},"key":{"type":"string","description":"Stable slug identifying the preset across instances, for example uk_cyber_essentials.","pattern":"^[a-z0-9][a-z0-9_]{1,63}$","maxLength":64},"name":{"type":"string","description":"The display name of the preset.","maxLength":128},"framework":{"type":"string","description":"The scheme or framework the preset encodes.","maxLength":128},"version":{"type":"string","description":"The publication version of the scheme this preset paraphrases.","maxLength":128},"publisher":{"type":"string","description":"Who publishes the scheme.","maxLength":128},"source_url":{"description":"Where the published requirements live.","oneOf":[{"type":"string","format":"uri","maxLength":512},{"type":"string","maxLength":0}]},"summary":{"type":"string","description":"A short plain-language description of what the preset installs."},"definition":{"description":"The preset body: SLA configurations, cadence policies, a response policy and checks. Data only, validated against the vendored schema before it is stored."},"bundled":{"type":"boolean","readOnly":true,"description":"Shipped with DefectDojo Pro. Bundled presets are read-only."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the preset was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the preset was updated"},"superseded_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The newer preset that replaces this one when the scheme is revised."}},"required":["applications_count","bundled","created_at","framework","id","items","key","latest_application","name","superseded_by","superseded_by_key","superseded_by_name","updated_at","variants","version"]},"FrameworkPresetRequest":{"type":"object","properties":{"key":{"type":"string","minLength":1,"description":"Stable slug identifying the preset across instances, for example uk_cyber_essentials.","pattern":"^[a-z0-9][a-z0-9_]{1,63}$","maxLength":64},"name":{"type":"string","minLength":1,"description":"The display name of the preset.","maxLength":128},"framework":{"type":"string","minLength":1,"description":"The scheme or framework the preset encodes.","maxLength":128},"version":{"type":"string","minLength":1,"description":"The publication version of the scheme this preset paraphrases.","maxLength":128},"publisher":{"type":"string","description":"Who publishes the scheme.","maxLength":128},"source_url":{"description":"Where the published requirements live.","oneOf":[{"type":"string","format":"uri","maxLength":512},{"type":"string","maxLength":0}]},"summary":{"type":"string","description":"A short plain-language description of what the preset installs."},"definition":{"description":"The preset body: SLA configurations, cadence policies, a response policy and checks. Data only, validated against the vendored schema before it is stored."}},"required":["framework","key","name","version"]},"FreshnessTrendRequestRequest":{"type":"object","properties":{"start":{"type":"string","format":"date"},"end":{"type":"string","format":"date"},"granularity":{"enum":["day","week","month"],"type":"string","description":"* `day` - day\n* `week` - week\n* `month` - month","x-spec-enum-id":"273287207128dc4a"},"scope":{"enum":["authorized","global"],"type":"string","description":"* `authorized` - authorized\n* `global` - global","x-spec-enum-id":"277897e33919e7cc"}}},"FromTemplateRequestRequest":{"type":"object","description":"Instantiate a starter feed rule.","properties":{"key":{"type":"string","minLength":1},"fill":{"type":"string","maxLength":255},"feed_source":{"type":"integer","nullable":true}},"required":["key"]},"FullFindingGroup":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"push_to_jira":{"type":"boolean","default":false},"product_type":{"type":"integer","readOnly":true},"product":{"type":"integer","readOnly":true},"group_age":{"type":"integer","readOnly":true},"sla_days_remaining":{"type":"integer","readOnly":true},"findings_count":{"type":"integer","readOnly":true},"status":{"type":"string","readOnly":true},"severity":{"type":"string","readOnly":true},"jira_push_result":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"connector_push_result":{"allOf":[{"$ref":"#/components/schemas/ConnectorPushResult"}],"nullable":true,"readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true},"modified":{"type":"string","format":"date-time","readOnly":true},"name":{"type":"string","maxLength":255},"test":{"type":"integer"},"findings":{"type":"array","items":{"type":"integer"}},"prefetch":{"type":"object","properties":{"creator":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"findings":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Finding"}},"test":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Test"}}}}},"required":["connector_push_result","created","findings","findings_count","group_age","id","jira_push_result","modified","name","product","product_type","severity","sla_days_remaining","status","test"]},"FullFindingGroupRequest":{"type":"object","properties":{"push_to_jira":{"type":"boolean","default":false},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"name":{"type":"string","minLength":1,"maxLength":255},"test":{"type":"integer"},"findings":{"type":"array","items":{"type":"integer"}}},"required":["findings","name","test"]},"FunnelReceiptsRequestRequest":{"type":"object","properties":{"window_days":{"enum":[7,30,90],"type":"integer","description":"* `7` - 7\n* `30` - 30\n* `90` - 90","x-spec-enum-id":"2e5d1943e8d2dd5e"},"product_ids":{"type":"array","items":{"type":"integer"}},"scope":{"enum":["authorized","global"],"type":"string","description":"* `authorized` - authorized\n* `global` - global","x-spec-enum-id":"277897e33919e7cc"},"kinds":{"type":"array","items":{"enum":["imports","rules"],"type":"string","description":"* `imports` - imports\n* `rules` - rules","x-spec-enum-id":"f323b91152a881d7"}}}},"FunnelTrendRequestRequest":{"type":"object","properties":{"start":{"type":"string","format":"date"},"end":{"type":"string","format":"date"},"granularity":{"enum":["day","week","month"],"type":"string","description":"* `day` - day\n* `week` - week\n* `month` - month","x-spec-enum-id":"273287207128dc4a"},"scope":{"enum":["authorized","global"],"type":"string","description":"* `authorized` - authorized\n* `global` - global","x-spec-enum-id":"277897e33919e7cc"}}},"GenerateRulesRequest":{"type":"object","description":"Create a group from a curated inventory selection.\n\n``dependencies`` is the analyst's selection; empty means every proposal for\nthe named products. The conditions are always regenerated server-side, so\nthis names *what* to cover, never what the rules say.","properties":{"name":{"type":"string"},"description":{"type":"string"},"operator":{"type":"string","default":"and"},"products":{"type":"array","items":{"type":"integer"}},"dependencies":{"type":"array","items":{"type":"integer"}}},"required":["products"]},"GeneratedReportContent":{"type":"object","description":"The bounded plain-text excerpt of a completed report (generated_reports/{id}/content/).\n\nSchema-only: the view assembles the dict. content/content_type/total_bytes are null when\nthe report has no text rendition (data formats, pre-sidecar rows, or a sidecar the\nworker could not write) -- that is a downloadable report, not an error.","properties":{"id":{"type":"integer"},"status":{"type":"string"},"file_format":{"type":"string"},"content_type":{"type":"string","nullable":true},"truncated":{"type":"boolean"},"total_bytes":{"type":"integer","nullable":true},"returned_bytes":{"type":"integer"},"content":{"type":"string","nullable":true}},"required":["content","content_type","file_format","id","returned_bytes","status","total_bytes","truncated"]},"GenericMessage":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"message":{"type":"string","nullable":true,"description":"The contents of a given success message","maxLength":2000},"error":{"type":"string","nullable":true,"description":"The contents of a given error message","maxLength":2000},"status_code":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"HTTP Status code presented only when an error is present"}},"required":["id"]},"GlobalRole":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"user":{"type":"integer","nullable":true},"group":{"type":"integer","nullable":true},"role":{"type":"integer","nullable":true,"title":"Global role","description":"The global role will be applied to all product types and products."},"prefetch":{"type":"object","properties":{"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["id"]},"GlobalRoleRequest":{"type":"object","properties":{"user":{"type":"integer","nullable":true},"group":{"type":"integer","nullable":true},"role":{"type":"integer","nullable":true,"title":"Global role","description":"The global role will be applied to all product types and products."}}},"GraphPreviewRequestRequest":{"type":"object","description":"The body of ``POST rules/preview/``.","properties":{"graph":{"description":"The graph to check"},"limit":{"type":"integer","description":"How many findings to run the preview over"},"sample_payload":{"description":"For a webhook trigger: a payload to preview against instead of the receiver's sample"}},"required":["graph"]},"GraphProblems":{"type":"object","description":"The response of ``POST rules/validate/``, and the 400 body of any graph write.","properties":{"problems":{"type":"array","items":{"type":"string"},"description":"Empty means the graph is valid"},"warnings":{"type":"array","items":{"type":"string"},"description":"Worth reading, but never a reason the graph cannot be saved"}},"required":["problems"]},"GraphRuleList":{"type":"object","description":"A rule as the rules list shows it: no graph, and last-run read off the list annotations.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"The name for this rule. Must be unique","maxLength":255},"description":{"type":"string","description":"An optional description of what this rule does"},"enabled":{"type":"boolean","description":"Whether this rule runs. New rules start disabled, so enabling one is always deliberate"},"mode":{"enum":["simulate","live"],"type":"string","x-spec-enum-id":"0a770165ced54ec1","description":"Whether this rule's egress nodes actually send. Simulate records exactly what would be sent and sends nothing. One setting for the whole rule: a graph half of which reaches the outside world is harder to reason about than two rules\n\n* `simulate` - Simulate\n* `live` - Live"},"trigger_type":{"type":"string","readOnly":true,"description":"Denormalized from the graph trigger node on save: finding, schedule, or manual"},"trigger_event":{"type":"string","readOnly":true,"description":"Denormalized from a finding trigger: created, updated, closed, reopened, or any"},"runnable":{"type":"boolean","description":"Whether Run Now can run this rule, read off its trigger's node spec.\n\nThe same answer ``/node_types/`` serves the editor (``runnable``), so the row menu and the\neditor cannot drift. Read off the denormalized trigger column: the list carries no graph.\n\n:param instance: The rule.\n:return: False for a trigger that acts only on what woke it (a webhook, a landed scan).","readOnly":true},"version":{"type":"integer","readOnly":true,"description":"Incremented every time the graph is updated"},"node_count":{"type":"integer","description":"How many nodes the rule's graph has.\n\n:param instance: The rule.\n:return: The node count. Zero for a graph that has none.","readOnly":true},"owner":{"allOf":[{"$ref":"#/components/schemas/Owner"}],"readOnly":true},"is_converted":{"type":"boolean","description":"Whether this rule came from the V1 converter.\n\n:param instance: The rule.\n:return: True when it was converted.","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"description":"When this rule was originally created"},"updated":{"type":"string","format":"date-time","readOnly":true,"description":"When this rule was last updated"},"last_run":{"type":"object","additionalProperties":{},"nullable":true,"description":"The rule's most recent run, read from the list queryset's annotations.\n\nDeliberately not ``instance.runs.first()``: that is the N+1 Sentry DJANGO-42MK caught in V1,\none query per row on every page of the rules list.\n\n:param instance: The rule.\n:return: The run brief, or None when the rule has never run.","readOnly":true},"next_run":{"type":"string","nullable":true,"description":"The schedule's next run as an ISO timestamp, for the rules list's Expected Next Run column.\n\n:param instance: The rule.\n:return: The timestamp, or None when nothing is scheduled (see _expected_next_run).","readOnly":true},"overdue":{"type":"boolean","description":"Whether the scheduling service is late for this rule by more than OVERDUE_GRACE.\n\nCron marks are quarter hours, so a run in progress has already advanced ``next_run`` and\nreads as on time; one past the grace means the schedule stopped firing.\n\n:param instance: The rule.\n:return: True when the expected run is OVERDUE_GRACE or more in the past.","readOnly":true},"editable":{"type":"boolean","description":"Whether this caller may change, enable, run or schedule this rule.\n\nServed rather than re-derived client-side, because the rule is not \"do you hold Rule_Edit\":\nit is that plus ownership, since a rule runs as its owner. One source for it means the\neditor's read-only mode and the API's 403 cannot disagree.\n\n:param instance: The rule.\n:return: True when this caller may act on it.","readOnly":true},"deletable":{"type":"boolean","description":"Whether this caller may delete this rule.\n\nSplit from ``editable`` because delete is its own grant (``Rule_Delete``): a role can hold\nedit without delete, or delete without edit. Ownership still applies, for the same reason it\napplies to editing, so the row menu's Delete item and the API's 403 cannot disagree.\n\n:param instance: The rule.\n:return: True when this caller may delete it.","readOnly":true},"meta":{"type":"object","additionalProperties":{},"description":"The graph's metadata block: what generated this rule, and how it was configured.\n\n``graph.meta`` is where a generator stamps itself and whatever it needs to rebuild its own\nform (the messaging alert preset is the first, writing ``provenance``, ``preset`` and\n``severity_floor``). It is exposed on the *list* because a caller that wants \"the rules my\ngenerator made, and what each one says\" would otherwise have to fetch every rule's detail:\nthe list deliberately omits the graph, so a client-side read of ``graph.meta`` here silently\nfinds nothing.\n\nDeliberately the whole block rather than named keys, so a second generator needs no change\nhere. It is small by construction (a generator writing a large one would be misusing it) and\ncosts no extra query: ``get_node_count`` already reads the same graph off the row.\n\n:param instance: The rule.\n:return: The metadata block, or {} for a hand-built rule.","readOnly":true},"managed_by_receiver":{"type":"object","additionalProperties":{},"nullable":true,"description":"The webhook receiver that generates this rule, when one does.\n\nServed so the editor can say \"managed by X\" and offer detach, and so the list can mark the\nrow. A receiver the caller cannot see is still named by id alone, which is what they need to\nknow the rule is read-only; its label is left out.\n\n:param instance: The rule.\n:return: ``{id, label}``, ``{id}`` for an invisible receiver, or None.","readOnly":true}},"required":["created","deletable","editable","id","is_converted","last_run","managed_by_receiver","meta","name","next_run","node_count","overdue","owner","runnable","trigger_event","trigger_type","updated","version"]},"GraphRuleRetrieve":{"type":"object","description":"A rule with its graph: the shape the editor loads, validates against, and saves.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"The name for this rule. Must be unique","maxLength":255},"description":{"type":"string","description":"An optional description of what this rule does"},"enabled":{"type":"boolean","description":"Whether this rule runs. New rules start disabled, so enabling one is always deliberate"},"mode":{"enum":["simulate","live"],"type":"string","x-spec-enum-id":"0a770165ced54ec1","description":"Whether this rule's egress nodes actually send. Simulate records exactly what would be sent and sends nothing. One setting for the whole rule: a graph half of which reaches the outside world is harder to reason about than two rules\n\n* `simulate` - Simulate\n* `live` - Live"},"trigger_type":{"type":"string","readOnly":true,"description":"Denormalized from the graph trigger node on save: finding, schedule, or manual"},"trigger_event":{"type":"string","readOnly":true,"description":"Denormalized from a finding trigger: created, updated, closed, reopened, or any"},"runnable":{"type":"boolean","description":"Whether Run Now can run this rule, read off its trigger's node spec.\n\nThe same answer ``/node_types/`` serves the editor (``runnable``), so the row menu and the\neditor cannot drift. Read off the denormalized trigger column: the list carries no graph.\n\n:param instance: The rule.\n:return: False for a trigger that acts only on what woke it (a webhook, a landed scan).","readOnly":true},"version":{"type":"integer","readOnly":true,"description":"Incremented every time the graph is updated"},"node_count":{"type":"integer","description":"How many nodes the rule's graph has.\n\n:param instance: The rule.\n:return: The node count. Zero for a graph that has none.","readOnly":true},"owner":{"allOf":[{"$ref":"#/components/schemas/Owner"}],"readOnly":true},"is_converted":{"type":"boolean","description":"Whether this rule came from the V1 converter.\n\n:param instance: The rule.\n:return: True when it was converted.","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"description":"When this rule was originally created"},"updated":{"type":"string","format":"date-time","readOnly":true,"description":"When this rule was last updated"},"last_run":{"type":"object","additionalProperties":{},"nullable":true,"description":"The rule's most recent run, read from the list queryset's annotations.\n\nDeliberately not ``instance.runs.first()``: that is the N+1 Sentry DJANGO-42MK caught in V1,\none query per row on every page of the rules list.\n\n:param instance: The rule.\n:return: The run brief, or None when the rule has never run.","readOnly":true},"next_run":{"type":"string","nullable":true,"description":"The schedule's next run as an ISO timestamp, for the rules list's Expected Next Run column.\n\n:param instance: The rule.\n:return: The timestamp, or None when nothing is scheduled (see _expected_next_run).","readOnly":true},"overdue":{"type":"boolean","description":"Whether the scheduling service is late for this rule by more than OVERDUE_GRACE.\n\nCron marks are quarter hours, so a run in progress has already advanced ``next_run`` and\nreads as on time; one past the grace means the schedule stopped firing.\n\n:param instance: The rule.\n:return: True when the expected run is OVERDUE_GRACE or more in the past.","readOnly":true},"editable":{"type":"boolean","description":"Whether this caller may change, enable, run or schedule this rule.\n\nServed rather than re-derived client-side, because the rule is not \"do you hold Rule_Edit\":\nit is that plus ownership, since a rule runs as its owner. One source for it means the\neditor's read-only mode and the API's 403 cannot disagree.\n\n:param instance: The rule.\n:return: True when this caller may act on it.","readOnly":true},"deletable":{"type":"boolean","description":"Whether this caller may delete this rule.\n\nSplit from ``editable`` because delete is its own grant (``Rule_Delete``): a role can hold\nedit without delete, or delete without edit. Ownership still applies, for the same reason it\napplies to editing, so the row menu's Delete item and the API's 403 cannot disagree.\n\n:param instance: The rule.\n:return: True when this caller may delete it.","readOnly":true},"meta":{"type":"object","additionalProperties":{},"description":"The graph's metadata block: what generated this rule, and how it was configured.\n\n``graph.meta`` is where a generator stamps itself and whatever it needs to rebuild its own\nform (the messaging alert preset is the first, writing ``provenance``, ``preset`` and\n``severity_floor``). It is exposed on the *list* because a caller that wants \"the rules my\ngenerator made, and what each one says\" would otherwise have to fetch every rule's detail:\nthe list deliberately omits the graph, so a client-side read of ``graph.meta`` here silently\nfinds nothing.\n\nDeliberately the whole block rather than named keys, so a second generator needs no change\nhere. It is small by construction (a generator writing a large one would be misusing it) and\ncosts no extra query: ``get_node_count`` already reads the same graph off the row.\n\n:param instance: The rule.\n:return: The metadata block, or {} for a hand-built rule.","readOnly":true},"managed_by_receiver":{"type":"object","additionalProperties":{},"nullable":true,"description":"The webhook receiver that generates this rule, when one does.\n\nServed so the editor can say \"managed by X\" and offer detach, and so the list can mark the\nrow. A receiver the caller cannot see is still named by id alone, which is what they need to\nknow the rule is read-only; its label is left out.\n\n:param instance: The rule.\n:return: ``{id, label}``, ``{id}`` for an invisible receiver, or None.","readOnly":true},"graph":{}},"required":["created","deletable","editable","graph","id","is_converted","last_run","managed_by_receiver","meta","name","next_run","node_count","overdue","owner","runnable","trigger_event","trigger_type","updated","version"]},"GraphRuleRetrieveRequest":{"type":"object","description":"A rule with its graph: the shape the editor loads, validates against, and saves.","properties":{"name":{"type":"string","minLength":1,"description":"The name for this rule. Must be unique","maxLength":255},"description":{"type":"string","description":"An optional description of what this rule does"},"enabled":{"type":"boolean","description":"Whether this rule runs. New rules start disabled, so enabling one is always deliberate"},"mode":{"enum":["simulate","live"],"type":"string","x-spec-enum-id":"0a770165ced54ec1","description":"Whether this rule's egress nodes actually send. Simulate records exactly what would be sent and sends nothing. One setting for the whole rule: a graph half of which reaches the outside world is harder to reason about than two rules\n\n* `simulate` - Simulate\n* `live` - Live"},"graph":{},"schedule":{"type":"object","additionalProperties":{},"writeOnly":true}},"required":["graph","name"]},"GraphRuleRunBrief":{"type":"object","description":"One run, as the runs list and a rule's ``last_run`` show it.","properties":{"id":{"type":"integer","readOnly":true},"rule_id":{"type":"integer","readOnly":true},"rule_name":{"type":"string","description":"The rule's name, from the list annotation when there is one.\n\n:param instance: The run.\n:return: The name, or \"\" when the annotation is absent and the relation is not loaded.","readOnly":true},"status":{"enum":["R","S","E"],"type":"string","x-spec-enum-id":"b289dc07efbb35d5","readOnly":true,"description":"The status of this run\n\n* `R` - Running\n* `S` - Success\n* `E` - Error"},"trigger":{"type":"string","readOnly":true,"description":"The event type that started this run, for example finding.created"},"depth":{"type":"integer","readOnly":true,"description":"How many cascade hops away from the originating event this run is"},"error":{"type":"string","readOnly":true,"description":"The error that ended this run, if it failed"},"started":{"type":"string","format":"date-time","readOnly":true,"description":"When this run started"},"finished":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"When this run ended. Null only while it is still running"},"triggered_by":{"allOf":[{"$ref":"#/components/schemas/Owner"}],"readOnly":true},"stats":{"readOnly":true,"description":"Run-level counters: per-node totals, cascaded events, and deferred work"}},"required":["depth","error","finished","id","rule_id","rule_name","started","stats","status","trigger","triggered_by"]},"GraphRuleRunDetail":{"type":"object","description":"One run with its per-node traces, which is what the run drawer renders.","properties":{"id":{"type":"integer","readOnly":true},"rule_id":{"type":"integer","readOnly":true},"rule_name":{"type":"string","description":"The rule's name, from the list annotation when there is one.\n\n:param instance: The run.\n:return: The name, or \"\" when the annotation is absent and the relation is not loaded.","readOnly":true},"status":{"enum":["R","S","E"],"type":"string","x-spec-enum-id":"b289dc07efbb35d5","readOnly":true,"description":"The status of this run\n\n* `R` - Running\n* `S` - Success\n* `E` - Error"},"trigger":{"type":"string","readOnly":true,"description":"The event type that started this run, for example finding.created"},"depth":{"type":"integer","readOnly":true,"description":"How many cascade hops away from the originating event this run is"},"error":{"type":"string","readOnly":true,"description":"The error that ended this run, if it failed"},"started":{"type":"string","format":"date-time","readOnly":true,"description":"When this run started"},"finished":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"When this run ended. Null only while it is still running"},"triggered_by":{"allOf":[{"$ref":"#/components/schemas/Owner"}],"readOnly":true},"stats":{"readOnly":true,"description":"Run-level counters: per-node totals, cascaded events, and deferred work"},"event":{"type":"object","additionalProperties":{},"description":"What woke this run, with the ids in it gated on finding visibility.\n\nThe rest of the run is global: rules, runs and deliveries are administered through the rule\npermissions and carry no finding data. The stored event is the exception, since it names the\nexact findings, products and scan types that triggered the rule, and provenance and delivery\nreads are gated for precisely that reason. A reader without ``Finding_View`` still gets the\nshape of the event and how much it covered, which is what the drawer is for.\n\n:param instance: The run.\n:return: The event, whole or with its id lists counted.","readOnly":true},"node_runs":{"type":"array","items":{"type":"object","additionalProperties":{}},"description":"The run's node traces in execution order.\n\n:param instance: The run.\n:return: The serialized traces.","readOnly":true},"retention_days":{"type":"integer","description":"How long this instance keeps a finished run, its node rows and its provenance.\n\n:param instance: The run. Unused: the window is a deployment setting.\n:return: The window in days.","readOnly":true},"retention_expires":{"type":"string","format":"date-time","nullable":true,"description":"When this run ages out, along with everything hanging off it.\n\n:param instance: The run.\n:return: The datetime, or None when retention is off.","readOnly":true}},"required":["depth","error","event","finished","id","node_runs","retention_days","retention_expires","rule_id","rule_name","started","stats","status","trigger","triggered_by"]},"GraphValidationRequestRequest":{"type":"object","description":"The body of ``POST rules/validate/``.","properties":{"graph":{"description":"The graph to check"}},"required":["graph"]},"GuardrailCollector":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"A label for this deployment, such as 'Engineering laptops'.","maxLength":200},"policy":{"type":"integer"},"policy_name":{"type":"string","readOnly":true},"token_prefix":{"type":"string","readOnly":true,"description":"The leading characters of the token, shown so collectors can be told apart"},"created_by_name":{"type":"string","readOnly":true},"last_seen_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last Seen","description":"The last time a hook call arrived with this collector's token."},"revoked_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Revoked","description":"When set, the token no longer authenticates and hook calls are refused."},"is_active":{"type":"boolean","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["created_at","created_by_name","id","is_active","last_seen_at","name","policy","policy_name","revoked_at","token_prefix","updated_at"]},"GuardrailCollectorRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"A label for this deployment, such as 'Engineering laptops'.","maxLength":200},"policy":{"type":"integer"}},"required":["name","policy"]},"GuardrailEvent":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"occurred_at":{"type":"string","format":"date-time","readOnly":true,"title":"Time","description":"When the call was checked."},"actor":{"type":"string","readOnly":true,"title":"User","description":"The developer's account name on their machine, as the hook reported it."},"hostname":{"type":"string","readOnly":true,"title":"Host","description":"The developer's machine, as the hook reported it."},"hook_event":{"type":"string","readOnly":true,"description":"The Claude Code hook that made the call, such as UserPromptSubmit or PreToolUse."},"tool_name":{"type":"string","readOnly":true,"title":"Tool","description":"The tool the call was about. Empty for a prompt."},"target":{"enum":["prompt","command","tool_input","tool_output"],"type":"string","x-spec-enum-id":"48373e7a86b2b5cd","readOnly":true,"title":"Checked","description":"What part of the session was checked.\n\n* `prompt` - Prompts\n* `command` - Shell commands\n* `tool_input` - Other tool input\n* `tool_output` - File contents and tool output"},"status":{"enum":["allowed","blocked","redacted","asked","flagged"],"type":"string","x-spec-enum-id":"430934bddf68ffe3","readOnly":true,"description":"What the policy decided.\n\n* `allowed` - Allowed\n* `blocked` - Blocked\n* `redacted` - Redacted\n* `asked` - Asked\n* `flagged` - Flagged"},"monitored":{"type":"boolean","readOnly":true,"title":"Monitor Mode","description":"The policy was in monitor mode, so the call went through whatever the rules said."},"excerpt":{"type":"string","readOnly":true,"description":"The start of the prompt, command or file path, with every match masked."},"matches":{"readOnly":true,"description":"The rules that matched, with the detectors that fired and how often. Never the matched text."},"rule_names":{"type":"array","items":{"type":"string"},"readOnly":true},"session_id":{"type":"string","readOnly":true,"title":"Session","description":"The Claude Code session the call belongs to."},"cwd":{"type":"string","readOnly":true,"title":"Working Directory","description":"The directory Claude Code was working in."},"policy":{"type":"integer","readOnly":true,"nullable":true,"description":"The policy the call was checked against."},"policy_name":{"type":"string","readOnly":true},"collector":{"type":"integer","readOnly":true,"nullable":true,"description":"The collector the hook call came through."},"collector_name":{"type":"string","readOnly":true}},"required":["actor","collector","collector_name","cwd","excerpt","hook_event","hostname","id","matches","monitored","occurred_at","policy","policy_name","rule_names","session_id","status","target","tool_name"]},"GuardrailPolicy":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"A short name for the policy, shown on every event it decides.","maxLength":200},"description":{"type":"string","description":"What the policy is for and who it applies to."},"mode":{"enum":["enforce","monitor"],"type":"string","x-spec-enum-id":"c88e46cab5a83c1a","description":"Enforce blocks, redacts and asks as the rules say. Monitor lets every prompt and tool call through and records what the rules would have done, for trying a policy out before enforcing it.\n\n* `enforce` - Enforce\n* `monitor` - Monitor"},"record_excerpts":{"type":"boolean","description":"Keep a short excerpt of each prompt, command or file path on its event, with every match masked. When off, events record only who, when, which tool and what was decided."},"rule_count":{"type":"integer","readOnly":true,"default":0},"collector_count":{"type":"integer","readOnly":true,"default":0},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["collector_count","created_at","id","name","rule_count","updated_at"]},"GuardrailPolicyRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"A short name for the policy, shown on every event it decides.","maxLength":200},"description":{"type":"string","description":"What the policy is for and who it applies to."},"mode":{"enum":["enforce","monitor"],"type":"string","x-spec-enum-id":"c88e46cab5a83c1a","description":"Enforce blocks, redacts and asks as the rules say. Monitor lets every prompt and tool call through and records what the rules would have done, for trying a policy out before enforcing it.\n\n* `enforce` - Enforce\n* `monitor` - Monitor"},"record_excerpts":{"type":"boolean","description":"Keep a short excerpt of each prompt, command or file path on its event, with every match masked. When off, events record only who, when, which tool and what was decided."}},"required":["name"]},"GuardrailRule":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"policy":{"type":"integer"},"name":{"type":"string","description":"A short name for the rule, shown as what an event was flagged for.","maxLength":200},"enabled":{"type":"boolean","description":"Disabled rules are kept but never match."},"kind":{"enum":["detectors","pattern"],"type":"string","x-spec-enum-id":"76b4c41a51e7c53c","description":"Look for built-in kinds of personal data and secrets, or for a pattern you write.\n\n* `detectors` - Built-in detectors\n* `pattern` - Custom pattern"},"detectors":{"type":"array","items":{"type":"string","maxLength":64}},"pattern":{"type":"string","description":"A regular expression, for a custom pattern rule. For example: git\\s+push\\s+.*(--force|-f\\b)"},"case_sensitive":{"type":"boolean","description":"Whether the custom pattern tells upper and lower case apart."},"targets":{"type":"array","items":{"type":"string","maxLength":32}},"action":{"enum":["block","redact","ask","log"],"type":"string","x-spec-enum-id":"29340ad0614dcc48","description":"What happens on a match.\n\n* `block` - Block\n* `redact` - Redact\n* `ask` - Ask the developer\n* `log` - Log only"},"message":{"type":"string","description":"Shown to the developer, or to Claude, when the rule blocks or asks. Empty uses a standard message."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["action","created_at","id","name","policy","targets","updated_at"]},"GuardrailRuleRequest":{"type":"object","properties":{"policy":{"type":"integer"},"name":{"type":"string","minLength":1,"description":"A short name for the rule, shown as what an event was flagged for.","maxLength":200},"enabled":{"type":"boolean","description":"Disabled rules are kept but never match."},"kind":{"enum":["detectors","pattern"],"type":"string","x-spec-enum-id":"76b4c41a51e7c53c","description":"Look for built-in kinds of personal data and secrets, or for a pattern you write.\n\n* `detectors` - Built-in detectors\n* `pattern` - Custom pattern"},"detectors":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"pattern":{"type":"string","description":"A regular expression, for a custom pattern rule. For example: git\\s+push\\s+.*(--force|-f\\b)"},"case_sensitive":{"type":"boolean","description":"Whether the custom pattern tells upper and lower case apart."},"targets":{"type":"array","items":{"type":"string","minLength":1,"maxLength":32}},"action":{"enum":["block","redact","ask","log"],"type":"string","x-spec-enum-id":"29340ad0614dcc48","description":"What happens on a match.\n\n* `block` - Block\n* `redact` - Redact\n* `ask` - Ask the developer\n* `log` - Log only"},"message":{"type":"string","description":"Shown to the developer, or to Claude, when the rule blocks or asks. Empty uses a standard message."}},"required":["action","name","policy","targets"]},"HierarchyCheckInfo":{"type":"object","properties":{"key":{"type":"string"},"version":{"type":"integer"},"scope_type":{"type":"string"},"precedence":{"type":"integer"},"structural":{"type":"boolean","description":"Turned off by the flat-structure switch."},"enabled":{"type":"boolean","description":"Not in disabled_checks: the check's own switch."},"active":{"type":"boolean","description":"Runs on the instance: enabled, and not a structural check while flat_structure_instance is on. An organization kept flat still turns a structural check off there."}},"required":["active","enabled","key","precedence","scope_type","structural","version"]},"HierarchyCheckRequest":{"type":"object","properties":{"scope_type":{"enum":["","instance","connector_config","organization"],"type":"string","description":"* `` - \n* `instance` - instance\n* `connector_config` - connector_config\n* `organization` - organization","x-spec-enum-id":"bf708a2703327442","default":""},"scope_id":{"type":"integer","nullable":true}}},"HierarchyEventCount":{"type":"object","properties":{"count":{"type":"integer","description":"Events recorded."},"suggestions":{"type":"integer","description":"Distinct suggestions they were recorded for."}},"required":["count","suggestions"]},"HierarchyFlatStructure":{"type":"object","properties":{"organization":{"type":"integer","nullable":true,"description":"The organization to keep flat, or null for the whole instance."},"flat":{"type":"boolean","description":"True: kept flat on purpose, so the structural checks stay off there."}},"required":["flat"]},"HierarchyFlatStructureRequest":{"type":"object","properties":{"organization":{"type":"integer","nullable":true,"description":"The organization to keep flat, or null for the whole instance."},"flat":{"type":"boolean","description":"True: kept flat on purpose, so the structural checks stay off there."}},"required":["flat"]},"HierarchyHealthSettings":{"type":"object","description":"The thresholds the checks use, which checks are off, and where the structure is kept flat on purpose.","properties":{"flat_org_min_assets":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Flat organization size"},"flat_org_max_parented_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Flat organization parented share"},"dimension_min_coverage_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Grouping coverage"},"dimension_min_values":{"type":"integer","maximum":32767,"minimum":0,"title":"Fewest groups"},"dimension_max_values":{"type":"integer","maximum":32767,"minimum":0,"title":"Most groups"},"placement_high_coverage_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Placement high confidence"},"stale_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Stale after days"},"stale_min_age_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Minimum age in days"},"sprawl_min_engagements":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Engagement sprawl"},"duplicate_min_jaccard_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Duplicate overlap"},"duplicate_min_shared_hashes":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Duplicate hashes"},"phone_apply_max_assets":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Phone apply limit"},"left_out_blocking_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Left out limit"},"debounce_minutes":{"type":"integer","maximum":32767,"minimum":1},"disabled_checks":{"type":"array","items":{"type":"string","maxLength":16},"description":"Keys of the checks to turn off, such as h1."},"flat_structure_instance":{"type":"boolean","title":"Flat structure on purpose"},"notify":{"type":"boolean","title":"Notify people about new suggestions"},"flat_structure_organizations":{"type":"array","items":{"$ref":"#/components/schemas/HierarchyOrganizationRef"},"readOnly":true},"checks":{"type":"array","items":{"$ref":"#/components/schemas/HierarchyCheckInfo"},"readOnly":true},"last_check_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last check"},"last_sweep_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last full check"},"last_incremental_sweep_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last incremental check"}},"required":["checks","flat_structure_organizations","last_check_at","last_incremental_sweep_at","last_sweep_at"]},"HierarchyOrganizationRef":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"}},"required":["id","name"]},"HierarchyPrecision":{"type":"object","properties":{"sample_size":{"type":"integer","description":"Labeled suggestions a check needs."},"checks":{"type":"array","items":{"$ref":"#/components/schemas/HierarchyPrecisionRow"}}},"required":["checks","sample_size"]},"HierarchyPrecisionRow":{"type":"object","properties":{"check":{"type":"string"},"version":{"type":"integer","nullable":true,"description":"The check's current version; null if not built."},"registered":{"type":"boolean"},"gate_percent":{"type":"integer","nullable":true,"description":"The share of right labels GA needs."},"gate_kinds":{"type":"array","items":{"type":"string"},"nullable":true,"description":"Only these kinds count; null for every kind."},"labeled":{"type":"integer"},"right":{"type":"integer"},"wrong":{"type":"integer"},"unclear":{"type":"integer"},"right_percent":{"type":"number","format":"double","nullable":true,"description":"Right over every counted label; unclear counts as not right."},"needed":{"type":"integer","nullable":true,"description":"Labels still needed before the share counts."},"not_counted":{"type":"integer","description":"Labels for an earlier check version or a kind outside the gate."},"status":{"enum":["meets","below","collecting","no_gate"],"type":"string","description":"* `meets` - meets\n* `below` - below\n* `collecting` - collecting\n* `no_gate` - no_gate","x-spec-enum-id":"146615d7bb0aa45d"}},"required":["check","gate_kinds","gate_percent","labeled","needed","not_counted","registered","right","right_percent","status","unclear","version","wrong"]},"HierarchyShadowMode":{"type":"object","properties":{"shadow_mode":{"type":"boolean","description":"True: the checks run and store suggestions, and only superusers see them; nobody is notified."},"shadow_mode_changed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["shadow_mode","shadow_mode_changed_at"]},"HierarchyShadowModeRequest":{"type":"object","properties":{"shadow_mode":{"type":"boolean","description":"True: the checks run and store suggestions, and only superusers see them; nobody is notified."}},"required":["shadow_mode"]},"HierarchySuggestionApplyRequest":{"type":"object","properties":{"draft_id":{"type":"integer","description":"The id of the draft the preview returned."},"revision":{"type":"integer","minimum":0,"description":"The draft's revision the preview returned: the review this apply runs."},"acknowledge_access_loss":{"type":"boolean","default":false,"description":"Required when the review says anyone loses access."}},"required":["draft_id","revision"]},"HierarchySuggestionDetail":{"type":"object","description":"A suggestion with what its review page needs besides the groups: the placement options, the source\nchanges it made, its plans, and the viewer's current draft.","properties":{"id":{"type":"integer","readOnly":true},"check":{"type":"string","readOnly":true},"check_version":{"type":"integer","readOnly":true},"kind":{"type":"string","readOnly":true},"status":{"enum":["open","applying","applied","partly_applied","undone","snoozed","dismissed","resolved"],"type":"string","description":"* `open` - Open\n* `applying` - Applying\n* `applied` - Applied\n* `partly_applied` - Partly applied\n* `undone` - Undone\n* `snoozed` - Snoozed\n* `dismissed` - Dismissed\n* `resolved` - Resolved","x-spec-enum-id":"464670dafc170efb","readOnly":true,"default":"open"},"step":{"type":"integer","readOnly":true},"informational":{"type":"boolean","readOnly":true},"previewable":{"type":"boolean","readOnly":true},"scope_type":{"enum":["organization","connector_config","instance"],"type":"string","description":"* `organization` - Organization\n* `connector_config` - Connector\n* `instance` - Instance","x-spec-enum-id":"33d4f870901bc46a","readOnly":true},"scope_id":{"type":"integer","readOnly":true,"nullable":true,"title":"Scope"},"target_key":{"type":"string","readOnly":true},"params":{"readOnly":true,"title":"Parameters"},"facts":{"readOnly":true},"assets_affected":{"type":"integer","readOnly":true},"confidence":{"enum":["high","medium","info"],"type":"string","description":"* `high` - High\n* `medium` - Medium\n* `info` - Informational","x-spec-enum-id":"29059549ba35b79d","readOnly":true},"fallback_title":{"type":"string","readOnly":true,"title":"Title"},"fallback_rationale":{"type":"string","readOnly":true,"title":"Rationale"},"dismiss_reason":{"enum":["intentional","wrong_grouping","fix_at_source"],"type":"string","description":"* `intentional` - This is intentional\n* `wrong_grouping` - The grouping is wrong\n* `fix_at_source` - We will fix it at the source","x-spec-enum-id":"26620421670c63ff","readOnly":true,"title":"Reason"},"remind_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Remind"},"reappeared_from":{"type":"integer","readOnly":true,"nullable":true},"status_changed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Changed"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated"},"last_seen_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last seen"},"applied":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"source_changes":{"readOnly":true},"review_state":{"readOnly":true},"keep_tidy_rule":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"created_rule":{"nullable":true,"readOnly":true},"dismiss_note":{"type":"string","readOnly":true},"options":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"dimensions":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"prevention":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"plans":{"type":"array","items":{"$ref":"#/components/schemas/HierarchySuggestionPlanRef"},"readOnly":true},"draft":{"allOf":[{"$ref":"#/components/schemas/HierarchySuggestionDraft"}],"nullable":true,"readOnly":true},"phone_apply_max_assets":{"type":"integer","readOnly":true}},"required":["applied","assets_affected","check","check_version","confidence","created_at","created_rule","dimensions","dismiss_note","dismiss_reason","draft","facts","fallback_rationale","fallback_title","id","informational","keep_tidy_rule","kind","last_seen_at","options","params","phone_apply_max_assets","plans","prevention","previewable","reappeared_from","remind_at","review_state","scope_id","scope_type","source_changes","status","status_changed_at","step","target_key","updated_at"]},"HierarchySuggestionDismissRequest":{"type":"object","properties":{"reason":{"enum":["intentional","wrong_grouping","fix_at_source"],"type":"string","description":"* `intentional` - This is intentional\n* `wrong_grouping` - The grouping is wrong\n* `fix_at_source` - We will fix it at the source","x-spec-enum-id":"26620421670c63ff"},"note":{"type":"string","default":"","maxLength":2000},"remind":{"type":"boolean","default":false,"description":"For intentional: ask again in 90 days."}},"required":["reason"]},"HierarchySuggestionDraft":{"type":"object","properties":{"id":{"type":"integer"},"revision":{"type":"integer","description":"Bumped by every preview; apply names the one it reviewed."},"edits":{"type":"object","additionalProperties":{}},"review":{"type":"object","additionalProperties":{}},"plan":{"allOf":[{"$ref":"#/components/schemas/HierarchySuggestionPlanRef"}],"nullable":true,"readOnly":true},"expires_at":{"type":"string","format":"date-time"}},"required":["edits","expires_at","id","plan","review","revision"]},"HierarchySuggestionEditsRequest":{"type":"object","properties":{"edits":{"description":"The reviewer's edits: {\"group_renames\": {\"<gid>\": \"name\"}, \"groups_excluded\": [\"<gid>\"], \"members_excluded\": [<asset id>], \"member_moves\": {\"<asset id>\": \"<gid>\"}}. A gid is a group's id from the groups list."}}},"HierarchySuggestionLabel":{"type":"object","properties":{"verdict":{"enum":["right","wrong","unclear"],"type":"string","description":"* `right` - Right\n* `wrong` - Wrong\n* `unclear` - Unclear","x-spec-enum-id":"8daf31925f32247c","readOnly":true},"note":{"type":"string","readOnly":true},"check_version":{"type":"integer","readOnly":true},"kind":{"type":"string","readOnly":true},"labeled_by":{"allOf":[{"$ref":"#/components/schemas/HierarchyUserRef"}],"nullable":true,"readOnly":true},"labeled_at":{"type":"string","format":"date-time","readOnly":true,"title":"Labeled"},"counts":{"type":"boolean","readOnly":true,"description":"Whether the label counts toward its check's precision."},"not_counted_reason":{"enum":["earlier_version","kind_changed","outside_gate",null],"type":"string","description":"Why it does not count: earlier_version (labeled for an earlier version of the check), kind_changed (the check has classified the suggestion differently since), outside_gate (a kind the gate does not count, H9 outside Merge). Null when it counts.","x-spec-enum-id":"3b7adca5e26c141d","nullable":true,"readOnly":true}},"required":["check_version","counts","kind","labeled_at","labeled_by","not_counted_reason","note","verdict"]},"HierarchySuggestionLabelRequestRequest":{"type":"object","properties":{"verdict":{"enum":["right","wrong","unclear"],"type":"string","description":"* `right` - Right\n* `wrong` - Wrong\n* `unclear` - Unclear","x-spec-enum-id":"8daf31925f32247c"},"note":{"type":"string","default":"","maxLength":2000}},"required":["verdict"]},"HierarchySuggestionLabelResponse":{"type":"object","properties":{"label":{"allOf":[{"$ref":"#/components/schemas/HierarchySuggestionLabel"}],"nullable":true,"description":"Null until someone labels it."}},"required":["label"]},"HierarchySuggestionList":{"type":"object","description":"A suggestion as the list shows it: what renders the title and the row, no members. Organization and asset\nreferences in ``params`` and ``facts`` the reader may not see are hidden (:data:`HIDDEN_REF`).","properties":{"id":{"type":"integer","readOnly":true},"check":{"type":"string","readOnly":true},"check_version":{"type":"integer","readOnly":true},"kind":{"type":"string","readOnly":true},"status":{"enum":["open","applying","applied","partly_applied","undone","snoozed","dismissed","resolved"],"type":"string","description":"* `open` - Open\n* `applying` - Applying\n* `applied` - Applied\n* `partly_applied` - Partly applied\n* `undone` - Undone\n* `snoozed` - Snoozed\n* `dismissed` - Dismissed\n* `resolved` - Resolved","x-spec-enum-id":"464670dafc170efb","readOnly":true,"default":"open"},"step":{"type":"integer","readOnly":true},"informational":{"type":"boolean","readOnly":true},"previewable":{"type":"boolean","readOnly":true},"scope_type":{"enum":["organization","connector_config","instance"],"type":"string","description":"* `organization` - Organization\n* `connector_config` - Connector\n* `instance` - Instance","x-spec-enum-id":"33d4f870901bc46a","readOnly":true},"scope_id":{"type":"integer","readOnly":true,"nullable":true,"title":"Scope"},"target_key":{"type":"string","readOnly":true},"params":{"readOnly":true,"title":"Parameters"},"facts":{"readOnly":true},"assets_affected":{"type":"integer","readOnly":true},"confidence":{"enum":["high","medium","info"],"type":"string","description":"* `high` - High\n* `medium` - Medium\n* `info` - Informational","x-spec-enum-id":"29059549ba35b79d","readOnly":true},"fallback_title":{"type":"string","readOnly":true,"title":"Title"},"fallback_rationale":{"type":"string","readOnly":true,"title":"Rationale"},"dismiss_reason":{"enum":["intentional","wrong_grouping","fix_at_source"],"type":"string","description":"* `intentional` - This is intentional\n* `wrong_grouping` - The grouping is wrong\n* `fix_at_source` - We will fix it at the source","x-spec-enum-id":"26620421670c63ff","readOnly":true,"title":"Reason"},"remind_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Remind"},"reappeared_from":{"type":"integer","readOnly":true,"nullable":true},"status_changed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Changed"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated"},"last_seen_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last seen"},"applied":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true}},"required":["applied","assets_affected","check","check_version","confidence","created_at","dismiss_reason","facts","fallback_rationale","fallback_title","id","informational","kind","last_seen_at","params","previewable","reappeared_from","remind_at","scope_id","scope_type","status","status_changed_at","step","target_key","updated_at"]},"HierarchySuggestionPlacementRequest":{"type":"object","properties":{"value":{"type":"string","minLength":1,"description":"One of the connector's placement option values.","maxLength":64},"tag_key":{"type":"string","default":"","maxLength":128}},"required":["value"]},"HierarchySuggestionPlanRef":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"status":{"type":"string"},"source":{"type":"string"},"applied_at":{"type":"string","format":"date-time","nullable":true},"summary":{"type":"object","additionalProperties":{}}},"required":["applied_at","id","name","source","status"]},"HierarchySuggestionPreventionRequest":{"type":"object","properties":{"kind":{"enum":["rule_draft"],"type":"string","x-spec-enum-id":"f6a140edd0e36eba","default":"rule_draft","description":"The review's Keep it tidy option to create.\n\n* `rule_draft` - rule_draft"},"enable":{"type":"boolean","default":false,"description":"Turn the rule on now. Without it the rule is created disabled."}}},"HierarchySuggestionSnoozeRequest":{"type":"object","properties":{"days":{"type":"integer","maximum":365,"minimum":1,"default":30}}},"HierarchySuggestionUndoRequest":{"type":"object","properties":{"restore_connector_setting":{"type":"boolean","default":false,"description":"Also put the connector's placement setting back when the undo is applied, if nobody changed it since."},"turn_off_rule":{"type":"boolean","default":true,"description":"Also turn off the Keep It Tidy rule the suggestion created when the undo is applied; left on, it keeps placing assets the way the suggestion did (for group parents, back under them on their next change)."}}},"HierarchyTelemetry":{"type":"object","description":"``GET hierarchy/health/telemetry/``: counts, codes and ids only (pro/hierarchy_health/telemetry.py).","properties":{"shadow_mode":{"type":"boolean"},"shadow_mode_changed_at":{"type":"string","format":"date-time","nullable":true},"events":{"allOf":[{"$ref":"#/components/schemas/HierarchyTelemetryEvents"}],"description":"Outside shadow mode only."},"by_check":{"type":"object","additionalProperties":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/HierarchyEventCount"}},"description":"Per check key, per event (only the events it has)."},"shadow_events":{"type":"integer","description":"Events recorded in shadow mode, left out of every count."},"edited_before_apply":{"$ref":"#/components/schemas/HierarchyTelemetryEdits"},"dismissed_by_reason":{"type":"object","additionalProperties":{"type":"integer"}},"undone_within_14_days":{"type":"integer"},"time_to_apply_seconds":{"$ref":"#/components/schemas/HierarchyTelemetryTime"},"imports_resolved_through_history":{"allOf":[{"$ref":"#/components/schemas/HierarchyTelemetryImports"}],"nullable":true,"description":"Null on an instance without import tolerance."},"suggestions":{"$ref":"#/components/schemas/HierarchyTelemetrySuggestions"},"measures":{"$ref":"#/components/schemas/HierarchyTelemetryMeasures"}},"required":["by_check","dismissed_by_reason","edited_before_apply","events","imports_resolved_through_history","measures","shadow_events","shadow_mode","shadow_mode_changed_at","suggestions","time_to_apply_seconds","undone_within_14_days"]},"HierarchyTelemetryEdits":{"type":"object","properties":{"applies":{"type":"integer"},"edited":{"type":"integer","description":"Applies whose reviewer changed something first."},"edits":{"type":"object","additionalProperties":{"type":"integer"},"description":"Per kind of edit (group_renames, options.<key>, ...): applies."}},"required":["applies","edited","edits"]},"HierarchyTelemetryEvents":{"type":"object","properties":{"shown":{"allOf":[{"$ref":"#/components/schemas/HierarchyEventCount"}],"description":"Open rows of the list the Vue page loaded, once per person."},"opened":{"allOf":[{"$ref":"#/components/schemas/HierarchyEventCount"}],"description":"Review pages opened, once per person."},"applying":{"$ref":"#/components/schemas/HierarchyEventCount"},"applied":{"$ref":"#/components/schemas/HierarchyEventCount"},"dismissed":{"$ref":"#/components/schemas/HierarchyEventCount"},"snoozed":{"$ref":"#/components/schemas/HierarchyEventCount"},"undone":{"$ref":"#/components/schemas/HierarchyEventCount"}},"required":["applied","applying","dismissed","opened","shown","snoozed","undone"]},"HierarchyTelemetryImports":{"type":"object","properties":{"imports":{"type":"integer"},"resolutions":{"type":"integer"}},"required":["imports","resolutions"]},"HierarchyTelemetryMeasures":{"type":"object","properties":{"total_assets":{"type":"integer"},"placed":{"type":"integer"},"priority_complete":{"type":"integer"},"first_import_at":{"type":"string","format":"date-time","nullable":true},"measures_first_observed_at":{"type":"string","format":"date-time","nullable":true},"placed_complete_at":{"type":"string","format":"date-time","nullable":true},"priority_complete_at":{"type":"string","format":"date-time","nullable":true}},"required":["first_import_at","measures_first_observed_at","placed","placed_complete_at","priority_complete","priority_complete_at","total_assets"]},"HierarchyTelemetrySuggestions":{"type":"object","properties":{"open":{"type":"integer"},"open_by_check":{"type":"object","additionalProperties":{"type":"integer"}},"applied":{"type":"integer"},"undone":{"type":"integer"}},"required":["applied","open","open_by_check","undone"]},"HierarchyTelemetryTime":{"type":"object","properties":{"suggestions":{"type":"integer"},"median":{"type":"integer","nullable":true},"p90":{"type":"integer","nullable":true}},"required":["median","p90","suggestions"]},"HierarchyTouching":{"type":"object","description":"``GET hierarchy/suggestions/touching/``: how many open suggestions touch what a page shows, and the first few.","properties":{"count":{"type":"integer","description":"Every one that touches it, the hidden ones left out."},"results":{"type":"array","items":{"$ref":"#/components/schemas/HierarchySuggestionList"},"description":"The first few, most assets affected first."}},"required":["count","results"]},"HierarchyUserRef":{"type":"object","properties":{"id":{"type":"integer"},"username":{"type":"string"}},"required":["id","username"]},"ImportFindings":{"type":"object","properties":{"limit":{"type":"integer"},"created":{"type":"array","items":{"$ref":"#/components/schemas/FindingPreviewItem"}},"closed":{"type":"array","items":{"$ref":"#/components/schemas/FindingPreviewItem"}}},"required":["closed","created","limit"]},"ImportLanguages":{"type":"object","properties":{"product":{"type":"integer"},"file":{"type":"string","format":"uri"}},"required":["file","product"]},"ImportLanguagesRequest":{"type":"object","properties":{"product":{"type":"integer"},"file":{"type":"string","format":"binary"}},"required":["file","product"]},"ImportNameResolution":{"type":"object","description":"The ``name_resolution`` warning of an import response (``pro/importers/name_resolution.py``).","properties":{"supplied_product_type_name":{"type":"string","readOnly":true,"description":"The product_type_name the request sent."},"supplied_product_name":{"type":"string","readOnly":true,"description":"The product_name the request sent."},"product_type_name":{"type":"string","readOnly":true,"description":"The current product_type_name the import used."},"product_name":{"type":"string","readOnly":true,"description":"The current product_name the import used."},"reasons":{"type":"array","items":{"enum":["asset_renamed","asset_moved","organization_renamed"],"type":"string","description":"* `asset_renamed` - asset_renamed\n* `asset_moved` - asset_moved\n* `organization_renamed` - organization_renamed","x-spec-enum-id":"00281a170df74521"},"readOnly":true,"description":"Why the names sent resolved to the target."},"message":{"type":"string","readOnly":true,"description":"What to change in the pipeline, in the caller's language."}},"required":["message","product_name","product_type_name","reasons","supplied_product_name","supplied_product_type_name"]},"ImportPreviewRequestRequest":{"type":"object","description":"Request serializer for import preview.","properties":{"scan_type":{"type":"string","minLength":1},"file":{"type":"string","format":"binary"},"product":{"type":"integer","description":"Product ID"},"engagement":{"type":"object","description":"Exactly one of: engagement_id, name, branch_tag, or tags. With multipart/form-data, pass this field as a JSON string.","properties":{"engagement_id":{"type":"integer","nullable":true},"name":{"type":"string","nullable":true},"branch_tag":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"string"},"nullable":true}}},"close_old_findings":{"type":"boolean","default":false},"close_old_findings_product_scope":{"type":"boolean","default":false},"deduplication_on_engagement":{"type":"boolean","nullable":true},"service":{"type":"string","nullable":true},"minimum_severity":{"enum":["Info","Low","Medium","High","Critical"],"type":"string","description":"* `Info` - Info\n* `Low` - Low\n* `Medium` - Medium\n* `High` - High\n* `Critical` - Critical","x-spec-enum-id":"fc5d16a20ed06136","default":"Info"},"findings_limit":{"type":"integer","maximum":250,"minimum":1,"default":10}},"required":["engagement","file","product","scan_type"]},"ImportPreviewResponse":{"type":"object","description":"Response serializer for import preview.","properties":{"parsed_findings_count":{"type":"integer"},"statistics":{"$ref":"#/components/schemas/PreviewStatistics"},"findings":{"$ref":"#/components/schemas/ImportFindings"},"product_id":{"type":"integer"},"product_name":{"type":"string"},"engagement_id":{"type":"integer"},"engagement_name":{"type":"string"},"engagement_branch_tag":{"type":"string","nullable":true},"engagement_version":{"type":"string","nullable":true},"engagement_tags":{"type":"array","items":{"type":"string"}},"scan_type":{"type":"string"}},"required":["engagement_branch_tag","engagement_id","engagement_name","engagement_tags","engagement_version","findings","parsed_findings_count","product_id","product_name","scan_type","statistics"]},"ImportStatistics":{"type":"object","properties":{"before":{"allOf":[{"$ref":"#/components/schemas/SeverityStatusStatistics"}],"description":"Finding statistics as stored in Defect Dojo before the import"},"delta":{"allOf":[{"$ref":"#/components/schemas/DeltaStatistics"}],"description":"Finding statistics of modifications made by the reimport. Only available when TRACK_IMPORT_HISTORY has not been disabled."},"after":{"allOf":[{"$ref":"#/components/schemas/SeverityStatusStatistics"}],"description":"Finding statistics as stored in Defect Dojo after the import"}},"required":["after"]},"ImportStatisticsRequest":{"type":"object","properties":{"before":{"allOf":[{"$ref":"#/components/schemas/SeverityStatusStatisticsRequest"}],"description":"Finding statistics as stored in Defect Dojo before the import"},"delta":{"allOf":[{"$ref":"#/components/schemas/DeltaStatisticsRequest"}],"description":"Finding statistics of modifications made by the reimport. Only available when TRACK_IMPORT_HISTORY has not been disabled."},"after":{"allOf":[{"$ref":"#/components/schemas/SeverityStatusStatisticsRequest"}],"description":"Finding statistics as stored in Defect Dojo after the import"}},"required":["after"]},"InlineImage":{"type":"object","description":"An image stored for use in markdown fields.","properties":{"id":{"type":"string","format":"uuid","readOnly":true,"description":"The identifier of the stored image."},"url":{"type":"string","readOnly":true,"description":"The image reference to embed in a markdown field, root-relative. Use it exactly as returned: an absolute form of it is not displayed."},"markdown":{"type":"string","readOnly":true,"description":"A ready-made markdown image for the reference, to paste into any markdown field."},"content_type":{"type":"string","readOnly":true,"description":"The MIME type derived from the image bytes, not from the upload"},"size_bytes":{"type":"integer","readOnly":true,"title":"Size","description":"The size of the stored image in bytes"},"original_filename":{"type":"string","readOnly":true,"description":"The name the file had when it was uploaded, kept for display"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the image was uploaded"}},"required":["content_type","created_at","id","markdown","original_filename","size_bytes","url"]},"InlineImageUploadRequest":{"type":"object","description":"An image to store for use in a markdown field.","properties":{"image":{"type":"string","format":"binary","description":"A PNG, JPEG, GIF or WebP image of 10 MB or less. The type is read from the bytes, not the filename."}},"required":["image"]},"InlineImageValidationError":{"type":"object","properties":{"image":{"type":"array","items":{"type":"string"},"description":"Why the upload was rejected."}},"required":["image"]},"IpMask":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"ip":{"type":"string","title":"IP Address"},"mask":{"type":"integer","maximum":32,"minimum":0,"nullable":true},"label":{"type":"string","nullable":true,"maxLength":128}},"required":["id","ip"]},"IpMaskRequest":{"type":"object","properties":{"ip":{"type":"string","minLength":1,"title":"IP Address"},"mask":{"type":"integer","maximum":32,"minimum":0,"nullable":true},"label":{"type":"string","nullable":true,"maxLength":128}},"required":["ip"]},"JIRAInstance":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"configuration_name":{"type":"string","description":"Enter a name to give to this configuration","maxLength":2000},"url":{"type":"string","format":"uri","title":"JIRA URL","description":"For more information how to configure Jira, read the DefectDojo documentation.","maxLength":2000},"username":{"type":"string","title":"Username/Email","description":"Username or Email Address, see DefectDojo documentation for more information.","maxLength":2000},"default_issue_type":{"enum":["Task","Story","Epic","Spike","Bug","Security"],"type":"string","x-spec-enum-id":"5ded50425ca94b38","description":"You can define extra issue types in settings.py\n\n* `Task` - Task\n* `Story` - Story\n* `Epic` - Epic\n* `Spike` - Spike\n* `Bug` - Bug\n* `Security` - Security"},"issue_template_dir":{"type":"string","nullable":true,"description":"Choose the folder containing the Django templates used to render the JIRA issue description. These are stored in dojo/templates/issue-trackers. Leave empty to use the default jira_full templates.","maxLength":255},"epic_name_id":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"To obtain the 'Epic name id' visit https://<YOUR JIRA URL>/rest/api/2/field and search for Epic Name. Copy the number out of cf[number] and paste it here."},"open_status_key":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Reopen Transition ID","description":"Transition ID to Re-Open JIRA issues, visit https://<YOUR JIRA URL>/rest/api/latest/issue/<ANY VALID ISSUE KEY>/transitions?expand=transitions.fields to find the ID for your JIRA instance"},"close_status_key":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Close Transition ID","description":"Transition ID to Close JIRA issues, visit https://<YOUR JIRA URL>/rest/api/latest/issue/<ANY VALID ISSUE KEY>/transitions?expand=transitions.fields to find the ID for your JIRA instance"},"info_mapping_severity":{"type":"string","description":"Maps to the 'Priority' field in Jira. For example: Info","maxLength":200},"low_mapping_severity":{"type":"string","description":"Maps to the 'Priority' field in Jira. For example: Low","maxLength":200},"medium_mapping_severity":{"type":"string","description":"Maps to the 'Priority' field in Jira. For example: Medium","maxLength":200},"high_mapping_severity":{"type":"string","description":"Maps to the 'Priority' field in Jira. For example: High","maxLength":200},"critical_mapping_severity":{"type":"string","description":"Maps to the 'Priority' field in Jira. For example: Critical","maxLength":200},"finding_text":{"type":"string","nullable":true,"description":"Additional text that will be added to the finding in Jira. For example including how the finding was created or who to contact for more information."},"accepted_mapping_resolution":{"type":"string","nullable":true,"title":"Risk Accepted resolution mapping","description":"JIRA issues that are closed in JIRA with one of these resolutions will result in the Finding becoming Risk Accepted in Defect Dojo. JIRA issues that are closed in JIRA with one of these resolutions will result in the Finding becoming Risk Accepted in Defect Dojo. The expiration time for this Risk Acceptance will be determined by the \"Risk acceptance form default days\" in \"System Settings\". This mapping is not used when Findings are pushed to JIRA. In that case the Risk Accepted Findings are closed in JIRA and JIRA sets the default resolution.","maxLength":300},"false_positive_mapping_resolution":{"type":"string","nullable":true,"title":"False Positive resolution mapping","description":"JIRA issues that are closed in JIRA with one of these resolutions will result in the Finding being marked as False Positive Defect Dojo. This mapping is not used when Findings are pushed to JIRA. In that case the Finding is closed in JIRA and JIRA sets the default resolution.","maxLength":300},"global_jira_sla_notification":{"type":"boolean","title":"Globally send SLA notifications as comment?","description":"This setting can be overidden at the Product level"},"finding_jira_sync":{"type":"boolean","title":"Automatically sync Findings with JIRA?","description":"If enabled, this will sync changes to a Finding automatically to JIRA"}},"required":["close_status_key","critical_mapping_severity","epic_name_id","high_mapping_severity","id","info_mapping_severity","low_mapping_severity","medium_mapping_severity","open_status_key","url","username"]},"JIRAInstanceRequest":{"type":"object","properties":{"configuration_name":{"type":"string","minLength":1,"description":"Enter a name to give to this configuration","maxLength":2000},"url":{"type":"string","format":"uri","minLength":1,"title":"JIRA URL","description":"For more information how to configure Jira, read the DefectDojo documentation.","maxLength":2000},"username":{"type":"string","minLength":1,"title":"Username/Email","description":"Username or Email Address, see DefectDojo documentation for more information.","maxLength":2000},"password":{"type":"string","writeOnly":true,"minLength":1,"title":"Password/Token","description":"Password or API Token, see DefectDojo documentation for more information.","maxLength":2000},"default_issue_type":{"enum":["Task","Story","Epic","Spike","Bug","Security"],"type":"string","x-spec-enum-id":"5ded50425ca94b38","description":"You can define extra issue types in settings.py\n\n* `Task` - Task\n* `Story` - Story\n* `Epic` - Epic\n* `Spike` - Spike\n* `Bug` - Bug\n* `Security` - Security"},"issue_template_dir":{"type":"string","nullable":true,"description":"Choose the folder containing the Django templates used to render the JIRA issue description. These are stored in dojo/templates/issue-trackers. Leave empty to use the default jira_full templates.","maxLength":255},"epic_name_id":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"To obtain the 'Epic name id' visit https://<YOUR JIRA URL>/rest/api/2/field and search for Epic Name. Copy the number out of cf[number] and paste it here."},"open_status_key":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Reopen Transition ID","description":"Transition ID to Re-Open JIRA issues, visit https://<YOUR JIRA URL>/rest/api/latest/issue/<ANY VALID ISSUE KEY>/transitions?expand=transitions.fields to find the ID for your JIRA instance"},"close_status_key":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Close Transition ID","description":"Transition ID to Close JIRA issues, visit https://<YOUR JIRA URL>/rest/api/latest/issue/<ANY VALID ISSUE KEY>/transitions?expand=transitions.fields to find the ID for your JIRA instance"},"info_mapping_severity":{"type":"string","minLength":1,"description":"Maps to the 'Priority' field in Jira. For example: Info","maxLength":200},"low_mapping_severity":{"type":"string","minLength":1,"description":"Maps to the 'Priority' field in Jira. For example: Low","maxLength":200},"medium_mapping_severity":{"type":"string","minLength":1,"description":"Maps to the 'Priority' field in Jira. For example: Medium","maxLength":200},"high_mapping_severity":{"type":"string","minLength":1,"description":"Maps to the 'Priority' field in Jira. For example: High","maxLength":200},"critical_mapping_severity":{"type":"string","minLength":1,"description":"Maps to the 'Priority' field in Jira. For example: Critical","maxLength":200},"finding_text":{"type":"string","nullable":true,"description":"Additional text that will be added to the finding in Jira. For example including how the finding was created or who to contact for more information."},"accepted_mapping_resolution":{"type":"string","nullable":true,"title":"Risk Accepted resolution mapping","description":"JIRA issues that are closed in JIRA with one of these resolutions will result in the Finding becoming Risk Accepted in Defect Dojo. JIRA issues that are closed in JIRA with one of these resolutions will result in the Finding becoming Risk Accepted in Defect Dojo. The expiration time for this Risk Acceptance will be determined by the \"Risk acceptance form default days\" in \"System Settings\". This mapping is not used when Findings are pushed to JIRA. In that case the Risk Accepted Findings are closed in JIRA and JIRA sets the default resolution.","maxLength":300},"false_positive_mapping_resolution":{"type":"string","nullable":true,"title":"False Positive resolution mapping","description":"JIRA issues that are closed in JIRA with one of these resolutions will result in the Finding being marked as False Positive Defect Dojo. This mapping is not used when Findings are pushed to JIRA. In that case the Finding is closed in JIRA and JIRA sets the default resolution.","maxLength":300},"global_jira_sla_notification":{"type":"boolean","title":"Globally send SLA notifications as comment?","description":"This setting can be overidden at the Product level"},"finding_jira_sync":{"type":"boolean","title":"Automatically sync Findings with JIRA?","description":"If enabled, this will sync changes to a Finding automatically to JIRA"}},"required":["close_status_key","critical_mapping_severity","epic_name_id","high_mapping_severity","info_mapping_severity","low_mapping_severity","medium_mapping_severity","open_status_key","password","url","username"]},"JIRAIssue":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"url":{"type":"string","readOnly":true},"jira_id":{"type":"string","maxLength":200},"jira_key":{"type":"string","maxLength":200},"jira_creation":{"type":"string","format":"date-time","nullable":true,"description":"The date a Jira issue was created from this finding."},"jira_change":{"type":"string","format":"date-time","nullable":true,"title":"Jira last update","description":"The date the linked Jira issue was last modified."},"jira_project":{"type":"integer","nullable":true},"finding":{"type":"integer","nullable":true},"engagement":{"type":"integer","nullable":true},"finding_group":{"type":"integer","nullable":true}},"required":["id","jira_id","jira_key","url"]},"JIRAIssueRequest":{"type":"object","properties":{"jira_id":{"type":"string","minLength":1,"maxLength":200},"jira_key":{"type":"string","minLength":1,"maxLength":200},"jira_creation":{"type":"string","format":"date-time","nullable":true,"description":"The date a Jira issue was created from this finding."},"jira_change":{"type":"string","format":"date-time","nullable":true,"title":"Jira last update","description":"The date the linked Jira issue was last modified."},"jira_project":{"type":"integer","nullable":true},"finding":{"type":"integer","nullable":true},"engagement":{"type":"integer","nullable":true},"finding_group":{"type":"integer","nullable":true}},"required":["jira_id","jira_key"]},"JIRAProject":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"project_key":{"type":"string","maxLength":200},"issue_template_dir":{"type":"string","nullable":true,"description":"Choose the folder containing the Django templates used to render the JIRA issue description. These are stored in dojo/templates/issue-trackers. Leave empty to use the default jira_full templates.","maxLength":255},"component":{"type":"string","maxLength":200},"custom_fields":{"nullable":true,"description":"JIRA custom field JSON mapping of Id to value, e.g. {\"customfield_10122\": [{\"name\": \"8.0.1\"}]}"},"close_transition_fields":{"nullable":true,"description":"JIRA fields to send as part of the Close transition, e.g. {\"resolution\": {\"name\": \"Won't Fix\"}, \"customfield_10200\": \"justification\"}. Use this when the JIRA workflow requires fields on the close transition screen. Fields not on the transition screen are rejected by JIRA."},"reopen_transition_fields":{"nullable":true,"description":"JIRA fields to send as part of the Reopen transition, e.g. {\"customfield_10201\": \"reopened by DefectDojo\"}. Fields not on the transition screen are rejected by JIRA."},"default_assignee":{"type":"string","nullable":true,"description":"JIRA default assignee (name). If left blank then it defaults to whatever is configured in JIRA.","maxLength":200},"jira_labels":{"type":"string","nullable":true,"description":"JIRA issue labels space seperated","maxLength":200},"add_vulnerability_id_to_jira_label":{"type":"boolean","title":"Add vulnerability Id as a JIRA label"},"push_all_issues":{"type":"boolean","description":"Automatically create JIRA tickets for verified findings, assuming enforce_verified_status is True, or for all findings otherwise. Once linked, the JIRA ticket will continue to sync, regardless of status in DefectDojo."},"enable_engagement_epic_mapping":{"type":"boolean"},"epic_issue_type_name":{"type":"string","description":"The name of the of structure that represents an Epic","maxLength":64},"push_notes":{"type":"boolean"},"product_jira_sla_notification":{"type":"boolean","title":"Send SLA notifications as comment?"},"risk_acceptance_expiration_notification":{"type":"boolean","title":"Send Risk Acceptance expiration notifications as comment?"},"enabled":{"type":"boolean","title":"Enable Connection With Jira Project","description":"When disabled, Findings will no longer be pushed to Jira, even if they have already been pushed previously."},"jira_instance":{"type":"integer","nullable":true},"product":{"type":"integer","nullable":true},"engagement":{"type":"integer","nullable":true},"prefetch":{"type":"object","properties":{"engagement":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/FindingEngagement"}},"jira_instance":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/JIRAInstance"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}}}}},"required":["id"]},"JIRAProjectRequest":{"type":"object","properties":{"project_key":{"type":"string","maxLength":200},"issue_template_dir":{"type":"string","nullable":true,"description":"Choose the folder containing the Django templates used to render the JIRA issue description. These are stored in dojo/templates/issue-trackers. Leave empty to use the default jira_full templates.","maxLength":255},"component":{"type":"string","maxLength":200},"custom_fields":{"nullable":true,"description":"JIRA custom field JSON mapping of Id to value, e.g. {\"customfield_10122\": [{\"name\": \"8.0.1\"}]}"},"close_transition_fields":{"nullable":true,"description":"JIRA fields to send as part of the Close transition, e.g. {\"resolution\": {\"name\": \"Won't Fix\"}, \"customfield_10200\": \"justification\"}. Use this when the JIRA workflow requires fields on the close transition screen. Fields not on the transition screen are rejected by JIRA."},"reopen_transition_fields":{"nullable":true,"description":"JIRA fields to send as part of the Reopen transition, e.g. {\"customfield_10201\": \"reopened by DefectDojo\"}. Fields not on the transition screen are rejected by JIRA."},"default_assignee":{"type":"string","nullable":true,"description":"JIRA default assignee (name). If left blank then it defaults to whatever is configured in JIRA.","maxLength":200},"jira_labels":{"type":"string","nullable":true,"description":"JIRA issue labels space seperated","maxLength":200},"add_vulnerability_id_to_jira_label":{"type":"boolean","title":"Add vulnerability Id as a JIRA label"},"push_all_issues":{"type":"boolean","description":"Automatically create JIRA tickets for verified findings, assuming enforce_verified_status is True, or for all findings otherwise. Once linked, the JIRA ticket will continue to sync, regardless of status in DefectDojo."},"enable_engagement_epic_mapping":{"type":"boolean"},"epic_issue_type_name":{"type":"string","description":"The name of the of structure that represents an Epic","maxLength":64},"push_notes":{"type":"boolean"},"product_jira_sla_notification":{"type":"boolean","title":"Send SLA notifications as comment?"},"risk_acceptance_expiration_notification":{"type":"boolean","title":"Send Risk Acceptance expiration notifications as comment?"},"enabled":{"type":"boolean","title":"Enable Connection With Jira Project","description":"When disabled, Findings will no longer be pushed to Jira, even if they have already been pushed previously."},"jira_instance":{"type":"integer","nullable":true},"product":{"type":"integer","nullable":true},"engagement":{"type":"integer","nullable":true}}},"Language":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"files":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of files"},"blank":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of blank lines"},"comment":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of comment lines"},"code":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of code lines"},"created":{"type":"string","format":"date-time","readOnly":true},"language":{"type":"integer"},"product":{"type":"integer"},"user":{"type":"integer","nullable":true},"prefetch":{"type":"object","properties":{"language":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/LanguageType"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["created","id","language","product"]},"LanguageRequest":{"type":"object","properties":{"files":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of files"},"blank":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of blank lines"},"comment":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of comment lines"},"code":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of code lines"},"language":{"type":"integer"},"product":{"type":"integer"},"user":{"type":"integer","nullable":true}},"required":["language","product"]},"LanguageType":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"language":{"type":"string","maxLength":100},"color":{"type":"string","nullable":true,"title":"HTML color","maxLength":7}},"required":["id","language"]},"LanguageTypeRequest":{"type":"object","properties":{"language":{"type":"string","minLength":1,"maxLength":100},"color":{"type":"string","nullable":true,"title":"HTML color","maxLength":7}},"required":["language"]},"LegacyAuditLog":{"type":"object","properties":{"model_name":{"type":"string","readOnly":true},"object_id":{"type":"integer","maximum":9223372036854775807,"minimum":-9223372036854775808,"format":"int64","nullable":true},"object_name":{"type":"string","readOnly":true},"action":{"enum":[0,1,2,3],"type":"integer","description":"* `0` - create\n* `1` - update\n* `2` - delete\n* `3` - access","x-spec-enum-id":"f07ca4f574297d89","minimum":0,"maximum":32767},"changes":{},"user":{"$ref":"#/components/schemas/Actor"},"timestamp":{"type":"string","format":"date-time"},"remote_addr":{"type":"string","nullable":true}},"required":["action","changes","model_name","object_name","user"]},"LicenseManager":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"remind_on":{"type":"string","format":"date","nullable":true,"title":"Scheduled Reminder Date","description":"The reminder will occur on the set date"},"snooze_exp":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Snooze Expiration Time Stamp","description":"Records when the snooze will expire"},"snoozed_on":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Snooze Time Stamp","description":"Records the last time the update was delayed"},"remind":{"type":"boolean","readOnly":true,"description":"Allow the remind popup to be seen"},"enable_reminders":{"type":"boolean","title":"Enable Popup Reminders","description":"When enabled, a popup message will appear as a reminder that the license will expire shortly"},"monthly_spend_limit_cents":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Monthly Spend Limit (cents)","description":"Pay-as-you-go only. Stop accepting new findings once this month's charges reach this amount. Leave empty to use the limit set in the cloud portal."}},"required":["id","remind","snooze_exp","snoozed_on"]},"LoadForestRequestRequest":{"type":"object","properties":{"initial_depth":{"type":"integer","maximum":10,"minimum":1,"default":3},"nodes_per_level":{"type":"integer","maximum":100,"minimum":1,"default":5},"max_roots":{"type":"integer","maximum":100,"minimum":1,"default":25},"relationship_types":{"type":"array","items":{"type":"string","minLength":1}}}},"LoadForestResponse":{"type":"object","properties":{"trees":{"type":"array","items":{"$ref":"#/components/schemas/Tree"}},"relationships":{"type":"array","items":{"$ref":"#/components/schemas/Relationship"}},"total_roots":{"type":"integer"},"has_more_roots":{"type":"boolean"},"unconnected_count":{"type":"integer"}},"required":["has_more_roots","relationships","total_roots","trees","unconnected_count"]},"LoadTreeFromNodeRequestRequest":{"type":"object","properties":{"target_node_id":{"type":"integer"},"depth_up":{"type":"integer","maximum":10,"minimum":0,"default":2},"depth_down":{"type":"integer","maximum":20,"minimum":1,"default":8},"nodes_per_level":{"type":"integer","maximum":100,"minimum":1,"default":10},"relationship_types":{"type":"array","items":{"type":"string","minLength":1}}},"required":["target_node_id"]},"LoadTreeFromNodeResponse":{"type":"object","properties":{"tree":{"$ref":"#/components/schemas/Tree"},"highlight_node_id":{"type":"integer"},"target_level":{"type":"integer"}},"required":["highlight_node_id","target_level","tree"]},"LoadTreeRequestRequest":{"type":"object","properties":{"root_node_ids":{"type":"array","items":{"type":"integer"},"minItems":1},"initial_depth":{"type":"integer","maximum":10,"minimum":1,"default":3},"nodes_per_level":{"type":"integer","maximum":100,"minimum":1,"default":10},"relationship_types":{"type":"array","items":{"type":"string","minLength":1}}},"required":["root_node_ids"]},"LoadTreeResponse":{"type":"object","properties":{"trees":{"type":"array","items":{"$ref":"#/components/schemas/Tree"}},"relationships":{"type":"array","items":{"$ref":"#/components/schemas/Relationship"}}},"required":["relationships","trees"]},"Location":{"type":"object","description":"Serializer for the Location model with serializers for the related objects.","properties":{"id":{"type":"integer","readOnly":true},"tags":{"type":"array","items":{"type":"string"},"readOnly":true},"inherited_tags":{"type":"array","items":{"type":"string"},"readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"location_type":{"type":"string","readOnly":true,"description":"The type of location that is stored. This field is automatically managed"},"location_value":{"type":"string","readOnly":true,"description":"The string representation of a given location. This field is automatically managed"}},"required":["created","id","inherited_tags","location_type","location_value","tags","updated"]},"LocationBatch":{"type":"object","description":"Connector-facing batch: one config's current complete location inventory for one\nasset. An empty items list is valid: it mitigates everything this config created.\nmax_length mirrors the Go side's per-record ceiling.","properties":{"source":{"type":"string","maxLength":300},"items":{"type":"array","items":{"$ref":"#/components/schemas/LocationItem"}}},"required":["items","source"]},"LocationBatchRequest":{"type":"object","description":"Connector-facing batch: one config's current complete location inventory for one\nasset. An empty items list is valid: it mitigates everything this config created.\nmax_length mirrors the Go side's per-record ceiling.","properties":{"source":{"type":"string","minLength":1,"maxLength":300},"items":{"type":"array","items":{"$ref":"#/components/schemas/LocationItemRequest"}}},"required":["items","source"]},"LocationFindingReference":{"type":"object","description":"Serializer for the LocationFindingReference model with serializers for the related objects.","properties":{"id":{"type":"integer","readOnly":true},"location_type":{"type":"string","readOnly":true},"location_value":{"type":"string","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"relationship":{"enum":["owned_by","used_by",""],"type":"string","x-spec-enum-id":"8c638fc6583828e5","description":"The relationship between two locations\n\n* `owned_by` - is owned by\n* `used_by` - is used by"},"relationship_data":{"description":"Any extra data about this relationship"},"audit_time":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"The time when the audit was performed"},"status":{"enum":["Active","Mitigated","FalsePositive","RiskAccepted","OutOfScope"],"type":"string","x-spec-enum-id":"918ee82ac8d9cac7","description":"The status of the the given Location\n\n* `Active` - Active\n* `Mitigated` - Mitigated\n* `FalsePositive` - False Positive\n* `RiskAccepted` - Risk Accepted\n* `OutOfScope` - Out Of Scope"},"location":{"type":"integer"},"finding":{"type":"integer"},"test":{"type":"integer","readOnly":true,"description":"The test that reported this location for the finding"},"auditor":{"type":"integer","nullable":true,"description":"The user who audited the location"}},"required":["audit_time","created","finding","id","location","location_type","location_value","test","updated"]},"LocationFindingReferenceRequest":{"type":"object","description":"Serializer for the LocationFindingReference model with serializers for the related objects.","properties":{"relationship":{"enum":["owned_by","used_by",""],"type":"string","x-spec-enum-id":"8c638fc6583828e5","description":"The relationship between two locations\n\n* `owned_by` - is owned by\n* `used_by` - is used by"},"relationship_data":{"description":"Any extra data about this relationship"},"status":{"enum":["Active","Mitigated","FalsePositive","RiskAccepted","OutOfScope"],"type":"string","x-spec-enum-id":"918ee82ac8d9cac7","description":"The status of the the given Location\n\n* `Active` - Active\n* `Mitigated` - Mitigated\n* `FalsePositive` - False Positive\n* `RiskAccepted` - Risk Accepted\n* `OutOfScope` - Out Of Scope"},"location":{"type":"integer"},"finding":{"type":"integer"},"auditor":{"type":"integer","nullable":true,"description":"The user who audited the location"}},"required":["finding","location"]},"LocationItem":{"type":"object","description":"One location in a connector's inventory batch. `type` is checked at ingest time,\nwhere an unknown type becomes a counted per-item rejection instead of a 400.","properties":{"type":{"type":"string","maxLength":12},"data":{"type":"object","additionalProperties":{}}},"required":["data","type"]},"LocationItemRequest":{"type":"object","description":"One location in a connector's inventory batch. `type` is checked at ingest time,\nwhere an unknown type becomes a counted per-item rejection instead of a 400.","properties":{"type":{"type":"string","minLength":1,"maxLength":12},"data":{"type":"object","additionalProperties":{}}},"required":["data","type"]},"LocationProductReference":{"type":"object","description":"Serializer for the LocationProductReference model with serializers for the related objects.","properties":{"id":{"type":"integer","readOnly":true},"location_type":{"type":"string","readOnly":true},"location_value":{"type":"string","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"relationship":{"enum":["owned_by","used_by",""],"type":"string","x-spec-enum-id":"8c638fc6583828e5","description":"The relationship between two locations\n\n* `owned_by` - is owned by\n* `used_by` - is used by"},"relationship_data":{"description":"Any extra data about this relationship"},"status":{"enum":["Active","Mitigated"],"type":"string","x-spec-enum-id":"bcfb073a62b96b70","description":"The status of the the given Location\n\n* `Active` - Active\n* `Mitigated` - Mitigated"},"location":{"type":"integer"},"product":{"type":"integer"}},"required":["created","id","location","location_type","location_value","product","updated"]},"LocationProductReferenceRequest":{"type":"object","description":"Serializer for the LocationProductReference model with serializers for the related objects.","properties":{"relationship":{"enum":["owned_by","used_by",""],"type":"string","x-spec-enum-id":"8c638fc6583828e5","description":"The relationship between two locations\n\n* `owned_by` - is owned by\n* `used_by` - is used by"},"relationship_data":{"description":"Any extra data about this relationship"},"status":{"enum":["Active","Mitigated"],"type":"string","x-spec-enum-id":"bcfb073a62b96b70","description":"The status of the the given Location\n\n* `Active` - Active\n* `Mitigated` - Mitigated"},"location":{"type":"integer"},"product":{"type":"integer"}},"required":["location","product"]},"LoginBanner":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"banner_enable":{"type":"boolean"},"banner_message":{"type":"string","default":"","maxLength":500}},"required":["banner_enable","id"]},"LoginBannerRequest":{"type":"object","properties":{"banner_enable":{"type":"boolean"},"banner_message":{"type":"string","default":"","maxLength":500}},"required":["banner_enable"]},"MFAAuthToken":{"type":"object","description":"Credential check that also refuses an account still owing a forced password reset.","properties":{"token":{"type":"string","readOnly":true}},"required":["token"]},"MFAAuthTokenRequest":{"type":"object","description":"Credential check that also refuses an account still owing a forced password reset.","properties":{"username":{"type":"string","writeOnly":true,"minLength":1},"password":{"type":"string","writeOnly":true,"minLength":1},"mfa_code":{"type":"string","writeOnly":true,"minLength":1}},"required":["password","username"]},"ManagedSettingsRequestRequest":{"type":"object","properties":{"token":{"type":"string","minLength":1,"maxLength":200},"fail_closed":{"type":"boolean","default":false},"managed_hooks_only":{"type":"boolean","default":false}},"required":["token"]},"Mapping":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the mapping was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Test ID","description":"The last time the mapping was updated"},"defectdojo_product_type_id":{"type":"integer","nullable":true,"title":"Product Type ID","description":"The ID of the Product Type associated with the record"},"defectdojo_product_id":{"type":"integer","nullable":true,"title":"Product ID","description":"The ID of the Product associated with the record"},"defectdojo_engagement_id":{"type":"integer","nullable":true,"title":"Engagement ID","description":"The ID of the Engagement associated with the record"}},"required":["created_at","id","updated_at"]},"MappingEngagement":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","nullable":true,"maxLength":300}},"required":["id"]},"MappingProduct":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255}},"required":["id","name"]},"MappingProductType":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255}},"required":["id","name"]},"MappingRequest":{"type":"object","properties":{"defectdojo_product_type_id":{"type":"integer","nullable":true,"title":"Product Type ID","description":"The ID of the Product Type associated with the record"},"defectdojo_product_id":{"type":"integer","nullable":true,"title":"Product ID","description":"The ID of the Product associated with the record"},"defectdojo_engagement_id":{"type":"integer","nullable":true,"title":"Engagement ID","description":"The ID of the Engagement associated with the record"}}},"MappingSubtype":{"type":"object","description":"Serializes the through row -- per-subtype status with the nested Test (or null when STALE).","properties":{"test_type_name":{"type":"string","description":"The test type name (scan type) this row was created for; preserved after Test deletion","maxLength":256},"status":{"enum":["GOOD","STALE","MISSING","IGNORED"],"type":"string","x-spec-enum-id":"4cd523f14e7933df","description":"Per-subtype status, tracked independently of the Record's overall state\n\n* `GOOD` - GOOD\n* `STALE` - STALE\n* `MISSING` - MISSING\n* `IGNORED` - IGNORED"},"test":{"allOf":[{"$ref":"#/components/schemas/_MappedTest"}],"readOnly":true},"filters":{"description":"Per-subtype filter overrides"}},"required":["test","test_type_name"]},"MappingSubtypeFilters":{"type":"object","description":"Per-subtype filter overrides. The criteria dict is flat (no stage key) -- subtype\nfilters only apply at sync, merged over ConnectorConfig.filters['sync']. An empty dict\nclears all overrides for the subtype.","properties":{"test_type_name":{"type":"string","description":"The test_type_name of the subtype whose filters to update."},"filters":{"description":"Flat criterion dict (e.g. {'severity': 'Critical'}). Empty dict clears overrides."}},"required":["filters","test_type_name"]},"MemberFinding":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"severity":{"type":"string"},"sla_expiration_date":{"type":"string","format":"date","nullable":true},"days_left":{"type":"integer","nullable":true,"readOnly":true},"is_open":{"type":"boolean","readOnly":true},"status":{"type":"string","readOnly":true},"cwe":{"type":"integer","nullable":true},"vulnerability_ids":{"type":"array","items":{"type":"string"},"readOnly":true},"component_name":{"type":"string","nullable":true},"component_version":{"type":"string","nullable":true},"fix_version":{"type":"string","nullable":true},"file_path":{"type":"string","nullable":true},"line":{"type":"integer","nullable":true},"scanner":{"type":"string","readOnly":true},"date":{"type":"string","format":"date","nullable":true},"priority":{"type":"number","format":"double","nullable":true,"readOnly":true},"risk":{"type":"string","nullable":true,"readOnly":true},"risk_score":{"type":"integer","nullable":true,"readOnly":true},"risk_bands":{"type":"array","items":{"type":"number","format":"double"},"nullable":true,"readOnly":true},"known_exploited":{"type":"boolean"},"membership":{"type":"string","nullable":true,"readOnly":true}},"required":["component_name","component_version","cwe","date","days_left","file_path","fix_version","id","is_open","known_exploited","line","membership","priority","risk","risk_bands","risk_score","scanner","severity","sla_expiration_date","status","title","vulnerability_ids"]},"MergeRequestRequest":{"type":"object","properties":{"action_ids":{"type":"array","items":{"type":"integer"},"maxItems":200}},"required":["action_ids"]},"Meta":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","nullable":true},"endpoint":{"type":"integer","nullable":true},"location":{"type":"integer","nullable":true},"location_product":{"type":"integer","nullable":true},"finding":{"type":"integer","nullable":true},"name":{"type":"string","maxLength":120},"value":{"type":"string","maxLength":300}},"required":["id","name","value"]},"MetaMain":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","nullable":true},"finding":{"type":"integer","nullable":true},"metadata":{"type":"array","items":{"$ref":"#/components/schemas/Metadata"}}},"required":["id","metadata"]},"MetaMainRequest":{"type":"object","properties":{"product":{"type":"integer","nullable":true},"finding":{"type":"integer","nullable":true},"metadata":{"type":"array","items":{"$ref":"#/components/schemas/MetadataRequest"}}},"required":["metadata"]},"MetaRequest":{"type":"object","properties":{"product":{"type":"integer","nullable":true},"endpoint":{"type":"integer","nullable":true},"location":{"type":"integer","nullable":true},"location_product":{"type":"integer","nullable":true},"finding":{"type":"integer","nullable":true},"name":{"type":"string","minLength":1,"maxLength":120},"value":{"type":"string","minLength":1,"maxLength":300}},"required":["name","value"]},"Metadata":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"value":{"type":"string","maxLength":300}},"required":["name","value"]},"MetadataRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"value":{"type":"string","minLength":1,"maxLength":300}},"required":["name","value"]},"MeteredRunQuota":{"type":"object","description":"A per-run licensed quota (threat-model generations, Sensei Advisor runs) with\nthe runs currently occupying a slot -- the shape of\n``pro.sensei.billing.run_quota_status``. Read-only; it types the two ``quota``\nendpoints for the OpenAPI schema.\n\n``enforced`` is False on a license that predates the ceiling (the feature keeps\nworking, nothing is counted); ``unlimited`` is the explicit -1 grant; a ``limit``\nof 0 is a license that includes none.","properties":{"used":{"type":"integer"},"limit":{"type":"integer","nullable":true},"enforced":{"type":"boolean"},"unlimited":{"type":"boolean"},"remaining":{"type":"integer","nullable":true},"allowed":{"type":"boolean"},"in_flight":{"type":"integer"},"available":{"type":"integer","nullable":true},"blocked":{"type":"boolean"},"blocked_reason":{"enum":["exhausted","in_flight",null],"type":"string","description":"* `exhausted` - exhausted\n* `in_flight` - in_flight","x-spec-enum-id":"bccfec1c665a1e3e","nullable":true}},"required":["allowed","available","blocked","blocked_reason","enforced","in_flight","limit","remaining","unlimited","used"]},"MitigationPolicy":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"title":{"type":"string","description":"A brief description of the mitigation policy","maxLength":1024},"description":{"type":"string","description":"The detailed description of the policy, including how to mitigate the finding and any stakeholders to inform"},"is_default":{"type":"boolean","description":"Whether this policy is the default policy for findings where no policy is specified"}},"required":["created","description","id","title","updated"]},"MitigationPolicyRequest":{"type":"object","description":"Base serializer for all models.","properties":{"title":{"type":"string","minLength":1,"description":"A brief description of the mitigation policy","maxLength":1024},"description":{"type":"string","minLength":1,"description":"The detailed description of the policy, including how to mitigate the finding and any stakeholders to inform"},"is_default":{"type":"boolean","description":"Whether this policy is the default policy for findings where no policy is specified"}},"required":["description","title"]},"ModifyCasesRequestRequest":{"type":"object","description":"Attach and/or detach cases — the blast-radius edit.\n\nOne route for both directions so a swap (detach A, attach B) is a single\noperation with a single staleness consequence, not two.","properties":{"attach":{"type":"array","items":{"type":"integer"}},"detach":{"type":"array","items":{"type":"integer"}}}},"ModifyFireWallRules":{"type":"object","properties":{"ip_ranges":{"type":"array","items":{"$ref":"#/components/schemas/IpMask"}}},"required":["ip_ranges"]},"ModifyFireWallRulesRequest":{"type":"object","properties":{"ip_ranges":{"type":"array","items":{"$ref":"#/components/schemas/IpMaskRequest"}}},"required":["ip_ranges"]},"MttrSurvivalRequestRequest":{"type":"object","properties":{"filters":{},"window_days":{"type":"integer"}}},"NeedsAttentionAsset":{"type":"object","description":"One asset needing attention, with why.","properties":{"id":{"type":"integer"},"name":{"type":"string"},"organization":{"$ref":"#/components/schemas/_NamedRef"},"reasons":{"type":"array","items":{"enum":["connector_default_org","missing_priority_fields"],"type":"string","description":"* `connector_default_org` - connector_default_org\n* `missing_priority_fields` - missing_priority_fields","x-spec-enum-id":"0c805ae74ec894bf"}},"missing_fields":{"type":"array","items":{"enum":["business_criticality","user_records","revenue","external_audience","internet_accessible"],"type":"string","description":"* `business_criticality` - business_criticality\n* `user_records` - user_records\n* `revenue` - revenue\n* `external_audience` - external_audience\n* `internet_accessible` - internet_accessible","x-spec-enum-id":"51fa63bb36ba0fe3"}},"connectors":{"type":"array","items":{"$ref":"#/components/schemas/_NamedRef"},"description":"Connector configurations mapping onto this asset."},"business_criticality":{"type":"string","nullable":true},"user_records":{"type":"integer","nullable":true},"revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true},"external_audience":{"type":"boolean"},"internet_accessible":{"type":"boolean"}},"required":["business_criticality","connectors","external_audience","id","internet_accessible","missing_fields","name","organization","reasons","revenue","user_records"]},"NeedsAttentionSummary":{"type":"object","description":"Response schema of ``needs_attention/summary``.","properties":{"total":{"type":"integer","description":"Assets carrying at least one reason."},"total_assets":{"type":"integer","description":"Assets in scope (visible to the caller, after filters)."},"onboarding_complete":{"type":"boolean","description":"True when total is zero."},"by_reason":{"type":"object","additionalProperties":{"type":"integer"}},"by_field":{"type":"object","additionalProperties":{"type":"integer"}},"by_organization":{"type":"array","items":{"$ref":"#/components/schemas/_CountRef"},"description":"Largest first, at most 100 organizations."},"by_connector":{"type":"array","items":{"$ref":"#/components/schemas/_CountRef"}}},"required":["by_connector","by_field","by_organization","by_reason","onboarding_complete","total","total_assets"]},"NetworkLocations":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"location":{"type":"string","description":"Location of network testing: Examples: VPN, Internet or Internal.","maxLength":500}},"required":["id","location"]},"NetworkLocationsRequest":{"type":"object","properties":{"location":{"type":"string","minLength":1,"description":"Location of network testing: Examples: VPN, Internet or Internal.","maxLength":500}},"required":["location"]},"Node":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"url":{"type":"string","readOnly":true},"parent_id":{"type":"integer","nullable":true},"relationship":{"type":"string","nullable":true},"level":{"type":"integer","nullable":true},"has_more_children":{"type":"boolean"},"total_children":{"type":"integer"},"findings_count":{"type":"integer","readOnly":true},"direct_findings_count":{"type":"integer"},"indirect_findings_count":{"type":"integer"},"asset_type":{"type":"string","nullable":true,"readOnly":true},"asset_type_label":{"type":"string","nullable":true,"readOnly":true},"asset_type_icon":{"type":"string","nullable":true,"readOnly":true},"permissions":{"type":"object","additionalProperties":{},"readOnly":true}},"required":["asset_type","asset_type_icon","asset_type_label","findings_count","has_more_children","id","name","permissions","total_children","url"]},"NodeStatsRequestRequest":{"type":"object","properties":{"node_id":{"type":"integer"}},"required":["node_id"]},"NodeStatsResponse":{"type":"object","properties":{"node_id":{"type":"integer"},"direct_findings":{"type":"integer","minimum":0},"indirect_findings":{"type":"integer","minimum":0},"descendant_count":{"type":"integer","minimum":0},"direct_by_severity":{"type":"object","additionalProperties":{"type":"integer","minimum":0}},"indirect_by_severity":{"type":"object","additionalProperties":{"type":"integer","minimum":0}}},"required":["descendant_count","direct_by_severity","direct_findings","indirect_by_severity","indirect_findings","node_id"]},"Note":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"author":{"allOf":[{"$ref":"#/components/schemas/UserStub"}],"readOnly":true},"editor":{"allOf":[{"$ref":"#/components/schemas/UserStub"}],"readOnly":true,"nullable":true},"history":{"type":"array","items":{"$ref":"#/components/schemas/NoteHistory"},"readOnly":true},"note_type":{"allOf":[{"$ref":"#/components/schemas/NoteType"}],"readOnly":true},"entry":{"type":"string"},"date":{"type":"string","format":"date-time","readOnly":true},"private":{"type":"boolean","description":"Only you and superusers can see this note. It is also left out of reports and issue-tracker sync."},"edited":{"type":"boolean"},"edit_time":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["author","date","edit_time","editor","entry","history","id","note_type"]},"NoteCreateRequest":{"type":"object","description":"Body for creating a note against exactly one parent object.\n\nThe parent is taken as a raw id rather than a related field so the view can\nresolve it through the authorized queryset for that type, which answers an\ninvisible parent with a 404 instead of confirming the row exists.","properties":{"entry":{"type":"string","minLength":1},"private":{"type":"boolean","default":false},"note_type":{"type":"integer","nullable":true},"finding":{"type":"integer","nullable":true},"test":{"type":"integer","nullable":true},"engagement":{"type":"integer","nullable":true},"risk_acceptance":{"type":"integer","nullable":true}},"required":["entry"]},"NoteHistory":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"current_editor":{"allOf":[{"$ref":"#/components/schemas/UserStub"}],"readOnly":true},"note_type":{"allOf":[{"$ref":"#/components/schemas/NoteType"}],"readOnly":true},"data":{"type":"string"},"time":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["current_editor","data","id","note_type","time"]},"NoteHistoryRequest":{"type":"object","properties":{"data":{"type":"string","minLength":1}},"required":["data"]},"NoteRequest":{"type":"object","properties":{"entry":{"type":"string","minLength":1},"private":{"type":"boolean","description":"Only you and superusers can see this note. It is also left out of reports and issue-tracker sync."},"edited":{"type":"boolean"}},"required":["entry"]},"NoteType":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":100},"description":{"type":"string","maxLength":200},"is_single":{"type":"boolean"},"is_active":{"type":"boolean"},"is_mandatory":{"type":"boolean"}},"required":["description","id","name"]},"NoteTypeRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","minLength":1,"maxLength":200},"is_single":{"type":"boolean"},"is_active":{"type":"boolean"},"is_mandatory":{"type":"boolean"}},"required":["description","name"]},"NotificationWebhooks":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"Name of the incoming webhook","maxLength":100},"url":{"type":"string","format":"uri","description":"The full URL of the incoming webhook","maxLength":200},"header_name":{"type":"string","nullable":true,"description":"Name of the header required for interacting with Webhook endpoint","maxLength":100},"header_value":{"type":"string","nullable":true,"description":"Content of the header required for interacting with Webhook endpoint","maxLength":100},"status":{"enum":["active","active_tmp","inactive_tmp","inactive_permanent"],"type":"string","x-spec-enum-id":"8611dd588eda2457","readOnly":true,"description":"Status of the incoming webhook\n\n* `active` - Active\n* `active_tmp` - Active but 5xx (or similar) error detected\n* `inactive_tmp` - Temporary inactive because of 5xx (or similar) error\n* `inactive_permanent` - Permanently inactive"},"first_error":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"If endpoint is active, when error happened first time"},"last_error":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"If endpoint is active, when error happened last time"},"note":{"type":"string","readOnly":true,"nullable":true,"description":"Description of the latest error"},"owner":{"type":"integer","nullable":true,"description":"Owner/receiver of notification, if empty processed as system notification"}},"required":["first_error","id","last_error","note","status"]},"NotificationWebhooksRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Name of the incoming webhook","maxLength":100},"url":{"type":"string","format":"uri","minLength":1,"description":"The full URL of the incoming webhook","maxLength":200},"header_name":{"type":"string","nullable":true,"description":"Name of the header required for interacting with Webhook endpoint","maxLength":100},"header_value":{"type":"string","nullable":true,"description":"Content of the header required for interacting with Webhook endpoint","maxLength":100},"owner":{"type":"integer","nullable":true,"description":"Owner/receiver of notification, if empty processed as system notification"}}},"Notifications":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","nullable":true},"user":{"type":"integer","nullable":true},"product_type_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"product_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"engagement_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"test_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"scan_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"jira_update":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"upcoming_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"stale_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"auto_close_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"close_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"user_mentioned":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"code_review":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"review_requested":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"other":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"sla_breach":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"sla_breach_combined":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"risk_acceptance_expiration":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"template":{"type":"boolean","default":false},"scan_added_empty":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"digest":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["mail"]},"digest_frequency":{"enum":["Daily","Weekly - Monday","Weekly - Tuesday","Weekly - Wednesday","Weekly - Thursday","Weekly - Friday","Weekly - Saturday","Weekly - Sunday","Monthly - 1st","Monthly - 15th","",null],"type":"string","description":"* `Daily` - Daily\n* `Weekly - Monday` - Weekly - Monday\n* `Weekly - Tuesday` - Weekly - Tuesday\n* `Weekly - Wednesday` - Weekly - Wednesday\n* `Weekly - Thursday` - Weekly - Thursday\n* `Weekly - Friday` - Weekly - Friday\n* `Weekly - Saturday` - Weekly - Saturday\n* `Weekly - Sunday` - Weekly - Sunday\n* `Monthly - 1st` - Monthly - 1st\n* `Monthly - 15th` - Monthly - 15th","x-spec-enum-id":"4b2def200351ec56","nullable":true},"finding_risk_accepted":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"connector_health_warning":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"remediation_action_due":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"ai_component_discovered":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"hierarchy_suggestions_ready":{"type":"array","items":{"enum":["mail","alert"],"type":"string","description":"* `mail` - mail\n* `alert` - alert","x-spec-enum-id":"3d949c97f674a35f"},"default":["alert"]},"review_requested_scope":{"enum":["all","selected"],"type":"string","description":"* `all` - All\n* `selected` - Selected","x-spec-enum-id":"0dc4c4c4241c5a40"},"review_requested_products":{"type":"array","items":{"type":"integer"}},"review_requested_product_types":{"type":"array","items":{"type":"integer"}},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["id"]},"NotificationsRequest":{"type":"object","properties":{"product":{"type":"integer","nullable":true},"user":{"type":"integer","nullable":true},"product_type_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"product_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"engagement_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"test_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"scan_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"jira_update":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"upcoming_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"stale_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"auto_close_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"close_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"user_mentioned":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"code_review":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"review_requested":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"other":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"sla_breach":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"sla_breach_combined":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"risk_acceptance_expiration":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"template":{"type":"boolean","default":false},"scan_added_empty":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"digest":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["mail"]},"digest_frequency":{"enum":["Daily","Weekly - Monday","Weekly - Tuesday","Weekly - Wednesday","Weekly - Thursday","Weekly - Friday","Weekly - Saturday","Weekly - Sunday","Monthly - 1st","Monthly - 15th","",null],"type":"string","description":"* `Daily` - Daily\n* `Weekly - Monday` - Weekly - Monday\n* `Weekly - Tuesday` - Weekly - Tuesday\n* `Weekly - Wednesday` - Weekly - Wednesday\n* `Weekly - Thursday` - Weekly - Thursday\n* `Weekly - Friday` - Weekly - Friday\n* `Weekly - Saturday` - Weekly - Saturday\n* `Weekly - Sunday` - Weekly - Sunday\n* `Monthly - 1st` - Monthly - 1st\n* `Monthly - 15th` - Monthly - 15th","x-spec-enum-id":"4b2def200351ec56","nullable":true},"finding_risk_accepted":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"connector_health_warning":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"remediation_action_due":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"ai_component_discovered":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"hierarchy_suggestions_ready":{"type":"array","items":{"enum":["mail","alert"],"type":"string","description":"* `mail` - mail\n* `alert` - alert","x-spec-enum-id":"3d949c97f674a35f"},"default":["alert"]},"review_requested_scope":{"enum":["all","selected"],"type":"string","description":"* `all` - All\n* `selected` - Selected","x-spec-enum-id":"0dc4c4c4241c5a40"},"review_requested_products":{"type":"array","items":{"type":"integer"}},"review_requested_product_types":{"type":"array","items":{"type":"integer"}}}},"OAuthInvalidClient":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"}},"required":["error","error_description"]},"OAuthUnsupportedGrant":{"type":"object","properties":{"error":{"type":"string"},"error_description":{"type":"string"}},"required":["error","error_description"]},"ObligationAttachment":{"type":"object","description":"One file attached to an obligation, as the Evidence view and an API client read it.","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","readOnly":true},"size":{"type":"integer","readOnly":true,"description":"Size of the file in bytes, recorded when it was uploaded"},"sha256":{"type":"string","readOnly":true,"title":"SHA-256","description":"Digest of the file's bytes, recorded when it was uploaded"},"uploaded_by":{"type":"integer","readOnly":true,"nullable":true},"uploaded_by_name":{"type":"string","readOnly":true},"uploaded_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true}},"required":["id","sha256","size","title","uploaded_at","uploaded_by","uploaded_by_name"]},"ObligationAttachmentUploadRequest":{"type":"object","description":"A multipart upload of one supporting file. The file always becomes a new FileUpload.","properties":{"file":{"type":"string","format":"binary"},"title":{"type":"string","maxLength":100}},"required":["file"]},"ObligationResult":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"assessment":{"type":"integer"},"control":{"type":"integer","title":"Obligation"},"control_label":{"type":"string","readOnly":true},"control_title":{"type":"string","readOnly":true},"control_family":{"type":"string","readOnly":true},"control_text":{"type":"string","readOnly":true},"citation":{"type":"string","readOnly":true},"regulation_url":{"type":"string","readOnly":true},"status":{"enum":["satisfied","partially_satisfied","not_satisfied","not_applicable","unknown"],"type":"string","x-spec-enum-id":"5662d6e57f125b99","title":"Evidence Status","description":"Effective evidence state. This is an assessment aid, not a legal conclusion\n\n* `satisfied` - Satisfied\n* `partially_satisfied` - Partially satisfied\n* `not_satisfied` - Not satisfied\n* `not_applicable` - Not applicable\n* `unknown` - Unknown"},"evidence_mode":{"enum":["automated","manual","hybrid"],"type":"string","description":"* `automated` - Automated\n* `manual` - Manual\n* `hybrid` - Hybrid","x-spec-enum-id":"a7ea667bdebc6712","readOnly":true},"automated_status":{"enum":["satisfied","partially_satisfied","not_satisfied","not_applicable","unknown",null],"type":"string","x-spec-enum-id":"5662d6e57f125b99","readOnly":true,"nullable":true,"title":"Automated Evidence Status","description":"Latest computed evidence state, retained when a human override is active\n\n* `satisfied` - Satisfied\n* `partially_satisfied` - Partially satisfied\n* `not_satisfied` - Not satisfied\n* `not_applicable` - Not applicable\n* `unknown` - Unknown"},"evidence":{"readOnly":true,"description":"Facts and measurements gathered by the registered satisfier"},"narrative":{"type":"string","description":"Assessor narrative for this obligation"},"attachments":{"type":"array","items":{"type":"integer"},"readOnly":true},"attachment_titles":{"type":"array","items":{"type":"string"},"readOnly":true},"manual_override":{"type":"boolean","description":"Whether a human-set status takes precedence over recomputation"},"override_reason":{"type":"string"},"overridden_by":{"type":"integer","readOnly":true,"nullable":true},"overridden_by_name":{"type":"string","readOnly":true},"overridden_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"assessed_by":{"type":"integer","readOnly":true,"nullable":true},"assessed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["assessed_at","assessed_by","assessment","attachment_titles","attachments","automated_status","citation","control","control_family","control_label","control_text","control_title","created_at","evidence","evidence_mode","id","overridden_at","overridden_by","overridden_by_name","regulation_url","updated_at"]},"ObligationResultRequest":{"type":"object","description":"Base serializer for all models.","properties":{"assessment":{"type":"integer"},"control":{"type":"integer","title":"Obligation"},"status":{"enum":["satisfied","partially_satisfied","not_satisfied","not_applicable","unknown"],"type":"string","x-spec-enum-id":"5662d6e57f125b99","title":"Evidence Status","description":"Effective evidence state. This is an assessment aid, not a legal conclusion\n\n* `satisfied` - Satisfied\n* `partially_satisfied` - Partially satisfied\n* `not_satisfied` - Not satisfied\n* `not_applicable` - Not applicable\n* `unknown` - Unknown"},"narrative":{"type":"string","description":"Assessor narrative for this obligation"},"manual_override":{"type":"boolean","description":"Whether a human-set status takes precedence over recomputation"},"override_reason":{"type":"string"}},"required":["assessment","control"]},"OnboardingStatus":{"type":"object","description":"Response schema of ``onboarding_status``.","properties":{"onboarding_complete":{"type":"boolean"},"needs_attention":{"type":"integer"},"total_assets":{"type":"integer"},"by_reason":{"type":"object","additionalProperties":{"type":"integer"}}},"required":["by_reason","needs_attention","onboarding_complete","total_assets"]},"Operation":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"duration":{"type":"string","nullable":true,"readOnly":true},"errors":{"type":"array","items":{"$ref":"#/components/schemas/GenericMessage"}},"operation":{"enum":["DISCOVER","SYNC","",null],"type":"string","x-spec-enum-id":"60d91fd4719782f6","nullable":true,"description":"The type of operation that is currently being ran on a given connector\n\n* `DISCOVER` - DISCOVER\n* `SYNC` - SYNC"},"status":{"enum":["SUCCESS","ERROR","TIMEOUT","PENDING","",null],"type":"string","x-spec-enum-id":"eafe5fec03783907","nullable":true,"description":"The status of the operation at a given point in time\n\n* `SUCCESS` - SUCCESS\n* `ERROR` - ERROR\n* `TIMEOUT` - TIMEOUT\n* `PENDING` - PENDING"},"trigger":{"enum":["SCHEDULED","MANUAL","",null],"type":"string","x-spec-enum-id":"b656895639c7afd7","nullable":true,"description":"Dictates how the operation was triggered\n\n* `SCHEDULED` - SCHEDULED\n* `MANUAL` - MANUAL"},"start_time":{"type":"string","format":"date-time","description":"The time that the operation was started"},"end_time":{"type":"string","format":"date-time","nullable":true,"description":"The time that the operation was completed"}},"required":["duration","id","start_time"]},"OrganizationMembership":{"type":"object","description":"Asset<->organization memberships: the read surface plus manual pins (Phase 1 step 4c).\n\nReads cover every origin (user pins, connector-synced, rule-granted) so UIs can show where\na membership came from. Writes only mint USER pins: ``origin``/``is_primary`` are read-only\nand forced at the view layer -- the primary mirror stays owned by the prod_type dual-write,\nand CONNECTOR/RULE rows stay owned by their reconcilers.","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer"},"organization":{"type":"integer"},"is_primary":{"type":"boolean","readOnly":true,"default":false,"title":"Primary","description":"The single primary membership per asset -- the access/billing anchor, always mirroring the asset's prod_type. Exactly one primary is allowed per asset."},"origin":{"enum":["user","connector","rule"],"type":"string","x-spec-enum-id":"8b4df912bcd675bd","readOnly":true,"description":"Who created this membership: a user (manual pin), a connector's grouping attributes, or a tag-predicate membership rule. Automated reconciliation only ever touches rows of its own origin -- user pins are never removed by machinery.\n\n* `user` - User\n* `connector` - Connector\n* `rule` - Rule"},"connector_config":{"type":"integer","readOnly":true,"nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time the membership was created."},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the membership was updated."}},"required":["connector_config","created_at","id","is_primary","organization","origin","product","updated_at"]},"OrganizationMembershipRequest":{"type":"object","description":"Asset<->organization memberships: the read surface plus manual pins (Phase 1 step 4c).\n\nReads cover every origin (user pins, connector-synced, rule-granted) so UIs can show where\na membership came from. Writes only mint USER pins: ``origin``/``is_primary`` are read-only\nand forced at the view layer -- the primary mirror stays owned by the prod_type dual-write,\nand CONNECTOR/RULE rows stay owned by their reconcilers.","properties":{"product":{"type":"integer"},"organization":{"type":"integer"}},"required":["organization","product"]},"OrganizationReference":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"url":{"type":"string","readOnly":true}},"required":["id","name","url"]},"OrganizationTypeRole":{"type":"object","description":"Facet grants: a role held across every organization of one organization type (Phase 5).\n\nDeliberately thin. The grant IS the four fields, and every consequence of it is derived --\nwhich organizations it currently covers depends on which ones wear the facet right now, so\nmaterializing that list into the payload would be a snapshot that is wrong by the time it\nis read. Consumers that need the organizations should read\n``/api/v2/organizations/?org_type=<facet>``, which answers it live.","properties":{"id":{"type":"integer","readOnly":true},"org_type":{"enum":["team","business_app","compliance_scope","portfolio","custom"],"type":"string","x-spec-enum-id":"6ba9512199a7c3f4","title":"Organization Type","description":"The organization facet this grant covers. The role applies to every organization carrying this facet, including ones created later.\n\n* `team` - Team\n* `business_app` - Business Application\n* `compliance_scope` - Compliance Scope\n* `portfolio` - Portfolio\n* `custom` - Custom"},"user":{"type":"integer","nullable":true,"description":"The user this facet grant applies to. Exactly one of user or group is set."},"group":{"type":"integer","nullable":true,"description":"The group this facet grant applies to. Exactly one of user or group is set."},"role":{"type":"integer","description":"The role granted on every organization of this facet."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time the grant was created."},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the grant was updated."}},"required":["created_at","id","org_type","role","updated_at"]},"OrganizationTypeRoleRequest":{"type":"object","description":"Facet grants: a role held across every organization of one organization type (Phase 5).\n\nDeliberately thin. The grant IS the four fields, and every consequence of it is derived --\nwhich organizations it currently covers depends on which ones wear the facet right now, so\nmaterializing that list into the payload would be a snapshot that is wrong by the time it\nis read. Consumers that need the organizations should read\n``/api/v2/organizations/?org_type=<facet>``, which answers it live.","properties":{"org_type":{"enum":["team","business_app","compliance_scope","portfolio","custom"],"type":"string","x-spec-enum-id":"6ba9512199a7c3f4","title":"Organization Type","description":"The organization facet this grant covers. The role applies to every organization carrying this facet, including ones created later.\n\n* `team` - Team\n* `business_app` - Business Application\n* `compliance_scope` - Compliance Scope\n* `portfolio` - Portfolio\n* `custom` - Custom"},"user":{"type":"integer","nullable":true,"description":"The user this facet grant applies to. Exactly one of user or group is set."},"group":{"type":"integer","nullable":true,"description":"The group this facet grant applies to. Exactly one of user or group is set."},"role":{"type":"integer","description":"The role granted on every organization of this facet."}},"required":["org_type","role"]},"Owner":{"type":"object","description":"The rule owner as the lists and detail pages show them.","properties":{"id":{"type":"integer","readOnly":true},"username":{"type":"string","readOnly":true}},"required":["id","username"]},"OwnerUserOption":{"type":"object","description":"One row of the owner-person picker: the fields its label is built from, nothing more.","properties":{"id":{"type":"integer","readOnly":true},"username":{"type":"string","description":"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.","pattern":"^[\\w.@+-]+$","maxLength":150},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150}},"required":["id","username"]},"POAMArtifact":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"snapshot":{"type":"integer","description":"The snapshot this artifact was rendered from"},"kind":{"enum":["fedramp_xlsx","oscal_poam_json"],"type":"string","x-spec-enum-id":"6f90a37efbd8a510","description":"The deliverable format\n\n* `fedramp_xlsx` - FedRAMP POA&M workbook (xlsx)\n* `oscal_poam_json` - OSCAL POA&M (json)"},"kind_display":{"type":"string","readOnly":true},"sha256":{"type":"string","title":"SHA-256","description":"Hash of the rendered file, for artifact provenance","maxLength":64},"file_size":{"type":"integer","maximum":9223372036854775807,"minimum":0,"format":"int64","description":"Size of the rendered file in bytes"},"validation_status":{"type":"string","description":"Result of validating this artifact: passed / failed against FedRAMP OSCAL constraints, schema_only when the external validator is not configured, or unavailable when it could not be reached","maxLength":16},"validation_findings":{"description":"Findings reported by the OSCAL validator (level, message, location, rule)"},"validated_at":{"type":"string","format":"date-time","nullable":true,"title":"Validated Timestamp","description":"When this artifact was last validated"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"}},"required":["created_at","id","kind","kind_display","snapshot"]},"POAMArtifactRequest":{"type":"object","description":"Base serializer for all models.","properties":{"snapshot":{"type":"integer","description":"The snapshot this artifact was rendered from"},"kind":{"enum":["fedramp_xlsx","oscal_poam_json"],"type":"string","x-spec-enum-id":"6f90a37efbd8a510","description":"The deliverable format\n\n* `fedramp_xlsx` - FedRAMP POA&M workbook (xlsx)\n* `oscal_poam_json` - OSCAL POA&M (json)"},"sha256":{"type":"string","title":"SHA-256","description":"Hash of the rendered file, for artifact provenance","maxLength":64},"file_size":{"type":"integer","maximum":9223372036854775807,"minimum":0,"format":"int64","description":"Size of the rendered file in bytes"},"validation_status":{"type":"string","description":"Result of validating this artifact: passed / failed against FedRAMP OSCAL constraints, schema_only when the external validator is not configured, or unavailable when it could not be reached","maxLength":16},"validation_findings":{"description":"Findings reported by the OSCAL validator (level, message, location, rule)"},"validated_at":{"type":"string","format":"date-time","nullable":true,"title":"Validated Timestamp","description":"When this artifact was last validated"}},"required":["kind","snapshot"]},"POAMItem":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"display_id":{"type":"string","readOnly":true},"milestones":{"type":"array","items":{"$ref":"#/components/schemas/POAMMilestone"},"readOnly":true},"sequence_number":{"type":"integer","readOnly":true,"description":"Per-product sequential number backing the POA&M display ID"},"aggregation_key":{"type":"string","readOnly":true,"default":"","description":"Hash identifying the unique weakness this item tracks; sync matches findings on it"},"key_version":{"type":"integer","readOnly":true,"default":1,"description":"Version of the aggregation-key algorithm this item was keyed with"},"controls_overridden":{"type":"boolean","description":"When True, sync stops re-deriving the controls from finding mappings"},"status":{"enum":["open","closed"],"type":"string","x-spec-enum-id":"da18659620c74b54","default":"open","description":"Open items appear on the Open POA&M Items worksheet; closed on the Closed one\n\n* `open` - Open\n* `closed` - Closed"},"closure_reason":{"enum":["remediated","false_positive_approved","operational_requirement","no_longer_detected","manual","",null],"type":"string","x-spec-enum-id":"11bf00512578d41a","nullable":true,"description":"Why this item was closed\n\n* `remediated` - Remediated\n* `false_positive_approved` - False positive approved\n* `operational_requirement` - Operational requirement approved\n* `no_longer_detected` - No longer detected\n* `manual` - Closed manually"},"closed_date":{"type":"string","format":"date","nullable":true,"description":"The date this item was closed"},"is_configuration_item":{"type":"boolean","readOnly":true,"title":"Configuration Item","description":"Rendered on the Configuration Findings worksheet instead of the Open tab"},"is_cm6_consolidated":{"type":"boolean","readOnly":true,"title":"CM-6 Consolidated Item","description":"The single consolidated CM-6 row that stays open while any configuration finding is open"},"weakness_name":{"type":"string","description":"The template's Weakness Name column","maxLength":500},"weakness_description":{"type":"string","description":"The template's Weakness Description column"},"detector_source":{"type":"string","title":"Weakness Detector Source","description":"The scanner / assessment source that detected the weakness","maxLength":300},"source_identifier":{"type":"string","title":"Weakness Source Identifier","description":"The detector's identifier for the weakness (plugin/rule/check id)","maxLength":500},"asset_identifier_override":{"type":"string","description":"Overrides the asset list derived from linked findings at export time"},"point_of_contact":{"type":"string","description":"The template's Point of Contact column","maxLength":300},"resources_required":{"type":"string","description":"The template's Resources Required column"},"remediation_plan":{"type":"string","description":"The template's Remediation Plan column; milestones are folded in when rendering Excel"},"original_detection_date":{"type":"string","format":"date","readOnly":true,"description":"The discovery date; never changes after creation"},"scheduled_completion_date":{"type":"string","format":"date","nullable":true,"description":"Frozen at creation from the finding's enforced SLA deadline, falling back to the detection date and risk rating when no SLA is enforced; the template says 'do not modify'"},"status_date":{"type":"string","format":"date","readOnly":true,"description":"The date of the most recent status change"},"vendor_dependency":{"type":"boolean","description":"Whether remediation depends on a vendor fix"},"last_vendor_checkin":{"type":"string","format":"date","nullable":true,"title":"Last Vendor Check-in Date","description":"FedRAMP requires at least monthly vendor check-ins for vendor-dependent items"},"vendor_product_name":{"type":"string","title":"Vendor Dependent Product Name","description":"The vendor product remediation depends on","maxLength":300},"original_risk_rating":{"enum":["High","Moderate","Low"],"type":"string","x-spec-enum-id":"568f7c4ec987ae2a","description":"The initial risk rating on the FedRAMP High/Moderate/Low scale\n\n* `High` - High\n* `Moderate` - Moderate\n* `Low` - Low"},"adjusted_risk_rating":{"enum":["High","Moderate","Low","",null],"type":"string","x-spec-enum-id":"568f7c4ec987ae2a","nullable":true,"description":"The post-deviation risk rating, when a risk adjustment was approved\n\n* `High` - High\n* `Moderate` - Moderate\n* `Low` - Low"},"risk_adjustment":{"enum":["no","pending","yes"],"type":"string","x-spec-enum-id":"734f80480dbe23d6","description":"Risk Adjustment deviation state (No/Pending/Yes)\n\n* `no` - No\n* `pending` - Pending\n* `yes` - Yes"},"false_positive":{"enum":["no","pending","yes"],"type":"string","x-spec-enum-id":"734f80480dbe23d6","description":"False Positive deviation state (No/Pending/Yes)\n\n* `no` - No\n* `pending` - Pending\n* `yes` - Yes"},"operational_requirement":{"enum":["no","pending","yes"],"type":"string","x-spec-enum-id":"734f80480dbe23d6","description":"Operational Requirement deviation state (No/Pending/Yes)\n\n* `no` - No\n* `pending` - Pending\n* `yes` - Yes"},"deviation_rationale":{"type":"string","description":"Rationale for any deviation, including mitigating factors and exposure"},"comments":{"type":"string","description":"The template's Comments column"},"oscal_uuid":{"type":"string","format":"uuid","readOnly":true,"description":"Stable UUID identifying this poam-item across OSCAL exports"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"},"product":{"type":"integer","description":"The product (system) this POA&M item belongs to"},"reopened_from":{"type":"integer","readOnly":true,"nullable":true,"description":"The closed item this one recurs from, when a weakness reappears after closure"},"findings":{"type":"array","items":{"type":"integer"},"description":"The findings evidencing this weakness across assets"},"controls":{"type":"array","items":{"type":"integer"},"description":"The affected security controls (the template's Controls column)"},"supporting_documents":{"type":"array","items":{"type":"integer","title":"Supporting Documents"},"description":"Evidence and deviation-request documents for this item"}},"required":["aggregation_key","created_at","display_id","id","is_cm6_consolidated","is_configuration_item","key_version","milestones","original_detection_date","original_risk_rating","oscal_uuid","product","reopened_from","sequence_number","status_date","updated_at","weakness_name"]},"POAMItemRequest":{"type":"object","description":"Base serializer for all models.","properties":{"controls_overridden":{"type":"boolean","description":"When True, sync stops re-deriving the controls from finding mappings"},"status":{"enum":["open","closed"],"type":"string","x-spec-enum-id":"da18659620c74b54","default":"open","description":"Open items appear on the Open POA&M Items worksheet; closed on the Closed one\n\n* `open` - Open\n* `closed` - Closed"},"closure_reason":{"enum":["remediated","false_positive_approved","operational_requirement","no_longer_detected","manual","",null],"type":"string","x-spec-enum-id":"11bf00512578d41a","nullable":true,"description":"Why this item was closed\n\n* `remediated` - Remediated\n* `false_positive_approved` - False positive approved\n* `operational_requirement` - Operational requirement approved\n* `no_longer_detected` - No longer detected\n* `manual` - Closed manually"},"closed_date":{"type":"string","format":"date","nullable":true,"description":"The date this item was closed"},"weakness_name":{"type":"string","minLength":1,"description":"The template's Weakness Name column","maxLength":500},"weakness_description":{"type":"string","description":"The template's Weakness Description column"},"detector_source":{"type":"string","title":"Weakness Detector Source","description":"The scanner / assessment source that detected the weakness","maxLength":300},"source_identifier":{"type":"string","title":"Weakness Source Identifier","description":"The detector's identifier for the weakness (plugin/rule/check id)","maxLength":500},"asset_identifier_override":{"type":"string","description":"Overrides the asset list derived from linked findings at export time"},"point_of_contact":{"type":"string","description":"The template's Point of Contact column","maxLength":300},"resources_required":{"type":"string","description":"The template's Resources Required column"},"remediation_plan":{"type":"string","description":"The template's Remediation Plan column; milestones are folded in when rendering Excel"},"scheduled_completion_date":{"type":"string","format":"date","nullable":true,"description":"Frozen at creation from the finding's enforced SLA deadline, falling back to the detection date and risk rating when no SLA is enforced; the template says 'do not modify'"},"vendor_dependency":{"type":"boolean","description":"Whether remediation depends on a vendor fix"},"last_vendor_checkin":{"type":"string","format":"date","nullable":true,"title":"Last Vendor Check-in Date","description":"FedRAMP requires at least monthly vendor check-ins for vendor-dependent items"},"vendor_product_name":{"type":"string","title":"Vendor Dependent Product Name","description":"The vendor product remediation depends on","maxLength":300},"original_risk_rating":{"enum":["High","Moderate","Low"],"type":"string","x-spec-enum-id":"568f7c4ec987ae2a","description":"The initial risk rating on the FedRAMP High/Moderate/Low scale\n\n* `High` - High\n* `Moderate` - Moderate\n* `Low` - Low"},"adjusted_risk_rating":{"enum":["High","Moderate","Low","",null],"type":"string","x-spec-enum-id":"568f7c4ec987ae2a","nullable":true,"description":"The post-deviation risk rating, when a risk adjustment was approved\n\n* `High` - High\n* `Moderate` - Moderate\n* `Low` - Low"},"risk_adjustment":{"enum":["no","pending","yes"],"type":"string","x-spec-enum-id":"734f80480dbe23d6","description":"Risk Adjustment deviation state (No/Pending/Yes)\n\n* `no` - No\n* `pending` - Pending\n* `yes` - Yes"},"false_positive":{"enum":["no","pending","yes"],"type":"string","x-spec-enum-id":"734f80480dbe23d6","description":"False Positive deviation state (No/Pending/Yes)\n\n* `no` - No\n* `pending` - Pending\n* `yes` - Yes"},"operational_requirement":{"enum":["no","pending","yes"],"type":"string","x-spec-enum-id":"734f80480dbe23d6","description":"Operational Requirement deviation state (No/Pending/Yes)\n\n* `no` - No\n* `pending` - Pending\n* `yes` - Yes"},"deviation_rationale":{"type":"string","description":"Rationale for any deviation, including mitigating factors and exposure"},"comments":{"type":"string","description":"The template's Comments column"},"product":{"type":"integer","description":"The product (system) this POA&M item belongs to"},"findings":{"type":"array","items":{"type":"integer"},"description":"The findings evidencing this weakness across assets"},"controls":{"type":"array","items":{"type":"integer"},"description":"The affected security controls (the template's Controls column)"},"supporting_documents":{"type":"array","items":{"type":"integer","title":"Supporting Documents"},"description":"Evidence and deviation-request documents for this item"}},"required":["original_risk_rating","product","weakness_name"]},"POAMMilestone":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"item":{"type":"integer","title":"POA&M Item","description":"The POA&M item this milestone belongs to"},"description":{"type":"string","description":"What this milestone accomplishes"},"scheduled_date":{"type":"string","format":"date","description":"When this milestone is planned to complete"},"completed_date":{"type":"string","format":"date","nullable":true,"description":"When this milestone actually completed"},"order":{"type":"integer","maximum":2147483647,"minimum":0,"description":"Display order within the item"},"oscal_uuid":{"type":"string","format":"uuid","readOnly":true,"description":"Stable UUID identifying this milestone across OSCAL exports"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["created_at","description","id","item","oscal_uuid","scheduled_date","updated_at"]},"POAMMilestoneRequest":{"type":"object","description":"Base serializer for all models.","properties":{"item":{"type":"integer","title":"POA&M Item","description":"The POA&M item this milestone belongs to"},"description":{"type":"string","minLength":1,"description":"What this milestone accomplishes"},"scheduled_date":{"type":"string","format":"date","description":"When this milestone is planned to complete"},"completed_date":{"type":"string","format":"date","nullable":true,"description":"When this milestone actually completed"},"order":{"type":"integer","maximum":2147483647,"minimum":0,"description":"Display order within the item"}},"required":["description","item","scheduled_date"]},"POAMSnapshot":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","description":"The product (system) this snapshot covers"},"period":{"type":"string","format":"date","description":"The first day of the ConMon month this snapshot covers"},"status":{"enum":["pending","processing","completed","failed"],"type":"string","x-spec-enum-id":"a8f61caf99619754","readOnly":true,"description":"Generation lifecycle state\n\n* `pending` - Pending\n* `processing` - Processing\n* `completed` - Completed\n* `failed` - Failed"},"generated_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who requested this snapshot"},"error_message":{"type":"string","readOnly":true,"description":"Why generation failed, when it did"},"completed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Completed Timestamp","description":"When generation finished"},"metrics":{"readOnly":true,"description":"Counts, late-item list, and deltas versus the previous snapshot"},"previous":{"type":"integer","readOnly":true,"nullable":true,"title":"Previous Snapshot","description":"The prior month's snapshot, for month-over-month diffing"},"artifacts":{"type":"array","items":{"$ref":"#/components/schemas/POAMArtifact"},"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["artifacts","completed_at","created_at","error_message","generated_by","id","metrics","period","previous","product","status","updated_at"]},"POAMSnapshotDetail":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","description":"The product (system) this snapshot covers"},"period":{"type":"string","format":"date","description":"The first day of the ConMon month this snapshot covers"},"status":{"enum":["pending","processing","completed","failed"],"type":"string","x-spec-enum-id":"a8f61caf99619754","readOnly":true,"description":"Generation lifecycle state\n\n* `pending` - Pending\n* `processing` - Processing\n* `completed` - Completed\n* `failed` - Failed"},"generated_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who requested this snapshot"},"error_message":{"type":"string","readOnly":true,"description":"Why generation failed, when it did"},"completed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Completed Timestamp","description":"When generation finished"},"metrics":{"readOnly":true,"description":"Counts, late-item list, and deltas versus the previous snapshot"},"previous":{"type":"integer","readOnly":true,"nullable":true,"title":"Previous Snapshot","description":"The prior month's snapshot, for month-over-month diffing"},"artifacts":{"type":"array","items":{"$ref":"#/components/schemas/POAMArtifact"},"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"},"items_frozen":{"title":"Frozen Items","description":"Every POA&M row rendered to plain values at generation time"}},"required":["artifacts","completed_at","created_at","error_message","generated_by","id","metrics","period","previous","product","status","updated_at"]},"POAMSnapshotRequest":{"type":"object","description":"Base serializer for all models.","properties":{"product":{"type":"integer","description":"The product (system) this snapshot covers"},"period":{"type":"string","format":"date","description":"The first day of the ConMon month this snapshot covers"}},"required":["period","product"]},"PageLayout":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"page_key":{"type":"string","title":"Page","description":"The View page this layout applies to: organization, asset, engagement, test, or finding.","maxLength":32},"name":{"type":"string","maxLength":100},"is_shared":{"type":"boolean","title":"Shared","description":"If true, this layout is published as a template available to every user."},"is_default":{"type":"boolean","description":"Whether this row is the CALLER's default for its own page.\n\nOne query per request even when serializing a list: the caller's whole\npage -> layout pointer map is cached on the request the first time any row\nasks.\n\nDeliberate delta from the dashboard serializer: there is NO\n\"first-owned-layout-by-name\" fallback. Absence of a pointer means the user\nis inheriting (shared page default, else shipped default), and showing a\nDefault badge on an arbitrary personal row would misreport that.","readOnly":true},"is_owned":{"type":"boolean","readOnly":true},"layout":{"description":"Map of widget id -> grid position {x, y, w, h, min_w, min_h}."},"widgets":{"description":"Ordered list of widget configurations (type, title, config)."},"settings":{"description":"Layout-level options. Reserved: carries nothing today."},"cloned_from":{"type":"integer","readOnly":true,"nullable":true,"description":"Reference to the layout this one was cloned from, if any."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created."},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated."}},"required":["cloned_from","created_at","id","is_default","is_owned","name","page_key","updated_at"]},"PageLayoutClearDefaultRequestRequest":{"type":"object","properties":{"page":{"type":"string","minLength":1,"description":"View page key."}},"required":["page"]},"PageLayoutClearSharedDefaultRequestRequest":{"type":"object","properties":{"page":{"type":"string","minLength":1,"description":"View page key."}},"required":["page"]},"PageLayoutCloneRequestRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Name for the clone. Defaults to \"Copy of <source name>\"."}}},"PageLayoutRequest":{"type":"object","properties":{"page_key":{"type":"string","minLength":1,"title":"Page","description":"The View page this layout applies to: organization, asset, engagement, test, or finding.","maxLength":32},"name":{"type":"string","minLength":1,"maxLength":100},"is_shared":{"type":"boolean","title":"Shared","description":"If true, this layout is published as a template available to every user."},"layout":{"description":"Map of widget id -> grid position {x, y, w, h, min_w, min_h}."},"widgets":{"description":"Ordered list of widget configurations (type, title, config)."},"settings":{"description":"Layout-level options. Reserved: carries nothing today."}},"required":["name","page_key"]},"PageLayoutSharedDefaultEntry":{"type":"object","properties":{"page_key":{"type":"string"},"layout_id":{"type":"integer"},"name":{"type":"string"}},"required":["layout_id","name","page_key"]},"PageLayoutSharedDefaultsResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/PageLayoutSharedDefaultEntry"}}},"required":["results"]},"PageLayoutSharedEntry":{"type":"object","properties":{"id":{"type":"integer"},"page_key":{"type":"string"},"name":{"type":"string"}},"required":["id","name","page_key"]},"PageLayoutSharedResponse":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/PageLayoutSharedEntry"}}},"required":["results"]},"PaginatedAIAuthorizationVerdictList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AIAuthorizationVerdict"}}}},"PaginatedAIComponentPolicyList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AIComponentPolicy"}}}},"PaginatedAIInventoryItemList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AIInventoryItem"}}}},"PaginatedActionListList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ActionList"}}}},"PaginatedActivityList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Activity"}}}},"PaginatedAnnouncementList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Announcement"}}}},"PaginatedAppAnalysisList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AppAnalysis"}},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedAssetAPIScanConfigurationList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AssetAPIScanConfiguration"}},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"tool_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ToolConfiguration"}}}}}},"PaginatedAssetAliasList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AssetAlias"}}}},"PaginatedAssetTypeList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AssetType"}}}},"PaginatedAssetVersionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AssetVersion"}}}},"PaginatedAssetsList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Assets"}},"prefetch":{"type":"object","properties":{"authorized_users":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"prod_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ProductType"}},"product_manager":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"regulations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Regulation"}},"sla_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/SLAConfiguration"}},"team_manager":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"technical_contact":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"locations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/LocationProductReference"}}}}}},"PaginatedAuditLogList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/AuditLog"}}}},"PaginatedBenchmarkCategoryList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/BenchmarkCategory"}},"prefetch":{"type":"object","properties":{}}}},"PaginatedBenchmarkProductList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/BenchmarkProduct"}},"prefetch":{"type":"object","properties":{"notes":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Note"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}}}}}},"PaginatedBenchmarkProductSummaryList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/BenchmarkProductSummary"}},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}}}}}},"PaginatedBenchmarkRequirementList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/BenchmarkRequirement"}},"prefetch":{"type":"object","properties":{}}}},"PaginatedBenchmarkTypeList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/BenchmarkType"}}}},"PaginatedBurpRawRequestResponseMultiList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/BurpRawRequestResponseMulti"}}}},"PaginatedCICDInfrastructureList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/CICDInfrastructure"}}}},"PaginatedCampaignList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Campaign"}}}},"PaginatedClassifierCallList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ClassifierCall"}}}},"PaginatedCmmcAssessmentList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/CmmcAssessment"}}}},"PaginatedCmmcRequirementResultList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/CmmcRequirementResult"}}}},"PaginatedComplianceSystemProfileList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ComplianceSystemProfile"}}}},"PaginatedContainerImageList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ContainerImage"}}}},"PaginatedControlCatalogList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ControlCatalog"}}}},"PaginatedConvertFromV1RowList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ConvertFromV1Row"}}}},"PaginatedCriticalitySLAMappingList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/CriticalitySLAMapping"}}}},"PaginatedCustomFieldDefinitionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldDefinition"}}}},"PaginatedCustomFieldValueList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldValue"}}}},"PaginatedDashboardConfigurationList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/DashboardConfiguration"}},"prefetch":{"type":"object","properties":{"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedDashboardLayoutList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/DashboardLayout"}}}},"PaginatedDashboardTileList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/DashboardTile"}}}},"PaginatedDeletePreviewList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/DeletePreview"}}}},"PaginatedDependencyList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Dependency"}}}},"PaginatedDevelopmentEnvironmentList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/DevelopmentEnvironment"}}}},"PaginatedDiagnosticEventList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/DiagnosticEvent"}}}},"PaginatedDojoGroupList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/DojoGroup"}},"prefetch":{"type":"object","properties":{"users":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedEndpointStatusList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EndpointStatus"}}}},"PaginatedEngagementPresetsList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EngagementPresets"}},"prefetch":{"type":"object","properties":{"network_locations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/NetworkLocations"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"test_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/TestType"}}}}}},"PaginatedEnhancedDojoGroupMemberList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedDojoGroupMember"}},"prefetch":{"type":"object","properties":{"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedEnhancedEngagementList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedEngagement"}},"prefetch":{"type":"object","properties":{"files":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/File"}},"lead":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"notes":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Note"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"risk_acceptance":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/RiskAcceptance"}}}}}},"PaginatedEnhancedOrganizationList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedOrganization"}},"prefetch":{"type":"object","properties":{"authorized_users":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedEnhancedProductGroupList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedProductGroup"}},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}}}}}},"PaginatedEnhancedProductMemberList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedProductMember"}},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedEnhancedProductTypeGroupList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedProductTypeGroup"}},"prefetch":{"type":"object","properties":{"product_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ProductType"}}}}}},"PaginatedEnhancedProductTypeList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedProductType"}},"prefetch":{"type":"object","properties":{"authorized_users":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedEnhancedProductTypeMemberList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedProductTypeMember"}},"prefetch":{"type":"object","properties":{"product_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ProductType"}},"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedEnhancedRiskAcceptanceList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedRiskAcceptance"}}}},"PaginatedEnhancedSystemSettingsList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedSystemSettings"}}}},"PaginatedEnhancedUserList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedUser"}}}},"PaginatedEvidencePackArtifactList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EvidencePackArtifact"}}}},"PaginatedEvidencePackSnapshotList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/EvidencePackSnapshot"}}}},"PaginatedExecPackScheduleList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ExecPackSchedule"}}}},"PaginatedExtendedConfigurationPermissionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ExtendedConfigurationPermission"}}}},"PaginatedExtendedUserContactInfoList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ExtendedUserContactInfo"}},"prefetch":{"type":"object","properties":{"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedFindingControlMapList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/FindingControlMap"}}}},"PaginatedFindingTemplateList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/FindingTemplate"}}}},"PaginatedFindingVersionAffectList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/FindingVersionAffect"}}}},"PaginatedFindingsList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Findings"}},"prefetch":{"type":"object","properties":{"auth_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"author_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"config_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"crypto_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"data_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"defect_review_requested_by":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"duplicate_finding":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Finding"}},"endpoint_set":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Endpoint"}},"endpoints":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Endpoint"}},"files":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/File"}},"finding_group_set":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/FindingGroup"}},"found_by":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/TestType"}},"last_reviewed_by":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"mitigated_by":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"notes":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Note"}},"other_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"reporter":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"review_requested_by":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"reviewers":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"risk_acceptance_set":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/RiskAcceptance"}},"sensitive_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"session_issues":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/EngagementCheckList"}},"sonarqube_issue":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/SonarqubeIssue"}},"test":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Test"}},"locations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/LocationFindingReference"}}}}}},"PaginatedFireWallList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/FireWall"}}}},"PaginatedFrameworkPresetList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/FrameworkPreset"}}}},"PaginatedFullFindingGroupList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/FullFindingGroup"}},"prefetch":{"type":"object","properties":{"creator":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"findings":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Finding"}},"test":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Test"}}}}}},"PaginatedGlobalRoleList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/GlobalRole"}},"prefetch":{"type":"object","properties":{"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedGraphRuleListList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/GraphRuleList"}}}},"PaginatedGraphRuleRunBriefList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/GraphRuleRunBrief"}}}},"PaginatedGuardrailCollectorList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/GuardrailCollector"}}}},"PaginatedGuardrailEventList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/GuardrailEvent"}}}},"PaginatedGuardrailPolicyList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/GuardrailPolicy"}}}},"PaginatedGuardrailRuleList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/GuardrailRule"}}}},"PaginatedHierarchySuggestionListList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/HierarchySuggestionList"}}}},"PaginatedJIRAInstanceList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/JIRAInstance"}}}},"PaginatedJIRAIssueList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/JIRAIssue"}}}},"PaginatedJIRAProjectList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/JIRAProject"}},"prefetch":{"type":"object","properties":{"engagement":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/FindingEngagement"}},"jira_instance":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/JIRAInstance"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}}}}}},"PaginatedLanguageList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Language"}},"prefetch":{"type":"object","properties":{"language":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/LanguageType"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedLanguageTypeList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/LanguageType"}}}},"PaginatedLegacyAuditLogList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/LegacyAuditLog"}}}},"PaginatedLocationFindingReferenceList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/LocationFindingReference"}}}},"PaginatedLocationList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Location"}}}},"PaginatedLocationProductReferenceList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/LocationProductReference"}}}},"PaginatedMemberFindingList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/MemberFinding"}}}},"PaginatedMetaList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Meta"}}}},"PaginatedMitigationPolicyList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/MitigationPolicy"}}}},"PaginatedNeedsAttentionAssetList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/NeedsAttentionAsset"}}}},"PaginatedNetworkLocationsList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/NetworkLocations"}}}},"PaginatedNoteList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Note"}}}},"PaginatedNoteTypeList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/NoteType"}}}},"PaginatedNotificationWebhooksList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/NotificationWebhooks"}}}},"PaginatedNotificationsList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Notifications"}},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"user":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedObligationResultList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ObligationResult"}}}},"PaginatedOperationList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Operation"}}}},"PaginatedOrganizationMembershipList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationMembership"}}}},"PaginatedOrganizationTypeRoleList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationTypeRole"}}}},"PaginatedOwnerUserOptionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/OwnerUserOption"}}}},"PaginatedPOAMArtifactList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/POAMArtifact"}}}},"PaginatedPOAMItemList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/POAMItem"}}}},"PaginatedPOAMMilestoneList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/POAMMilestone"}}}},"PaginatedPOAMSnapshotList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/POAMSnapshot"}}}},"PaginatedPageLayoutList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PageLayout"}}}},"PaginatedPlanListList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PlanList"}}}},"PaginatedPresetApplicationList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PresetApplication"}}}},"PaginatedPresetCheckAnswerList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PresetCheckAnswer"}}}},"PaginatedPrioritizationEngineList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PrioritizationEngine"}}}},"PaginatedProAnsweredSurveyList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProAnsweredSurvey"}},"prefetch":{"type":"object","properties":{"assignee":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"engagement":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/FindingEngagement"}},"responder":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}}},"PaginatedProGeneratedReportListList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProGeneratedReportList"}}}},"PaginatedProOpenSurveyList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProOpenSurvey"}},"prefetch":{"type":"object","properties":{}}}},"PaginatedProQuestionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProQuestion"}},"prefetch":{"type":"object","properties":{}}}},"PaginatedProReportBlockListList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProReportBlockList"}}}},"PaginatedProReportScheduleList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProReportSchedule"}}}},"PaginatedProReportTemplateListList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProReportTemplateList"}}}},"PaginatedProReportThemeList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProReportTheme"}}}},"PaginatedProSurveyList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProSurvey"}},"prefetch":{"type":"object","properties":{}}}},"PaginatedProductAPIScanConfigurationList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProductAPIScanConfiguration"}},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"tool_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ToolConfiguration"}}}}}},"PaginatedProductCadenceStatusList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProductCadenceStatus"}}}},"PaginatedProductLifecycleList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProductLifecycle"}}}},"PaginatedProductOriginList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProductOrigin"}}}},"PaginatedProductPlatformList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ProductPlatform"}}}},"PaginatedProductsList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Products"}},"prefetch":{"type":"object","properties":{"authorized_users":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"prod_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ProductType"}},"product_manager":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"regulations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Regulation"}},"sla_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/SLAConfiguration"}},"team_manager":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"technical_contact":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"locations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/LocationProductReference"}}}}}},"PaginatedPsirtAdvisoryCommentList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtAdvisoryComment"}}}},"PaginatedPsirtAdvisoryList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtAdvisory"}}}},"PaginatedPsirtAdvisoryManualTargetList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtAdvisoryManualTarget"}}}},"PaginatedPsirtAdvisorySnapshotList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtAdvisorySnapshot"}}}},"PaginatedPsirtCaseAttachmentList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtCaseAttachment"}}}},"PaginatedPsirtCaseList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtCase"}}}},"PaginatedPsirtComponentInventoryRowList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtComponentInventoryRow"}}}},"PaginatedPsirtComponentProfileList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtComponentProfile"}}}},"PaginatedPsirtFeedCategoryList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtFeedCategory"}}}},"PaginatedPsirtFeedPrefilterSubscriptionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscription"}}}},"PaginatedPsirtFeedSourceList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtFeedSource"}}}},"PaginatedPsirtIngestRunList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtIngestRun"}}}},"PaginatedPsirtLicenceAcceptanceList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtLicenceAcceptance"}}}},"PaginatedPsirtMatchList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtMatch"}}}},"PaginatedPsirtMatchRuleList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtMatchRule"}}}},"PaginatedPsirtPrefilterGroupList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtPrefilterGroup"}}}},"PaginatedPsirtRuleGroupList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtRuleGroup"}}}},"PaginatedPsirtRuleGroupSubscriptionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtRuleGroupSubscription"}}}},"PaginatedPsirtSlaClockDefinitionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtSlaClockDefinition"}}}},"PaginatedPsirtSlaClockList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtSlaClock"}}}},"PaginatedPsirtSlaPolicyList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtSlaPolicy"}}}},"PaginatedPsirtSourceAdvisoryListList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtSourceAdvisoryList"}}}},"PaginatedPsirtSourceAdvisoryRevisionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PsirtSourceAdvisoryRevision"}}}},"PaginatedRecommendationListList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RecommendationList"}}}},"PaginatedRecommendationRunList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RecommendationRun"}}}},"PaginatedRecordList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Record"}}}},"PaginatedRegulationList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Regulation"}}}},"PaginatedRegulatoryAssessmentList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RegulatoryAssessment"}}}},"PaginatedRegulatoryProfileList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RegulatoryProfile"}}}},"PaginatedRegulatoryReportList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RegulatoryReport"}}}},"PaginatedResponseTimeframeList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ResponseTimeframe"}}}},"PaginatedRiskAcceptanceFindingRecordList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RiskAcceptanceFindingRecord"}}}},"PaginatedRiskAcceptanceList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RiskAcceptance"}}}},"PaginatedRiskAcceptanceStateTransitionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RiskAcceptanceStateTransition"}}}},"PaginatedRoleList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Role"}}}},"PaginatedRootCauseList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RootCause"}}}},"PaginatedRootCauseMemberList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RootCauseMember"}}}},"PaginatedRootCauseOrganizationList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RootCauseOrganization"}}}},"PaginatedRootCauseProductList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RootCauseProduct"}}}},"PaginatedSLAConfigurationList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/SLAConfiguration"}}}},"PaginatedScanCadencePolicyList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ScanCadencePolicy"}}}},"PaginatedSecurityControlList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/SecurityControl"}}}},"PaginatedServiceUserList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ServiceUser"}}}},"PaginatedSignificantChangeList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/SignificantChange"}}}},"PaginatedSonarqubeIssueList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/SonarqubeIssue"}}}},"PaginatedSonarqubeIssueTransitionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/SonarqubeIssueTransition"}}}},"PaginatedTargetedRiskAnalysisList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/TargetedRiskAnalysis"}}}},"PaginatedTestImportList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/TestImport"}}}},"PaginatedTestTypeList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/TestType"}}}},"PaginatedTestsList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/Tests"}},"prefetch":{"type":"object","properties":{"api_scan_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ProductAPIScanConfiguration"}},"engagement":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/FindingEngagement"}},"environment":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/FindingEnvironment"}},"files":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/File"}},"lead":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"notes":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Note"}},"test_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/TestType"}}}}}},"PaginatedThreatModelListList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ThreatModelList"}}}},"PaginatedThreatModelRunList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ThreatModelRun"}}}},"PaginatedToolConfigurationList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ToolConfiguration"}},"prefetch":{"type":"object","properties":{"tool_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ToolType"}}}}}},"PaginatedToolProductSettingsList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ToolProductSettings"}},"prefetch":{"type":"object","properties":{"notes":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Note"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"tool_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ToolConfiguration"}}}}}},"PaginatedToolTypeList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ToolType"}}}},"PaginatedURLList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/URL"}}}},"PaginatedUnassignedFindingList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/UnassignedFinding"}},"prefetch":{"type":"object","properties":{"reporter":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/AddUser"}},"test_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/TestType"}}}}}},"PaginatedUnauthenticatedSystemExceptionList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/UnauthenticatedSystemException"}}}},"PaginatedUsageRecordList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/UsageRecord"}}}},"PaginatedV3EndpointCompatibleList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/V3EndpointCompatible"}}}},"PaginatedVulnerabilityResponsePolicyList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/VulnerabilityResponsePolicy"}}}},"PaginatedWidgetCatalogResponseList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer","example":123},"next":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=400&limit=100"},"previous":{"type":"string","nullable":true,"format":"uri","example":"http://api.example.org/accounts/?offset=200&limit=100"},"results":{"type":"array","items":{"$ref":"#/components/schemas/WidgetCatalogResponse"}}}},"PatchedAIComponentPolicyRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"A short name for the policy, shown on verdicts and on the Findings it raises.","maxLength":200},"product_type":{"type":"integer","nullable":true},"product":{"type":"integer","nullable":true},"match_type":{"enum":["purl","purl_glob","category","provider"],"type":"string","x-spec-enum-id":"7a6872157541fbcb","description":"How the policy recognises a component.\n\n* `purl` - Exact Package URL\n* `purl_glob` - Package URL pattern\n* `category` - AI category\n* `provider` - Provider"},"match_value":{"type":"string","minLength":1,"description":"A Package URL, a Package URL pattern such as pkg:npm/@modelcontextprotocol/*, an AI category such as mcp-server, or a provider such as anthropic.","maxLength":1024},"decision":{"enum":["authorized","unauthorized","needs_review"],"type":"string","x-spec-enum-id":"2a99e4cc67012f7f","description":"What a matching component is: authorized, unauthorized, or needs review.\n\n* `authorized` - Authorized\n* `unauthorized` - Unauthorized\n* `needs_review` - Needs review"},"severity":{"enum":["Critical","High","Medium","Low","Info",""],"type":"string","x-spec-enum-id":"fc5d16a20ed06136","description":"Severity of the Finding an unauthorized component raises. Empty uses the default for its kind: High for MCP servers and AI services, Medium for assistants, models and packages, Low for skills.\n\n* `Critical` - Critical\n* `High` - High\n* `Medium` - Medium\n* `Low` - Low\n* `Info` - Info"},"justification":{"type":"string","description":"Why the decision was made. Shown on the verdict and in the Finding description."},"owner_user":{"type":"integer","nullable":true},"owner_group":{"type":"integer","nullable":true},"enabled":{"type":"boolean","description":"Disabled policies are kept but never match."}}},"PatchedAnnouncementRequest":{"type":"object","properties":{"message":{"type":"string","minLength":1,"description":"This dismissable message will be displayed on all pages for authenticated users. It can contain basic html tags, for example <a href='https://www.fred.com' style='color: #337ab7;' target='_blank'>https://example.com</a>","maxLength":500},"style":{"enum":["info","success","warning","danger"],"type":"string","x-spec-enum-id":"6f65abe0aab2c78c","description":"The style of banner to display. (info, success, warning, danger)\n\n* `info` - Info\n* `success` - Success\n* `warning` - Warning\n* `danger` - Danger"},"dismissable":{"type":"boolean","title":"Dismissable?","description":"Ticking this box allows users to dismiss the current announcement"}}},"PatchedAppAnalysisRequest":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string","minLength":1}},"name":{"type":"string","minLength":1,"maxLength":200},"confidence":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Confidence level"},"version":{"type":"string","nullable":true,"title":"Version Number","maxLength":200},"icon":{"type":"string","nullable":true,"maxLength":200},"website":{"nullable":true,"oneOf":[{"type":"string","format":"uri","maxLength":400},{"type":"string","maxLength":0}]},"website_found":{"nullable":true,"oneOf":[{"type":"string","format":"uri","maxLength":400},{"type":"string","maxLength":0}]},"product":{"type":"integer"},"user":{"type":"integer"}}},"PatchedAssetAPIScanConfigurationRequest":{"type":"object","description":"Enforce ``view_tool_configuration`` on ``tool_configuration`` writes.\n\nSelecting a ``tool_configuration`` lets an import run authenticated requests\nwith the credential stored on it, so it is gated by the same\n``view_tool_configuration`` permission that guards the tool-configuration\nviews, not just the object permission these endpoints already check.\n\nMix this into *every* serializer exposing the field, including alias\nserializers over the same model, so the rule holds wherever the field is\nreachable.\n\nThe check hangs off ``run_validation`` rather than ``validate`` on purpose: a\nsubclass that defines its own ``validate`` would otherwise shadow the mixin's\nand silently drop the guard.\n\nNo-ops when the field is absent (replay-safe on PATCH), mirroring\ndojo.authorization.api_permissions.check_update_permission.","properties":{"asset":{"type":"integer"},"service_key_1":{"type":"string","nullable":true,"maxLength":200},"service_key_2":{"type":"string","nullable":true,"maxLength":200},"service_key_3":{"type":"string","nullable":true,"maxLength":200},"tool_configuration":{"type":"integer"}}},"PatchedAssetsRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"tags":{"type":"array","items":{"type":"string","minLength":1}},"organization":{"type":"integer"},"asset_numeric_grade":{"type":"integer","nullable":true},"enable_asset_tag_inheritance":{"type":"boolean","default":false},"asset_managers":{"type":"integer","nullable":true},"business_criticality":{"enum":["very high","high","medium","low","very low","none","",null],"type":"string","description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","x-spec-enum-id":"ef412461eb271471","nullable":true},"platform":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"lifecycle":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"origin":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"parent":{"type":"integer","nullable":true},"prioritization_engine":{"type":"integer","nullable":true},"asset_type":{"type":"string","minLength":1,"description":"Stable lookup key, e.g. 'repository'. Referenced by connectors and imports.","nullable":true},"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","minLength":1,"maxLength":4000},"user_records":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"Estimate the number of user records within the application."},"revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Estimate the application's revenue."},"external_audience":{"type":"boolean","description":"Specify if the application is used by people outside the organization."},"internet_accessible":{"type":"boolean","description":"Specify if the application is accessible from the public internet."},"enable_simple_risk_acceptance":{"type":"boolean","description":"Allows simple risk acceptance by checking/unchecking a checkbox."},"enable_full_risk_acceptance":{"type":"boolean","description":"Allows full risk acceptance using a risk acceptance form, expiration date, uploaded proof, etc."},"disable_sla_breach_notifications":{"type":"boolean","description":"Disable SLA breach notifications if configured in the global settings"},"technical_contact":{"type":"integer","nullable":true},"team_manager":{"type":"integer","nullable":true},"sla_configuration":{"type":"integer"},"regulations":{"type":"array","items":{"type":"integer"}}}},"PatchedBenchmarkCategoryRequest":{"type":"object","description":"Base serializer for all models.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"objective":{"type":"string","minLength":1},"references":{"type":"string","nullable":true},"enabled":{"type":"boolean"},"type":{"type":"integer","title":"Benchmark Type"}}},"PatchedBenchmarkProductRequest":{"type":"object","description":"Base serializer for all models.","properties":{"pass_fail":{"type":"boolean","title":"Pass","description":"Does the product meet the requirement?"},"enabled":{"type":"boolean","description":"Applicable for this specific product."},"product":{"type":"integer"},"control":{"type":"integer"}}},"PatchedBenchmarkProductSummaryRequest":{"type":"object","description":"Base serializer for all models.","properties":{"desired_level":{"enum":["Level 1","Level 2","Level 3"],"type":"string","description":"* `Level 1` - Level 1\n* `Level 2` - Level 2\n* `Level 3` - Level 3","x-spec-enum-id":"51d382524500f67b"},"current_level":{"enum":["Level 1","Level 2","Level 3","",null],"type":"string","description":"* `Level 1` - Level 1\n* `Level 2` - Level 2\n* `Level 3` - Level 3","x-spec-enum-id":"51d382524500f67b","nullable":true},"asvs_level_1_benchmark":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Total number of active benchmarks for this application."},"asvs_level_1_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"ASVS Level 1 Score"},"asvs_level_2_benchmark":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Total number of active benchmarks for this application."},"asvs_level_2_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"ASVS Level 2 Score"},"asvs_level_3_benchmark":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Total number of active benchmarks for this application."},"asvs_level_3_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"ASVS Level 3 Score"},"publish":{"type":"boolean","description":"Publish score to Product."},"product":{"type":"integer"},"benchmark_type":{"type":"integer"}}},"PatchedBenchmarkRequirementRequest":{"type":"object","description":"Base serializer for all models.","properties":{"objective_number":{"type":"string","nullable":true,"maxLength":15},"objective":{"type":"string","minLength":1},"references":{"type":"string","nullable":true},"level_1":{"type":"boolean"},"level_2":{"type":"boolean"},"level_3":{"type":"boolean"},"enabled":{"type":"boolean"},"category":{"type":"integer"}}},"PatchedBenchmarkTypeRequest":{"type":"object","description":"Base serializer for all models.","properties":{"name":{"type":"string","minLength":1,"maxLength":300},"version":{"type":"string","minLength":1,"maxLength":15},"benchmark_source":{"enum":["PCI","OWASP ASVS","OWASP Mobile ASVS",null],"type":"string","description":"* `PCI` - PCI\n* `OWASP ASVS` - OWASP ASVS\n* `OWASP Mobile ASVS` - OWASP Mobile ASVS","x-spec-enum-id":"091a6ccd03b2ee84","nullable":true},"enabled":{"type":"boolean"}}},"PatchedBurpRawRequestResponseMultiRequest":{"type":"object","properties":{"burpRequestBase64":{"type":"string","minLength":1},"burpResponseBase64":{"type":"string","minLength":1},"finding":{"type":"integer","nullable":true}}},"PatchedCICDInfrastructureRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"infrastructure_type":{"enum":["scm_server","build_server","orchestration"],"type":"string","description":"* `scm_server` - SCM Server\n* `build_server` - Build Server\n* `orchestration` - Orchestration Engine","x-spec-enum-id":"a1515c7dc5876b23"}}},"PatchedClassifierSettingsRequest":{"type":"object","description":"The Jev connection. The API key is write-only; reads say only whether one is stored.","properties":{"jev_api_key":{"type":"string","writeOnly":true},"jev_base_url":{"oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]},"jev_model":{"type":"string","maxLength":64}}},"PatchedClassifierUseRequest":{"type":"object","description":"One registered use, with its backend and threshold. The use's description and whether it\ncarries customer data come from code; only the backend and threshold are editable.","properties":{"backend":{"enum":["off","claude","jev"],"type":"string","description":"* `off` - Off\n* `claude` - Claude\n* `jev` - Jev","x-spec-enum-id":"b3d270b088e453f2"},"min_confidence":{"type":"number","format":"double","maximum":1.0,"minimum":0.0}}},"PatchedCmmcAssessmentRequest":{"type":"object","description":"Base serializer for all models.","properties":{"product":{"type":"integer","description":"The product (system) being assessed"},"catalog":{"type":"integer","title":"Control Catalog","description":"The 800-171 catalog this assessment scores against"},"level":{"enum":["1","2","3"],"type":"string","x-spec-enum-id":"117ff2bd42599a29","title":"CMMC Level","description":"The CMMC level being assessed\n\n* `1` - Level 1\n* `2` - Level 2\n* `3` - Level 3"},"assessment_date":{"type":"string","format":"date","nullable":true,"description":"The date of the assessment"}}},"PatchedCmmcRequirementResultRequest":{"type":"object","description":"Base serializer for all models.","properties":{"assessment":{"type":"integer","description":"The assessment this result belongs to"},"control":{"type":"integer","title":"Control / Requirement","description":"The 800-171 requirement being scored"},"status":{"enum":["met","not_met","na","planned"],"type":"string","x-spec-enum-id":"d36b34e3703ead72","title":"Result","description":"Whether the requirement is met, not met, not applicable, or planned on a POA&M\n\n* `met` - Met\n* `not_met` - Not met\n* `na` - Not applicable\n* `planned` - Planned (on POA&M)"},"partial_credit":{"type":"boolean","description":"The requirement's documented partial condition holds (for 3.13.11: encryption is employed but is not FIPS-validated), so the reduced deduction from the control's metadata applies. Ignored for requirements whose methodology defines no partial credit."},"notes":{"type":"string","description":"Assessor notes for this requirement"}}},"PatchedComplianceSystemProfileRequest":{"type":"object","description":"Base serializer for all models.","properties":{"enabled":{"type":"boolean","description":"Master switch: no POA&M sync or exports run while disabled"},"poam_prefix":{"type":"string","minLength":1,"title":"POA&M ID Prefix","description":"Prefix for POA&M display IDs, e.g. 'V' produces V-1, V-2, ...","maxLength":10},"csp_name":{"type":"string","description":"The cloud service provider name, as it should appear on deliverables","maxLength":300},"system_name":{"type":"string","description":"The system / cloud service offering name, as it should appear on deliverables","maxLength":300},"system_id":{"type":"string","title":"System Identifier","description":"The FedRAMP (or agency) system identifier for OSCAL system-id","maxLength":100},"impact_level":{"enum":["LI-SaaS","Low","Moderate","High",""],"type":"string","x-spec-enum-id":"aacc09af6f4563f1","description":"The FedRAMP impact level, as it appears on the POA&M workbook header\n\n* `LI-SaaS` - LI-SaaS\n* `Low` - Low\n* `Moderate` - Moderate\n* `High` - High"},"oscal_ssp_href":{"type":"string","title":"OSCAL SSP Reference","description":"href for the OSCAL POA&M import-ssp reference","maxLength":500},"oscal_ssp_uuid":{"type":"string","format":"uuid","nullable":true,"description":"UUID of the system security plan this POA&M belongs to, if known"},"oscal_version_pin":{"type":"string","minLength":1,"description":"The OSCAL version exports target (FedRAMP pins an older version than NIST's latest)","maxLength":20},"default_poc":{"type":"string","title":"Default Point of Contact","description":"Default Point of Contact for new POA&M items","maxLength":300},"scan_item_policy":{"enum":["all_open","past_due_only"],"type":"string","x-spec-enum-id":"c504c2edc0f29589","description":"Which scan-derived items appear on exported POA&M deliverables\n\n* `all_open` - Include all open items\n* `past_due_only` - Include only past-due scan items (FedRAMP ConMon minimum)"},"auto_sync":{"type":"boolean","description":"Keep POA&M items in sync with findings automatically"},"product":{"type":"integer","description":"The product this compliance profile configures"},"default_scan_controls":{"type":"array","items":{"type":"integer","title":"Default Scan Controls"},"description":"Controls assigned to scan-derived POA&M items by default (FedRAMP practice: RA-5)"},"config_test_types":{"type":"array","items":{"type":"integer","title":"Configuration Test Types"},"title":"Configuration Test Types","description":"Findings from these scanner types are treated as configuration findings (Configuration Findings tab plus one consolidated CM-6 item)"}}},"PatchedCriticalitySLAMappingRequest":{"type":"object","description":"Base serializer for all models.","properties":{"business_criticality":{"enum":["very high","high","medium","low","very low","none"],"type":"string","x-spec-enum-id":"ef412461eb271471","description":"The product business-criticality band this mapping applies to.\n\n* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None"},"enabled":{"type":"boolean","description":"When off, this mapping is ignored and no product is reassigned from it."},"sla_configuration":{"type":"integer","description":"The SLA configuration products in this criticality band should be moved to."}}},"PatchedCustomFieldDefinitionRequest":{"type":"object","properties":{"entity_type":{"enum":["finding","product","product_type","engagement","test","risk_acceptance"],"type":"string","x-spec-enum-id":"a16da54e71f2f35c","default":"finding","description":"The object type this custom field applies to\n\n* `finding` - Finding\n* `product` - Asset\n* `product_type` - Organization\n* `engagement` - Engagement\n* `test` - Test\n* `risk_acceptance` - Risk Acceptance"},"name":{"type":"string","minLength":1,"description":"The stable identifier used in URLs and as the column/filter/sort key (a slug)","pattern":"^[a-z0-9_]+$","maxLength":120},"label":{"type":"string","description":"The human-readable display label shown as the column header and field label; falls back to the name when blank","maxLength":120},"field_type":{"enum":["text","integer","decimal","date","boolean","single_select","multi_select"],"type":"string","x-spec-enum-id":"973e59d42cfa7372","title":"Data Type","description":"The datatype used to validate values and to filter and sort the field\n\n* `text` - Text\n* `integer` - Integer\n* `decimal` - Decimal\n* `date` - Date\n* `boolean` - Boolean\n* `single_select` - Single select\n* `multi_select` - Multi select"},"options":{"description":"Allowed values for single/multi-select fields; ignored for other types"},"required":{"type":"boolean","description":"Whether a value for this field is required on its entity"}}},"PatchedCustomFieldValueRequest":{"type":"object","properties":{"definition":{"type":"integer"},"finding":{"type":"integer","nullable":true},"product":{"type":"integer","nullable":true},"product_type":{"type":"integer","nullable":true},"engagement":{"type":"integer","nullable":true},"test":{"type":"integer","nullable":true},"risk_acceptance":{"type":"integer","nullable":true},"value":{"type":"string","description":"The raw value as entered; the canonical form that always round-trips"},"value_options":{"description":"Selected options for multi-select fields"}}},"PatchedDashboardConfigurationRequest":{"type":"object","properties":{"user":{"type":"array","items":{"type":"integer","title":"Configuration Owner"},"title":"Configuration Owner"},"graphs":{"type":"boolean","title":"Show Graphs"},"tables":{"type":"boolean","title":"Show Tables"},"questionnaires":{"type":"boolean","title":"Show Questionaires"}}},"PatchedDashboardLayoutRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"is_shared":{"type":"boolean","title":"Shared","description":"If true, this layout is published as a template available to every user."},"is_collaborative":{"type":"boolean","title":"Collaborative","description":"When enabled, other users can make modifications to this configuration that all users using it will see."},"layout":{"description":"Map of widget id -> grid position {x, y, w, h, min_w, min_h}."},"widgets":{"description":"Ordered list of widget configurations (type, title, refresh_interval, config)."},"settings":{"description":"Layout-level options such as grid density and column count."}}},"PatchedDashboardTileRequest":{"type":"object","properties":{"model":{"enum":["product","engagement","test","finding","endpoint","sla","scan-time","prod-grade",""],"type":"string","x-spec-enum-id":"a6e596d1d03709b5","title":"Tile Type","description":"The type of data to display within this tile.\n\n* `product` - Product\n* `engagement` - Engagement\n* `test` - Test\n* `finding` - Finding\n* `endpoint` - Endpoint\n* `sla` - SLA Violation\n* `scan-time` - Scan Time Violation\n* `prod-grade` - Product Grade"},"filters":{"nullable":true,"title":"Tile Filters","description":"The filters to obtain the data count for this tile."},"icon":{"enum":["align-left","box-archive","bars","ban","bolt","bug","bullseye","calendar-days","certificate","check","code","gear","clock","download","circle-exclamation","file","filter","fire-extinguisher","flag","house","circle-info","lock","circle-question","magnifying-glass","list-check","lock-open","user",""],"type":"string","x-spec-enum-id":"c3556497146d88cf","title":"Tile Icon","description":"The icon to display within this tile.\n\n* `align-left` - Align Left\n* `box-archive` - Archive\n* `bars` - Bars\n* `ban` - Ban\n* `bolt` - Bolt\n* `bug` - Bug\n* `bullseye` - Bullseye\n* `calendar-days` - Calendar\n* `certificate` - Certificate\n* `check` - Check\n* `code` - Code\n* `gear` - Cog\n* `clock` - Clock\n* `download` - Download\n* `circle-exclamation` - Exclamation\n* `file` - File\n* `filter` - Filter\n* `fire-extinguisher` - Fire Extinguisher\n* `flag` - Flag\n* `house` - Home\n* `circle-info` - Info\n* `lock` - Lock\n* `circle-question` - Question\n* `magnifying-glass` - Search\n* `list-check` - Tasks\n* `lock-open` - Unlock\n* `user` - User"},"header":{"type":"string","title":"Tile Header","description":"The header text to display under the count of this tile.","maxLength":64},"footer":{"type":"string","title":"Tile Footer","description":"The footer text to display in the button of this tile.","maxLength":64},"color":{"enum":["red","orange","yellow","green","teal","cyan","blue","indigo","purple","pink","dark","light",""],"type":"string","x-spec-enum-id":"9c9a36b0f59676ad","title":"Tile Color","description":"The color of this tile (if dynamic tile is enabled, selected color will be ignored).\n\n* `red` - Red\n* `orange` - Orange\n* `yellow` - Yellow\n* `green` - Green\n* `teal` - Teal\n* `cyan` - Cyan\n* `blue` - Blue\n* `indigo` - Indigo\n* `purple` - Purple\n* `pink` - Pink\n* `dark` - Dark\n* `light` - Light"},"dynamic":{"type":"boolean","title":"Dynamic Color Tile","description":"When selected, the color of this tile will dynamically change based on the minimum and maximum threshold."},"minimum":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"title":"Dynamic Color Minimum","description":"The minimum acceptable threshold for this tile's count (i.e. green in color)."},"maximum":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"title":"Dynamic Color Maximum","description":"The maximum acceptable threshold for this tile's count (i.e. red in color)."}}},"PatchedDependencyRequest":{"type":"object","description":"Serializer for the Dependency model with primary keys for related objects.","properties":{"tags":{"type":"array","items":{"type":"string","minLength":1}},"purl_type":{"type":"string","minLength":1,"description":"The package type/ecosystem (e.g., maven, npm, pypi, golang).","maxLength":64},"namespace":{"type":"string","description":"The type-specific package namespace (e.g., groupId for Maven, scope for npm).","maxLength":256},"name":{"type":"string","description":"The name of the package.","maxLength":256},"version":{"type":"string","description":"The version of the package.","maxLength":128},"qualifiers":{"type":"string","description":"Package URL qualifiers (e.g., 'arch=x86_64&distro=ubuntu-22.04').","maxLength":1024},"subpath":{"type":"string","description":"A subpath within the package.","maxLength":512},"component_type":{"enum":["application","framework","library","container","platform","operating-system","device","device-driver","firmware","file","machine-learning-model","data","cryptographic-asset","service"],"type":"string","x-spec-enum-id":"c28aa1a9d112e7e7","description":"What kind of component this is, in CycloneDX terms (library, application, machine-learning-model, service, and so on). Not part of the identity: the Package URL alone decides which row a component is.\n\n* `application` - Application\n* `framework` - Framework\n* `library` - Library\n* `container` - Container\n* `platform` - Platform\n* `operating-system` - Operating system\n* `device` - Device\n* `device-driver` - Device driver\n* `firmware` - Firmware\n* `file` - File\n* `machine-learning-model` - Machine learning model\n* `data` - Data\n* `cryptographic-asset` - Cryptographic asset\n* `service` - Service"},"purl_validation_failure":{"type":"boolean","description":"Dictates whether the dependency was found to have Package URL validation issues during creation"},"artifact_hashes":{"description":"Mapping of hash algorithms to hash values for this dependency"},"supplier_name":{"type":"string","title":"Supplier","description":"The entity that supplies the component, as the bill of materials names it.","maxLength":256},"supplier_url":{"description":"Where the supplier publishes the component, when the document says.","oneOf":[{"type":"string","format":"uri","maxLength":512},{"type":"string","maxLength":0}]},"support_level":{"enum":["unknown","actively_maintained","security_fixes_only","community_only","unsupported","end_of_life",""],"type":"string","x-spec-enum-id":"1caff0b521c38598","description":"How the supplier maintains this component version. Unknown is a reportable answer; it is never inferred from anything else.\n\n* `unknown` - Unknown\n* `actively_maintained` - Actively maintained\n* `security_fixes_only` - Security fixes only\n* `community_only` - Community supported\n* `unsupported` - Unsupported\n* `end_of_life` - End of life"},"end_of_support_date":{"type":"string","format":"date","nullable":true,"title":"End of Support","description":"The date the supplier stops supporting this component version, when stated."},"support_source":{"enum":["unknown","import","manual","enrichment",""],"type":"string","x-spec-enum-id":"de4fae6dfdbf0c05","description":"Where the support facts came from. A manual edit outranks every later import, so an assessor can see which claims a person stands behind.\n\n* `unknown` - Unknown\n* `import` - Bill of materials\n* `manual` - Manual entry\n* `enrichment` - Enrichment"},"support_updated_at":{"type":"string","format":"date-time","nullable":true,"title":"Support Updated Timestamp","description":"When the support facts were last written."},"support_updated_by":{"type":"integer","nullable":true,"description":"The user who last edited the support facts by hand, when a person did."}}},"PatchedDevelopmentEnvironmentRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200}}},"PatchedDojoGroupRequest":{"type":"object","description":"Base serializer for all models.","properties":{"configuration_permissions":{"type":"array","items":{"type":"integer","nullable":true}},"email":{"nullable":true,"oneOf":[{"type":"string","format":"email","pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"},{"type":"string","maxLength":0}]},"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000},"social_provider":{"enum":["AzureAD","Remote","OIDC","SCIM","",null],"type":"string","x-spec-enum-id":"6fdea05504945238","nullable":true,"title":"Social Authentication Provider","description":"Group imported from a social provider.\n\n* `AzureAD` - AzureAD\n* `Remote` - Remote\n* `OIDC` - OIDC\n* `SCIM` - SCIM"}}},"PatchedEndpointStatusRequest":{"type":"object","properties":{"date":{"type":"string","format":"date"},"mitigated":{"type":"boolean"},"false_positive":{"type":"boolean"},"out_of_scope":{"type":"boolean"},"risk_accepted":{"type":"boolean"},"mitigated_by":{"type":"integer","nullable":true},"endpoint":{"type":"integer"},"finding":{"type":"integer"}}},"PatchedEngagementPresetsRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"description":"Brief description of preset.","maxLength":500},"notes":{"type":"string","nullable":true,"description":"Description of what needs to be tested or setting up environment for testing","maxLength":2000},"scope":{"type":"string","description":"Scope of Engagement testing, IP's/Resources/URL's)","maxLength":800},"product":{"type":"integer"},"test_type":{"type":"array","items":{"type":"integer"}},"network_locations":{"type":"array","items":{"type":"integer"}}}},"PatchedEnhancedEngagementRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"pentest_kind":{"enum":["none","internal","external","application","segmentation"],"type":"string","x-spec-enum-id":"a0c02d669cc5c530","description":"What kind of penetration test this engagement represents (Requirement 11.4)\n\n* `none` - Not a penetration test\n* `internal` - Internal penetration test\n* `external` - External penetration test\n* `application` - Application penetration test\n* `segmentation` - Segmentation test"},"retest_of":{"type":"integer","nullable":true,"description":"The penetration test engagement this one retests (Requirement 11.4.4)"},"pentest_methodology_reference":{"type":"string","description":"The entity's reference for the methodology this test followed (Requirement 11.4.1)"},"name":{"type":"string","nullable":true,"maxLength":300},"description":{"type":"string","nullable":true,"maxLength":2000},"version":{"type":"string","nullable":true,"description":"Version of the product the engagement tested.","maxLength":100},"first_contacted":{"type":"string","format":"date","nullable":true},"target_start":{"type":"string","format":"date"},"target_end":{"type":"string","format":"date"},"reason":{"type":"string","nullable":true,"maxLength":2000},"tracker":{"nullable":true,"description":"Link to epic or ticket system with changes to version.","oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]},"test_strategy":{"nullable":true,"oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]},"threat_model":{"type":"boolean"},"api_test":{"type":"boolean"},"pen_test":{"type":"boolean"},"check_list":{"type":"boolean"},"status":{"enum":["Not Started","Blocked","Cancelled","Completed","In Progress","On Hold","Scheduled","Waiting for Resource",null],"type":"string","description":"* `Not Started` - Not Started\n* `Blocked` - Blocked\n* `Cancelled` - Cancelled\n* `Completed` - Completed\n* `In Progress` - In Progress\n* `On Hold` - On Hold\n* `Scheduled` - Scheduled\n* `Waiting for Resource` - Waiting for Resource","x-spec-enum-id":"ff79738e944f9d44","nullable":true},"engagement_type":{"enum":["Interactive","CI/CD",null],"type":"string","description":"* `Interactive` - Interactive\n* `CI/CD` - CI/CD","x-spec-enum-id":"531df25eeddb1f62","nullable":true},"build_id":{"type":"string","nullable":true,"description":"Build ID of the product the engagement tested.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash from repo","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch of the product the engagement tested.","maxLength":150},"source_code_management_uri":{"nullable":true,"title":"Repo","description":"Resource link to source code","oneOf":[{"type":"string","format":"uri","maxLength":600},{"type":"string","maxLength":0}]},"deduplication_on_engagement":{"type":"boolean","title":"Deduplication within this engagement only","description":"If enabled deduplication will only mark a finding in this engagement as duplicate of another finding if both findings are in this engagement. If disabled, deduplication is on the product level."},"lead":{"type":"integer","nullable":true},"requester":{"type":"integer","nullable":true},"preset":{"type":"integer","nullable":true,"description":"Settings and notes for performing this engagement."},"report_type":{"type":"integer","nullable":true},"product":{"type":"integer"},"cicd_scm_server":{"type":"integer","nullable":true,"title":"SCM Server","description":"Source code management server used for this CI/CD engagement"},"cicd_build_server":{"type":"integer","nullable":true,"title":"Build Server","description":"Build server used for this CI/CD engagement"},"cicd_orchestration_engine":{"type":"integer","nullable":true,"title":"Orchestration Engine","description":"Orchestration engine used for this CI/CD engagement"},"tags":{"type":"array","items":{"type":"string","minLength":1}}}},"PatchedEnhancedOrganizationRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"critical_asset":{"type":"boolean","default":false},"key_asset":{"type":"boolean","default":false},"org_type":{"enum":["team","business_app","compliance_scope","portfolio","custom"],"type":"string","x-spec-enum-id":"6ba9512199a7c3f4","description":"The organization's facet: team, business application, compliance scope, portfolio, or custom.\n\n* `team` - Team\n* `business_app` - Business Application\n* `compliance_scope` - Compliance Scope\n* `portfolio` - Portfolio\n* `custom` - Custom"},"parent_organization":{"type":"integer","nullable":true,"description":"Optional parent organization for drill-down nesting WITHIN the same facet. Reporting/navigation only -- nesting does not grant RBAC."},"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000}}},"PatchedEnhancedProductTypeRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000},"critical_product":{"type":"boolean"},"key_product":{"type":"boolean"}}},"PatchedEnhancedRiskAcceptanceRequest":{"type":"object","description":"``path`` served from the acceptance's prefetched ``engagement_set``.\n\nThe open-source ``get_path`` runs ``Engagement.objects.filter(...).first()`` for every\nacceptance, which ignores the ``engagement_set`` prefetch the list querysets already\ncarry, and it looks the engagement up even when there is no proof to link to. Iterating\n``engagement_set.all()`` reads the prefetch (in the same ``-target_start`` default order\n``.first()`` used), and checking for a proof first skips the lookup entirely for the\ncommon no-proof acceptance.","properties":{"is_global":{"type":"boolean","default":false},"acceptance_criteria":{"description":"Findings this risk acceptance stands for, so matching findings are accepted as they are imported. Requires a scope; only applies while the acceptance is active."},"recommendation":{"enum":["A","V","M","F","T"],"type":"string","description":"* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)","x-spec-enum-id":"8690fff015f0d4c3"},"decision":{"enum":["A","V","M","F","T"],"type":"string","description":"* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)","x-spec-enum-id":"8690fff015f0d4c3"},"accepted_findings":{"type":"array","items":{"type":"integer","nullable":true}},"name":{"type":"string","minLength":1,"description":"Descriptive name which in the future may also be used to group risk acceptances together across engagements and products","maxLength":300},"recommendation_details":{"type":"string","nullable":true,"title":"Security Recommendation Details","description":"Explanation of security recommendation"},"decision_details":{"type":"string","nullable":true,"description":"If a compensating control exists to mitigate the finding or reduce risk, then list the compensating control(s)."},"accepted_by":{"type":"string","nullable":true,"description":"The person that accepts the risk, can be outside of DefectDojo.","maxLength":200},"expiration_date":{"type":"string","format":"date-time","nullable":true,"description":"When the risk acceptance expires, the findings will be reactivated (unless disabled below)."},"reactivate_expired":{"type":"boolean","title":"Reactivate findings on expiration","description":"Reactivate findings when risk acceptance expires?"},"restart_sla_expired":{"type":"boolean","title":"Restart SLA on expiration","description":"When enabled, the SLA for findings is restarted when the risk acceptance expires."},"restore_verified_expired":{"type":"boolean","title":"Restore Verified on expiration","description":"When enabled, reactivated findings are also marked Verified when the risk acceptance expires. Only applies when 'Reactivate findings on expiration' is enabled."},"owner":{"type":"integer","description":"User in DefectDojo owning this acceptance. Only the owner and staff users can edit the risk acceptance."}}},"PatchedEnhancedSystemSettingsRequest":{"type":"object","description":"Base serializer for all models.","properties":{"risk_acceptance_block_self_approval":{"type":"boolean","description":"When enabled, whoever requested a risk acceptance cannot approve or activate it themselves, even if they hold the approve permission. Only applies while Risk Acceptances 2.0 is enabled."},"risk_acceptance_require_review_on_extension":{"type":"boolean","description":"When enabled, an expired risk acceptance has to be reviewed again before it can be extended -- reinstating it directly is refused, and it must go back through proposed. Turn off to allow approvers to reinstate an expired acceptance directly. Only applies while Risk Acceptances 2.0 is enabled."},"generated_report_retention_days":{"type":"integer","maximum":36500,"minimum":0,"description":"Generated reports older than this many days are deleted each night, file and all. 0 keeps them indefinitely."},"ai_governance_needs_review_findings":{"type":"boolean","description":"When enabled, an AI component no AI component policy decides on raises an Info-severity Finding. Only applies while AI Inventory and Governance is enabled."},"restrict_layout_customization":{"type":"boolean","description":"When enabled, only superusers can create or change dashboards, page layouts, and table views. Everyone else is shown the defaults an administrator chose, or the built-in defaults when none were chosen. Personal layouts saved earlier are kept and reappear if this is turned back off."},"api_async_import":{"type":"boolean","description":"When enabled, all API based imports and reimports will be processed asynchronously in the background after parsing the submitted report for errors. Query the test ID returned in the response for the 'processing' field to monitor the status of the process"},"ui_async_import":{"type":"boolean","description":"When enabled, all UI based imports and reimports will be processed asynchronously in the background after parsing the submitted report for errors."},"default_group":{"type":"integer","nullable":true,"description":"Dojo_Group ID that newly-created users will be auto-assigned to."},"default_group_role":{"type":"integer","nullable":true,"description":"Role ID applied when newly-created users are auto-assigned to the default group."},"default_group_email_pattern":{"type":"string","description":"Regex pattern matched against a new user's email; the default group is only assigned when the email matches. Empty string disables the pattern check.","maxLength":200},"ui_color_theme":{"description":"Instance-wide theme for the Vue UI. A partial object; every key is optional. 'preset' is 'brand' or 'legacy'. 'primary' is a 6-digit hex color. The metric groups 'severity', 'risk', 'grade' and 'cvss' map their token names to hex colors. The scheme groups 'neutral', 'surfaces', 'text', 'components' and 'status' map 'light' and/or 'dark' to an object of token names and hex colors. Text colors stored alongside a surface color must reach a 4.5:1 contrast ratio. An empty object restores the default colors."},"pci_entity_type":{"enum":["unspecified","merchant","service_provider","both"],"type":"string","x-spec-enum-id":"f82730b58cc957a2","description":"How this instance's organization is assessed under PCI DSS: merchant, service provider, both, or unspecified. Service providers confirm scope and test segmentation every six months rather than annually, so several PCI cadence checks read this.\n\n* `unspecified` - Unspecified\n* `merchant` - Merchant\n* `service_provider` - Service provider\n* `both` - Both merchant and service provider"},"enable_deduplication":{"type":"boolean","title":"Deduplicate findings","description":"With this setting turned on, DefectDojo deduplicates findings by comparing endpoints, cwe fields, and titles. If two findings share a URL and have the same CWE or title, DefectDojo marks the recent finding as a duplicate. When deduplication is enabled, a list of deduplicated findings is added to the engagement view."},"delete_duplicates":{"type":"boolean","description":"Requires next setting: maximum number of duplicates to retain."},"max_dupes":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Max Duplicates","description":"When enabled, if a single issue reaches the maximum number of duplicates, the oldest will be deleted. Duplicate will not be deleted when left empty. A value of 0 will remove all duplicates."},"email_from":{"type":"string","maxLength":200},"enable_jira":{"type":"boolean","title":"Enable JIRA integration"},"enable_jira_web_hook":{"type":"boolean","description":"Please note: It is strongly recommended to use a secret below and / or IP whitelist the JIRA server using a proxy such as Nginx."},"disable_jira_webhook_secret":{"type":"boolean","title":"Disable web hook secret","description":"Allows incoming requests without a secret (discouraged legacy behaviour)"},"jira_webhook_secret":{"type":"string","nullable":true,"minLength":1,"title":"JIRA Webhook URL","description":"Secret needed in URL for incoming JIRA Webhook","maxLength":64},"jira_minimum_severity":{"enum":["Critical","High","Medium","Low","Info","",null],"type":"string","description":"* `Critical` - Critical\n* `High` - High\n* `Medium` - Medium\n* `Low` - Low\n* `Info` - Info","x-spec-enum-id":"fc5d16a20ed06136","nullable":true},"jira_labels":{"type":"string","nullable":true,"description":"JIRA issue labels space seperated","maxLength":200},"add_vulnerability_id_to_jira_label":{"type":"boolean","title":"Add vulnerability Id as a JIRA label"},"enable_github":{"type":"boolean","title":"Enable GITHUB integration"},"enable_slack_notifications":{"type":"boolean"},"slack_channel":{"type":"string","description":"Optional. Needed if you want to send global notifications.","maxLength":100},"slack_token":{"type":"string","description":"Token required for interacting with Slack. Get one at https://api.slack.com/tokens","maxLength":100},"slack_username":{"type":"string","description":"Optional. Will take your bot name otherwise.","maxLength":100},"enable_msteams_notifications":{"type":"boolean","title":"Enable Microsoft Teams notifications"},"msteams_url":{"type":"string","description":"The full URL of the incoming webhook","maxLength":400},"enable_mail_notifications":{"type":"boolean"},"mail_notifications_to":{"type":"string","maxLength":200},"enable_webhooks_notifications":{"type":"boolean","title":"Enable Webhook notifications"},"webhooks_notifications_timeout":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"How many seconds will DefectDojo waits for response from webhook endpoint"},"enforce_verified_status":{"type":"boolean","title":"Enforce Verified Status - Globally","description":"When enabled, features such as product grading, jira integration, metrics, and reports will only interact with verified findings. This setting will override individually scoped verified toggles."},"enforce_verified_status_jira":{"type":"boolean","title":"Enforce Verified Status - Jira","description":"When enabled, findings must have a verified status to be pushed to jira."},"enforce_verified_status_product_grading":{"type":"boolean","title":"Enforce Verified Status - Product Grading","description":"When enabled, findings must have a verified status to be considered as part of a product's grading."},"enforce_verified_status_metrics":{"type":"boolean","title":"Enforce Verified Status - Metrics","description":"When enabled, findings must have a verified status to be counted in metric calculations, be included in reports, and filters."},"false_positive_history":{"type":"boolean","description":"(EXPERIMENTAL) DefectDojo will automatically mark the finding as a false positive if an equal finding (according to its dedupe algorithm) has been previously marked as a false positive on the same product. ATTENTION: Although the deduplication algorithm is used to determine if a finding should be marked as a false positive, this feature will not work if deduplication is enabled since it doesn't make sense to use both."},"retroactive_false_positive_history":{"type":"boolean","description":"(EXPERIMENTAL) FP History will also retroactively mark/unmark all existing equal findings in the same product as a false positives. Only works if the False Positive History feature is also enabled."},"url_prefix":{"type":"string","description":"URL prefix if DefectDojo is installed in it's own virtual subdirectory.","maxLength":300},"team_name":{"type":"string","maxLength":100},"enable_product_grade":{"type":"boolean","title":"Enable Product Grading","description":"Displays a grade letter next to a product to show the overall health."},"product_grade_a":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade A","description":"Percentage score for an 'A' >="},"product_grade_b":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade B","description":"Percentage score for a 'B' >="},"product_grade_c":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade C","description":"Percentage score for a 'C' >="},"product_grade_d":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade D","description":"Percentage score for a 'D' >="},"product_grade_f":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Grade F","description":"Percentage score for an 'F' <="},"enable_product_tag_inheritance":{"type":"boolean","description":"Enables product tag inheritance globally for all products. Any tags added on a product will automatically be added to all Engagements, Tests, and Findings"},"enable_benchmark":{"type":"boolean","title":"Enable Benchmarks","description":"Enables Benchmarks such as the OWASP ASVS (Application Security Verification Standard)"},"enable_similar_findings":{"type":"boolean","description":"Enable the query of similar findings on the view finding page. This feature can involve potentially large queries and negatively impact performance"},"engagement_auto_close":{"type":"boolean","title":"Enable Engagement Auto-Close","description":"Closes an engagement after 3 days (default) past due date including last update."},"engagement_auto_close_days":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Closes an engagement after the specified number of days past due date including last update."},"enable_finding_sla":{"type":"boolean","title":"Enable Finding SLA's","description":"Enables Finding SLA's for time to remediate."},"enable_notify_sla_active":{"type":"boolean","title":"Enable Notify SLA's Breach for active Findings","description":"Enables Notify when time to remediate according to Finding SLA's is breached for active Findings."},"enable_notify_sla_active_verified":{"type":"boolean","title":"Enable Notify SLA's Breach for active, verified Findings","description":"Enables Notify when time to remediate according to Finding SLA's is breached for active, verified Findings."},"enable_notify_sla_jira_only":{"type":"boolean","title":"Enable Notify SLA's Breach only for Findings linked to JIRA","description":"Enables Notify when time to remediate according to Finding SLA's is breached for Findings that are linked to JIRA issues. Notification is disabled for Findings not linked to JIRA issues"},"enable_notify_sla_exponential_backoff":{"type":"boolean","title":"Enable an exponential backoff strategy for SLA breach notifications.","description":"Enable an exponential backoff strategy for SLA breach notifications, e.g. 1, 2, 4, 8, etc. Otherwise it alerts every day"},"allow_anonymous_survey_repsonse":{"type":"boolean","title":"Allow Anonymous Survey Responses","description":"Enable anyone with a link to the survey to answer a survey"},"disclaimer_notifications":{"type":"string","title":"Custom Disclaimer for Notifications","description":"Include this custom disclaimer on all notifications","maxLength":3000},"disclaimer_reports":{"type":"string","title":"Custom Disclaimer for Reports","description":"Include this custom disclaimer on generated reports","maxLength":5000},"disclaimer_reports_forced":{"type":"boolean","title":"Force to add disclaimer reports","description":"Disclaimer will be added to all reports even if user didn't selected 'Include disclaimer'."},"disclaimer_notes":{"type":"string","title":"Custom Disclaimer for Notes","description":"Include this custom disclaimer next to input form for notes","maxLength":3000},"risk_acceptance_form_default_days":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"Default expiry period for risk acceptance form."},"risk_acceptance_notify_before_expiration":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Risk acceptance expiration heads up days","description":"Notify X days before risk acceptance expires. Leave empty to disable."},"enable_questionnaires":{"type":"boolean","description":"With this setting turned off, questionnaires will be disabled in the user interface."},"enable_checklists":{"type":"boolean","description":"With this setting turned off, checklists will be disabled in the user interface."},"enable_endpoint_metadata_import":{"type":"boolean","description":"With this setting turned off, endpoint metadata import will be disabled in the user interface."},"enable_user_profile_editable":{"type":"boolean","title":"Enable user profile for writing","description":"When turned on users can edit their profiles"},"enable_product_tracking_files":{"type":"boolean","description":"With this setting turned off, the product tracking files will be disabled in the user interface."},"enable_finding_groups":{"type":"boolean","description":"With this setting turned off, the Finding Groups will be disabled."},"enable_ui_table_based_searching":{"type":"boolean","title":"Enable UI Table Based Filtering/Sorting","description":"With this setting enabled, table headings will contain sort buttons for the current page of data in addition to sorting buttons that consider data from all pages."},"enable_calendar":{"type":"boolean","description":"With this setting turned off, the Calendar will be disabled in the user interface."},"enable_cvss3_display":{"type":"boolean","description":"With this setting turned off, CVSS3 fields will be hidden in the user interface."},"enable_cvss4_display":{"type":"boolean","description":"With this setting turned off, CVSS4 fields will be hidden in the user interface."},"minimum_password_length":{"type":"integer","maximum":48,"minimum":9,"description":"Requires user to set passwords greater than minimum length."},"maximum_password_length":{"type":"integer","maximum":48,"minimum":9,"description":"Requires user to set passwords less than maximum length."},"number_character_required":{"type":"boolean","title":"Password must contain one digit","description":"Requires user passwords to contain at least one digit (0-9)."},"special_character_required":{"type":"boolean","title":"Password must contain one special character","description":"Requires user passwords to contain at least one special character (()[]{}|\\`~!@#$%^&*_-+=;:'\",<>./?)."},"lowercase_character_required":{"type":"boolean","title":"Password must contain one lowercase letter","description":"Requires user passwords to contain at least one lowercase letter (a-z)."},"uppercase_character_required":{"type":"boolean","title":"Password must contain one uppercase letter","description":"Requires user passwords to contain at least one uppercase letter (A-Z)."},"non_common_password_required":{"type":"boolean","title":"Password must not be common","description":"Requires user passwords to not be part of list of common passwords."},"api_expose_error_details":{"type":"boolean","description":"When turned on, the API will expose error details in the response."},"filter_string_matching":{"type":"boolean","title":"Filter String Matching Optimization","description":"When turned on, all filter operations in the UI will require string matches rather than ID. This is a performance enhancement to avoid fetching objects unnecessarily."}}},"PatchedEnhancedUserRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"username":{"type":"string","minLength":1,"description":"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.","pattern":"^[\\w.@+-]+$","maxLength":150},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150},"email":{"type":"string","format":"email","minLength":1,"pattern":"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$"},"is_active":{"type":"boolean","title":"Active","description":"Designates whether this user should be treated as active. Unselect this instead of deleting accounts."},"is_staff":{"type":"boolean","title":"Staff status","description":"Designates whether the user can log into this admin site."},"is_superuser":{"type":"boolean","title":"Superuser status","description":"Designates that this user has all permissions without explicitly assigning them."},"password":{"type":"string","writeOnly":true,"minLength":1},"configuration_permissions":{"type":"array","items":{"type":"integer","nullable":true}}}},"PatchedExecPackScheduleRequest":{"type":"object","description":"One user's standing order for the executive posture pack.\n\nThe owner is stamped server-side (never client-supplied), and the cadence\nday fields are validated in the same pairs the model's check constraints\nenforce, so a bad payload fails with a readable message instead of an\nIntegrityError.","properties":{"name":{"type":"string","minLength":1,"description":"Display name, and the generated report's name prefix.","maxLength":100},"enabled":{"type":"boolean","description":"The unsubscribe switch. Disabled schedules are kept but never run."},"cadence":{"enum":["daily","weekly","monthly"],"type":"string","x-spec-enum-id":"4e3c483c900aad76","description":"How often the pack is generated.\n\n* `daily` - Daily\n* `weekly` - Weekly\n* `monthly` - Monthly"},"weekday":{"type":"integer","maximum":32767,"minimum":0,"nullable":true,"description":"0 (Monday) to 6 (Sunday). Required for the weekly cadence."},"day_of_month":{"type":"integer","maximum":32767,"minimum":0,"nullable":true,"description":"1 to 28, so every month qualifies. Required for the monthly cadence."},"hour_utc":{"type":"integer","maximum":32767,"minimum":0,"title":"Delivery Hour (UTC)","description":"The UTC hour the sweep generates and delivers the pack."},"window_days":{"type":"integer","maximum":32767,"minimum":0,"description":"How much history the pack summarizes."},"file_format":{"type":"string","minLength":1,"description":"The generated artifact format.","maxLength":10}}},"PatchedExtendedUserContactInfoRequest":{"type":"object","description":"Reject a language code the instance cannot serve.\n\nMix into any serializer that writes ``UserContactInfo.language``. Upstream\ndeclares the column without choices, so without this a typo is stored happily\nand then resolves to the instance default forever, which reads to the user as\n\"the setting did not save\".","properties":{"title":{"type":"string","nullable":true,"maxLength":150},"phone_number":{"description":"Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.","oneOf":[{"type":"string","pattern":"^\\+?1?\\d{9,15}$","maxLength":15},{"type":"string","maxLength":0}]},"cell_number":{"description":"Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.","oneOf":[{"type":"string","pattern":"^\\+?1?\\d{9,15}$","maxLength":15},{"type":"string","maxLength":0}]},"twitter_username":{"type":"string","nullable":true,"maxLength":150},"github_username":{"type":"string","nullable":true,"maxLength":150},"slack_username":{"type":"string","nullable":true,"title":"Slack Email Address","description":"Email address associated with your slack account","maxLength":150},"slack_user_id":{"type":"string","nullable":true,"maxLength":25},"block_execution":{"type":"boolean","description":"Instead of async deduping a finding the findings will be deduped synchronously and will 'block' the user until completion."},"deduplication_execution_mode":{"enum":["async","async_wait","sync","",null],"type":"string","x-spec-enum-id":"bf7fb8ff28520a46","nullable":true,"description":"Controls how import/reimport deduplication post-processing is executed. 'Async' dispatches it to the background and returns immediately (default). 'Async, wait for deduplication' dispatches to the background but waits for deduplication to finish before responding, so notifications and statistics reflect the deduplicated state. 'Synchronous' runs the import deduplication inline. Can be overridden per request. Independent of block_execution, which forces all async tasks (notifications, jira, ...) to the foreground.\n\n* `async` - Async (do not wait)\n* `async_wait` - Async, wait for deduplication\n* `sync` - Synchronous (block)"},"force_password_reset":{"type":"boolean","description":"Forces this user to reset their password on next login."},"token_last_reset":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of the most recent API token reset for this user."},"token_expiry":{"type":"string","format":"date-time","nullable":true,"description":"Explicit expiry for this user's API token. Overrides the instance-wide default from DD_API_TOKEN_DEFAULT_EXPIRY_DAYS. Leave empty to use that default. Once the effective expiry has passed the token is rejected at authentication."},"password_last_reset":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of the most recent password reset for this user."},"language":{"type":"string","description":"Preferred language for the DefectDojo UI. Leave blank to use the instance default.","maxLength":12},"user":{"type":"integer"}}},"PatchedFileNameRequest":{"type":"object","properties":{"file_name":{"type":"string","minLength":1}}},"PatchedFindingControlMapRequest":{"type":"object","description":"Base serializer for all models.","properties":{"finding":{"type":"integer","description":"The finding this mapping belongs to"},"control":{"type":"integer","description":"The mapped security control"},"confidence":{"type":"integer","maximum":32767,"minimum":0,"nullable":true,"description":"Confidence (0-100) for automated mappings; blank for manual ones"},"suppressed":{"type":"boolean","description":"Manual tombstone: automation must never re-create or re-enable this mapping"}}},"PatchedFindingNoteRequest":{"type":"object","properties":{"note_id":{"type":"integer"}}},"PatchedFindingTemplateRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":1000},"cwe":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"cvssv3":{"type":"string","nullable":true,"minLength":1,"title":"CVSS v3 vector","description":"Common Vulnerability Scoring System version 3 (CVSSv3) score associated with this finding.","maxLength":117},"cvssv3_score":{"type":"number","format":"double","nullable":true,"description":"CVSSv3 score"},"cvssv4":{"type":"string","nullable":true,"minLength":1,"title":"CVSS4 vector","description":"Common Vulnerability Scoring System version 4 (CVSS4) score associated with this finding.","maxLength":255},"cvssv4_score":{"type":"number","format":"double","nullable":true,"description":"CVSSv4 score"},"severity":{"type":"string","nullable":true,"maxLength":200},"description":{"type":"string","nullable":true},"mitigation":{"type":"string","nullable":true},"impact":{"type":"string","nullable":true},"references":{"type":"string","nullable":true},"fix_available":{"type":"boolean","nullable":true,"description":"Indicates if a fix is available for this vulnerability type"},"fix_version":{"type":"string","nullable":true,"description":"Version where fix is available","maxLength":100},"planned_remediation_version":{"type":"string","nullable":true,"description":"Target version for remediation","maxLength":99},"effort_for_fixing":{"type":"string","nullable":true,"description":"Effort estimate for fixing (e.g., Low/Medium/High)","maxLength":99},"steps_to_reproduce":{"type":"string","nullable":true,"description":"Standard reproduction steps for this vulnerability type"},"severity_justification":{"type":"string","nullable":true,"description":"Explanation of why this severity level is appropriate"},"component_name":{"type":"string","nullable":true,"description":"Affected component name (e.g., library name)","maxLength":500},"component_version":{"type":"string","nullable":true,"description":"Affected component version","maxLength":100},"notes":{"type":"string","nullable":true,"description":"Note content to add when applying this template"},"endpoints_text":{"type":"string","nullable":true,"description":"Endpoint URLs (one per line)"},"tags":{"type":"array","items":{"type":"string","minLength":1}}}},"PatchedFindingsRequest":{"type":"object","description":"Regression guard for Sentry DJANGO-D2P.\n\nDRF ``ModelSerializer.update()`` calls ``instance.<m2m>.set(new_list)`` for\nevery M2M field present in ``validated_data``, even when the new list is\nidentical to the current one. On tagulous ``TagField``s that triggers a\nfull teardown + re-add of the M2M, which runs SELECT + UPDATE ``count``\nbookkeeping per tag (N+1).\n\nThis mixin short-circuits the ``.set()`` call per ``TagListSerializerField``\nwhen the normalized incoming list equals ``instance.<attr>.get_tag_list()``.\nAll other M2M fields keep the stock DRF behavior.\n\nOpt in by adding ``SkipUnchangedTagsMixin`` to the base-class list of any\nserializer that exposes a ``TagListSerializerField`` for update.","properties":{"mitigated":{"type":"string","format":"date-time","nullable":true},"mitigated_by":{"type":"integer","nullable":true},"push_to_jira":{"type":"boolean","default":false},"found_by":{"type":"array","items":{"type":"integer"}},"vulnerability_ids":{"type":"array","items":{"$ref":"#/components/schemas/VulnerabilityIdRequest"}},"cwes":{"type":"array","items":{"$ref":"#/components/schemas/FindingCweRequest"}},"reporter":{"type":"integer"},"endpoints":{"type":"array","items":{"type":"integer"}},"priority":{"type":"number","format":"double","minimum":0,"nullable":true,"description":"The priority in which a finding should be considered for mitigation next"},"risk":{"enum":["Low","Medium","Needs Action","Urgent",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"The risk score in which a finding poses to the system it was discovered on\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"overridden_priority_risk_calculation":{"type":"boolean","default":false,"description":"Dictates whether this object has had its priority/risk calculation manually overridden. If true, the priority and risk values will not be automatically recalculated again until this setting is set to false."},"owners":{"type":"integer","nullable":true,"description":"The group of users responsible for this finding (Dojo_Group ID)."},"mitigation_policy":{"type":"integer","nullable":true,"description":"The standardized mitigation policy for this finding"},"vex_state":{"enum":["resolved","resolved_with_pedigree","exploitable","in_triage","false_positive","not_affected",null],"type":"string","x-spec-enum-id":"920cf602d3fa96ef","nullable":true,"description":"CycloneDX VEX analysis state — the exploitability verdict for this finding.\n\n* `resolved` - Resolved\n* `resolved_with_pedigree` - Resolved with Pedigree\n* `exploitable` - Exploitable\n* `in_triage` - In Triage\n* `false_positive` - False Positive\n* `not_affected` - Not Affected"},"vex_justification":{"enum":["code_not_present","code_not_reachable","requires_configuration","requires_dependency","requires_environment","protected_by_compiler","protected_at_runtime","protected_at_perimeter","protected_by_mitigating_control",null],"type":"string","x-spec-enum-id":"b2a6243bea66a552","nullable":true,"description":"CycloneDX VEX justification for why the finding does not affect the product; only meaningful when vex_state is 'not_affected'.\n\n* `code_not_present` - Code Not Present\n* `code_not_reachable` - Code Not Reachable\n* `requires_configuration` - Requires Configuration\n* `requires_dependency` - Requires Dependency\n* `requires_environment` - Requires Environment\n* `protected_by_compiler` - Protected by Compiler\n* `protected_at_runtime` - Protected at Runtime\n* `protected_at_perimeter` - Protected at Perimeter\n* `protected_by_mitigating_control` - Protected by Mitigating Control"},"vex_responses":{"type":"array","items":{"enum":["can_not_fix","will_not_fix","update","rollback","workaround_available"],"type":"string","description":"* `can_not_fix` - Can Not Fix\n* `will_not_fix` - Will Not Fix\n* `update` - Update\n* `rollback` - Rollback\n* `workaround_available` - Workaround Available","x-spec-enum-id":"42daaa5a4bd38bca"},"nullable":true,"description":"CycloneDX VEX responses — how the vendor intends to respond to the vulnerability."},"vex_detail":{"type":"string","nullable":true,"description":"Free-text elaboration on the VEX analysis, shared verbatim in VEX exports."},"exploit_maturity":{"enum":[0,10,20,30,null],"type":"integer","x-spec-enum-id":"01909932fa04343b","nullable":true,"description":"Exploit maturity (0 None / 10 PoC / 20 Weaponized / 30 Active in the wild). Editable for manual enrichment; the threat-intel sync overwrites it for findings that reference an enriched vulnerability id, so a hand-entered value is durable only on findings with no matching intel. Send null to clear it.\n\n* `0` - None\n* `10` - Proof-of-Concept\n* `20` - Weaponized\n* `30` - Active in the wild"},"reachability_override":{"enum":["reachable_runtime","reachable_static","potentially_reachable","unreachable","unknown",null],"type":"string","x-spec-enum-id":"eb84ddc6bfeee7ca","writeOnly":true,"nullable":true,"description":"Set a manual reachability verdict when no scanner supplies one. Recorded as a 'manual' verdict source; a stronger scanner verdict overrides it in the resolved value returned by the read-only 'reachability' field. Send null to clear the manual override.\n\n* `reachable_runtime` - Reachable (runtime)\n* `reachable_static` - Reachable (static)\n* `potentially_reachable` - Potentially reachable\n* `unreachable` - Unreachable\n* `unknown` - Unknown"},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"endpoints_to_add":{"type":"string","nullable":true,"minLength":1,"description":"A space deliminated list of endpoints that will be added to this Finding."},"recalculate_hash_code":{"type":"boolean","writeOnly":true,"default":false,"description":"When set to True, the hash code of the finding will be recalculated. This is flag is intended for power users. Please note, this may have an adverse effect on identifying duplicates through deduplication and reimport."},"title":{"type":"string","minLength":1,"description":"A short description of the flaw.","maxLength":511},"date":{"type":"string","format":"date","description":"The date the flaw was discovered."},"sla_start_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date used as start date for SLA calculation. Set by expiring risk acceptances. Empty by default, causing a fallback to 'date'."},"sla_expiration_date":{"type":"string","format":"date","nullable":true,"description":"(readonly)The date SLA expires for this finding. Empty by default, causing a fallback to 'date'."},"cwe":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"The CWE number associated with this flaw."},"epss_score":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS score for the CVE. Describes how likely it is the vulnerability will be exploited in the next 30 days."},"epss_percentile":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"nullable":true,"description":"EPSS percentile for the CVE. Describes how many CVEs are scored at or below this one."},"known_exploited":{"type":"boolean","description":"Whether this vulnerability is known to have been exploited in the wild."},"ransomware_used":{"type":"boolean","title":"Used in Ransomware","description":"Whether this vulnerability is known to have been leveraged as part of a ransomware campaign."},"kev_date":{"type":"string","format":"date","nullable":true,"title":"KEV Date Added","description":"The date the vulnerability was added to the KEV catalog."},"cvssv3":{"type":"string","nullable":true,"minLength":1,"title":"CVSS3 Vector","description":"Common Vulnerability Scoring System version 3 (CVSS3) score associated with this finding.","maxLength":117},"cvssv3_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"title":"CVSS3 Score","description":"Numerical CVSSv3 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"cvssv4":{"type":"string","nullable":true,"minLength":1,"title":"CVSS4 vector","description":"Common Vulnerability Scoring System version 4 (CVSS4) score associated with this finding.","maxLength":255},"cvssv4_score":{"type":"number","format":"double","maximum":10.0,"minimum":0.0,"nullable":true,"description":"Numerical CVSSv4 score for the vulnerability. If the vector is given, the score is updated while saving the finding. The value must be between 0-10."},"severity":{"type":"string","minLength":1,"description":"The severity level of this flaw (Critical, High, Medium, Low, Info).","maxLength":200},"description":{"type":"string","minLength":1,"description":"Longer more descriptive information about the flaw."},"mitigation":{"type":"string","nullable":true,"description":"Text describing how to best fix the flaw."},"fix_available":{"type":"boolean","nullable":true,"description":"Denotes if there is a fix available for this flaw."},"fix_version":{"type":"string","nullable":true,"description":"Version of the affected component in which the flaw is fixed.","maxLength":100},"impact":{"type":"string","nullable":true,"description":"Text describing the impact this flaw has on systems, products, enterprise, etc."},"steps_to_reproduce":{"type":"string","nullable":true,"description":"Text describing the steps that must be followed in order to reproduce the flaw / bug."},"severity_justification":{"type":"string","nullable":true,"description":"Text describing why a certain severity was associated with this flaw."},"references":{"type":"string","nullable":true,"description":"The external documentation available for this flaw."},"active":{"type":"boolean","description":"Denotes if this flaw is active or not."},"verified":{"type":"boolean","description":"Denotes if this flaw has been manually verified by the tester."},"false_p":{"type":"boolean","title":"False Positive","description":"Denotes if this flaw has been deemed a false positive by the tester."},"duplicate":{"type":"boolean","description":"Denotes if this flaw is a duplicate of other flaws reported."},"out_of_scope":{"type":"boolean","description":"Denotes if this flaw falls outside the scope of the test and/or engagement."},"risk_accepted":{"type":"boolean","description":"Denotes if this finding has been marked as an accepted risk."},"under_review":{"type":"boolean","description":"Denotes is this flaw is currently being reviewed."},"under_defect_review":{"type":"boolean","description":"Denotes if this finding is under defect review."},"is_mitigated":{"type":"boolean","description":"Denotes if this flaw has been fixed."},"numerical_severity":{"type":"string","minLength":1,"description":"The numerical representation of the severity (S0, S1, S2, S3, S4).","maxLength":4},"line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Line number","description":"Source line number of the attack vector."},"file_path":{"type":"string","nullable":true,"description":"Identified file(s) containing the flaw.","maxLength":4000},"component_name":{"type":"string","nullable":true,"description":"Name of the affected component (library name, part of a system, ...).","maxLength":500},"component_version":{"type":"string","nullable":true,"description":"Version of the affected component.","maxLength":100},"static_finding":{"type":"boolean","title":"Static finding (SAST)","description":"Flaw has been detected from a Static Application Security Testing tool (SAST)."},"dynamic_finding":{"type":"boolean","title":"Dynamic finding (DAST)","description":"Flaw has been detected from a Dynamic Application Security Testing tool (DAST)."},"unique_id_from_tool":{"type":"string","nullable":true,"description":"Vulnerability technical id from the source tool. Allows to track unique vulnerabilities over time across subsequent scans.","maxLength":500},"vuln_id_from_tool":{"type":"string","nullable":true,"title":"Vulnerability ID from tool","description":"Non-unique technical id from the source tool associated with the vulnerability type.","maxLength":500},"sast_source_object":{"type":"string","nullable":true,"description":"Source object (variable, function...) of the attack vector.","maxLength":500},"sast_sink_object":{"type":"string","nullable":true,"description":"Sink object (variable, function...) of the attack vector.","maxLength":500},"sast_source_line":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"SAST Source Line number","description":"Source line number of the attack vector."},"sast_source_file_path":{"type":"string","nullable":true,"description":"Source file path of the attack vector.","maxLength":4000},"nb_occurences":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of occurences","description":"Number of occurences in the source tool when several vulnerabilites were found and aggregated by the scanner."},"publish_date":{"type":"string","format":"date","nullable":true,"description":"Date when this vulnerability was made publicly available."},"service":{"type":"string","nullable":true,"description":"A service is a self-contained piece of functionality within a Product. This is an optional field which is used in deduplication of findings when set.","maxLength":200},"planned_remediation_date":{"type":"string","format":"date","nullable":true,"description":"The date the flaw is expected to be remediated."},"planned_remediation_version":{"type":"string","nullable":true,"description":"The target version when the vulnerability should be fixed / remediated","maxLength":99},"effort_for_fixing":{"type":"string","nullable":true,"description":"Effort for fixing / remediating the vulnerability (Low, Medium, High)","maxLength":99},"review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a review for this finding."},"defect_review_requested_by":{"type":"integer","nullable":true,"description":"Documents who requested a defect review for this flaw."},"reviewers":{"type":"array","items":{"type":"integer"},"description":"Documents who reviewed the flaw."},"tags":{"type":"array","items":{"type":"string","minLength":1}}}},"PatchedFrameworkPresetRequest":{"type":"object","properties":{"key":{"type":"string","minLength":1,"description":"Stable slug identifying the preset across instances, for example uk_cyber_essentials.","pattern":"^[a-z0-9][a-z0-9_]{1,63}$","maxLength":64},"name":{"type":"string","minLength":1,"description":"The display name of the preset.","maxLength":128},"framework":{"type":"string","minLength":1,"description":"The scheme or framework the preset encodes.","maxLength":128},"version":{"type":"string","minLength":1,"description":"The publication version of the scheme this preset paraphrases.","maxLength":128},"publisher":{"type":"string","description":"Who publishes the scheme.","maxLength":128},"source_url":{"description":"Where the published requirements live.","oneOf":[{"type":"string","format":"uri","maxLength":512},{"type":"string","maxLength":0}]},"summary":{"type":"string","description":"A short plain-language description of what the preset installs."},"definition":{"description":"The preset body: SLA configurations, cadence policies, a response policy and checks. Data only, validated against the vendored schema before it is stored."}}},"PatchedFullFindingGroupRequest":{"type":"object","properties":{"push_to_jira":{"type":"boolean","default":false},"push_to_connector":{"type":"boolean","default":false,"description":"Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"push_to_integrator":{"type":"boolean","default":false,"description":"Deprecated. Use push_to_connector instead. Dictates whether this object will be dispatched to the associated downstream connector, and override the configured setting that decides if the object should be pushed or not."},"name":{"type":"string","minLength":1,"maxLength":255},"test":{"type":"integer"},"findings":{"type":"array","items":{"type":"integer"}}}},"PatchedGlobalRoleRequest":{"type":"object","properties":{"user":{"type":"integer","nullable":true},"group":{"type":"integer","nullable":true},"role":{"type":"integer","nullable":true,"title":"Global role","description":"The global role will be applied to all product types and products."}}},"PatchedGraphRuleRetrieveRequest":{"type":"object","description":"A rule with its graph: the shape the editor loads, validates against, and saves.","properties":{"name":{"type":"string","minLength":1,"description":"The name for this rule. Must be unique","maxLength":255},"description":{"type":"string","description":"An optional description of what this rule does"},"enabled":{"type":"boolean","description":"Whether this rule runs. New rules start disabled, so enabling one is always deliberate"},"mode":{"enum":["simulate","live"],"type":"string","x-spec-enum-id":"0a770165ced54ec1","description":"Whether this rule's egress nodes actually send. Simulate records exactly what would be sent and sends nothing. One setting for the whole rule: a graph half of which reaches the outside world is harder to reason about than two rules\n\n* `simulate` - Simulate\n* `live` - Live"},"graph":{},"schedule":{"type":"object","additionalProperties":{},"writeOnly":true}}},"PatchedGuardrailCollectorRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"A label for this deployment, such as 'Engineering laptops'.","maxLength":200},"policy":{"type":"integer"}}},"PatchedGuardrailPolicyRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"A short name for the policy, shown on every event it decides.","maxLength":200},"description":{"type":"string","description":"What the policy is for and who it applies to."},"mode":{"enum":["enforce","monitor"],"type":"string","x-spec-enum-id":"c88e46cab5a83c1a","description":"Enforce blocks, redacts and asks as the rules say. Monitor lets every prompt and tool call through and records what the rules would have done, for trying a policy out before enforcing it.\n\n* `enforce` - Enforce\n* `monitor` - Monitor"},"record_excerpts":{"type":"boolean","description":"Keep a short excerpt of each prompt, command or file path on its event, with every match masked. When off, events record only who, when, which tool and what was decided."}}},"PatchedGuardrailRuleRequest":{"type":"object","properties":{"policy":{"type":"integer"},"name":{"type":"string","minLength":1,"description":"A short name for the rule, shown as what an event was flagged for.","maxLength":200},"enabled":{"type":"boolean","description":"Disabled rules are kept but never match."},"kind":{"enum":["detectors","pattern"],"type":"string","x-spec-enum-id":"76b4c41a51e7c53c","description":"Look for built-in kinds of personal data and secrets, or for a pattern you write.\n\n* `detectors` - Built-in detectors\n* `pattern` - Custom pattern"},"detectors":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"pattern":{"type":"string","description":"A regular expression, for a custom pattern rule. For example: git\\s+push\\s+.*(--force|-f\\b)"},"case_sensitive":{"type":"boolean","description":"Whether the custom pattern tells upper and lower case apart."},"targets":{"type":"array","items":{"type":"string","minLength":1,"maxLength":32}},"action":{"enum":["block","redact","ask","log"],"type":"string","x-spec-enum-id":"29340ad0614dcc48","description":"What happens on a match.\n\n* `block` - Block\n* `redact` - Redact\n* `ask` - Ask the developer\n* `log` - Log only"},"message":{"type":"string","description":"Shown to the developer, or to Claude, when the rule blocks or asks. Empty uses a standard message."}}},"PatchedHierarchyHealthSettingsRequest":{"type":"object","description":"The thresholds the checks use, which checks are off, and where the structure is kept flat on purpose.","properties":{"flat_org_min_assets":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Flat organization size"},"flat_org_max_parented_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Flat organization parented share"},"dimension_min_coverage_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Grouping coverage"},"dimension_min_values":{"type":"integer","maximum":32767,"minimum":0,"title":"Fewest groups"},"dimension_max_values":{"type":"integer","maximum":32767,"minimum":0,"title":"Most groups"},"placement_high_coverage_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Placement high confidence"},"stale_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Stale after days"},"stale_min_age_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Minimum age in days"},"sprawl_min_engagements":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Engagement sprawl"},"duplicate_min_jaccard_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Duplicate overlap"},"duplicate_min_shared_hashes":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Duplicate hashes"},"phone_apply_max_assets":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Phone apply limit"},"left_out_blocking_percent":{"type":"integer","maximum":100,"minimum":0,"title":"Left out limit"},"debounce_minutes":{"type":"integer","maximum":32767,"minimum":1},"disabled_checks":{"type":"array","items":{"type":"string","minLength":1,"maxLength":16},"description":"Keys of the checks to turn off, such as h1."},"flat_structure_instance":{"type":"boolean","title":"Flat structure on purpose"},"notify":{"type":"boolean","title":"Notify people about new suggestions"}}},"PatchedJIRAInstanceRequest":{"type":"object","properties":{"configuration_name":{"type":"string","minLength":1,"description":"Enter a name to give to this configuration","maxLength":2000},"url":{"type":"string","format":"uri","minLength":1,"title":"JIRA URL","description":"For more information how to configure Jira, read the DefectDojo documentation.","maxLength":2000},"username":{"type":"string","minLength":1,"title":"Username/Email","description":"Username or Email Address, see DefectDojo documentation for more information.","maxLength":2000},"password":{"type":"string","writeOnly":true,"minLength":1,"title":"Password/Token","description":"Password or API Token, see DefectDojo documentation for more information.","maxLength":2000},"default_issue_type":{"enum":["Task","Story","Epic","Spike","Bug","Security"],"type":"string","x-spec-enum-id":"5ded50425ca94b38","description":"You can define extra issue types in settings.py\n\n* `Task` - Task\n* `Story` - Story\n* `Epic` - Epic\n* `Spike` - Spike\n* `Bug` - Bug\n* `Security` - Security"},"issue_template_dir":{"type":"string","nullable":true,"description":"Choose the folder containing the Django templates used to render the JIRA issue description. These are stored in dojo/templates/issue-trackers. Leave empty to use the default jira_full templates.","maxLength":255},"epic_name_id":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"To obtain the 'Epic name id' visit https://<YOUR JIRA URL>/rest/api/2/field and search for Epic Name. Copy the number out of cf[number] and paste it here."},"open_status_key":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Reopen Transition ID","description":"Transition ID to Re-Open JIRA issues, visit https://<YOUR JIRA URL>/rest/api/latest/issue/<ANY VALID ISSUE KEY>/transitions?expand=transitions.fields to find the ID for your JIRA instance"},"close_status_key":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Close Transition ID","description":"Transition ID to Close JIRA issues, visit https://<YOUR JIRA URL>/rest/api/latest/issue/<ANY VALID ISSUE KEY>/transitions?expand=transitions.fields to find the ID for your JIRA instance"},"info_mapping_severity":{"type":"string","minLength":1,"description":"Maps to the 'Priority' field in Jira. For example: Info","maxLength":200},"low_mapping_severity":{"type":"string","minLength":1,"description":"Maps to the 'Priority' field in Jira. For example: Low","maxLength":200},"medium_mapping_severity":{"type":"string","minLength":1,"description":"Maps to the 'Priority' field in Jira. For example: Medium","maxLength":200},"high_mapping_severity":{"type":"string","minLength":1,"description":"Maps to the 'Priority' field in Jira. For example: High","maxLength":200},"critical_mapping_severity":{"type":"string","minLength":1,"description":"Maps to the 'Priority' field in Jira. For example: Critical","maxLength":200},"finding_text":{"type":"string","nullable":true,"description":"Additional text that will be added to the finding in Jira. For example including how the finding was created or who to contact for more information."},"accepted_mapping_resolution":{"type":"string","nullable":true,"title":"Risk Accepted resolution mapping","description":"JIRA issues that are closed in JIRA with one of these resolutions will result in the Finding becoming Risk Accepted in Defect Dojo. JIRA issues that are closed in JIRA with one of these resolutions will result in the Finding becoming Risk Accepted in Defect Dojo. The expiration time for this Risk Acceptance will be determined by the \"Risk acceptance form default days\" in \"System Settings\". This mapping is not used when Findings are pushed to JIRA. In that case the Risk Accepted Findings are closed in JIRA and JIRA sets the default resolution.","maxLength":300},"false_positive_mapping_resolution":{"type":"string","nullable":true,"title":"False Positive resolution mapping","description":"JIRA issues that are closed in JIRA with one of these resolutions will result in the Finding being marked as False Positive Defect Dojo. This mapping is not used when Findings are pushed to JIRA. In that case the Finding is closed in JIRA and JIRA sets the default resolution.","maxLength":300},"global_jira_sla_notification":{"type":"boolean","title":"Globally send SLA notifications as comment?","description":"This setting can be overidden at the Product level"},"finding_jira_sync":{"type":"boolean","title":"Automatically sync Findings with JIRA?","description":"If enabled, this will sync changes to a Finding automatically to JIRA"}}},"PatchedJIRAIssueRequest":{"type":"object","properties":{"jira_id":{"type":"string","minLength":1,"maxLength":200},"jira_key":{"type":"string","minLength":1,"maxLength":200},"jira_creation":{"type":"string","format":"date-time","nullable":true,"description":"The date a Jira issue was created from this finding."},"jira_change":{"type":"string","format":"date-time","nullable":true,"title":"Jira last update","description":"The date the linked Jira issue was last modified."},"jira_project":{"type":"integer","nullable":true},"finding":{"type":"integer","nullable":true},"engagement":{"type":"integer","nullable":true},"finding_group":{"type":"integer","nullable":true}}},"PatchedJIRAProjectRequest":{"type":"object","properties":{"project_key":{"type":"string","maxLength":200},"issue_template_dir":{"type":"string","nullable":true,"description":"Choose the folder containing the Django templates used to render the JIRA issue description. These are stored in dojo/templates/issue-trackers. Leave empty to use the default jira_full templates.","maxLength":255},"component":{"type":"string","maxLength":200},"custom_fields":{"nullable":true,"description":"JIRA custom field JSON mapping of Id to value, e.g. {\"customfield_10122\": [{\"name\": \"8.0.1\"}]}"},"close_transition_fields":{"nullable":true,"description":"JIRA fields to send as part of the Close transition, e.g. {\"resolution\": {\"name\": \"Won't Fix\"}, \"customfield_10200\": \"justification\"}. Use this when the JIRA workflow requires fields on the close transition screen. Fields not on the transition screen are rejected by JIRA."},"reopen_transition_fields":{"nullable":true,"description":"JIRA fields to send as part of the Reopen transition, e.g. {\"customfield_10201\": \"reopened by DefectDojo\"}. Fields not on the transition screen are rejected by JIRA."},"default_assignee":{"type":"string","nullable":true,"description":"JIRA default assignee (name). If left blank then it defaults to whatever is configured in JIRA.","maxLength":200},"jira_labels":{"type":"string","nullable":true,"description":"JIRA issue labels space seperated","maxLength":200},"add_vulnerability_id_to_jira_label":{"type":"boolean","title":"Add vulnerability Id as a JIRA label"},"push_all_issues":{"type":"boolean","description":"Automatically create JIRA tickets for verified findings, assuming enforce_verified_status is True, or for all findings otherwise. Once linked, the JIRA ticket will continue to sync, regardless of status in DefectDojo."},"enable_engagement_epic_mapping":{"type":"boolean"},"epic_issue_type_name":{"type":"string","description":"The name of the of structure that represents an Epic","maxLength":64},"push_notes":{"type":"boolean"},"product_jira_sla_notification":{"type":"boolean","title":"Send SLA notifications as comment?"},"risk_acceptance_expiration_notification":{"type":"boolean","title":"Send Risk Acceptance expiration notifications as comment?"},"enabled":{"type":"boolean","title":"Enable Connection With Jira Project","description":"When disabled, Findings will no longer be pushed to Jira, even if they have already been pushed previously."},"jira_instance":{"type":"integer","nullable":true},"product":{"type":"integer","nullable":true},"engagement":{"type":"integer","nullable":true}}},"PatchedLanguageRequest":{"type":"object","properties":{"files":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of files"},"blank":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of blank lines"},"comment":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of comment lines"},"code":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Number of code lines"},"language":{"type":"integer"},"product":{"type":"integer"},"user":{"type":"integer","nullable":true}}},"PatchedLanguageTypeRequest":{"type":"object","properties":{"language":{"type":"string","minLength":1,"maxLength":100},"color":{"type":"string","nullable":true,"title":"HTML color","maxLength":7}}},"PatchedLicenseManagerRequest":{"type":"object","properties":{"remind_on":{"type":"string","format":"date","nullable":true,"title":"Scheduled Reminder Date","description":"The reminder will occur on the set date"},"enable_reminders":{"type":"boolean","title":"Enable Popup Reminders","description":"When enabled, a popup message will appear as a reminder that the license will expire shortly"},"license_contents":{"type":"string","writeOnly":true},"monthly_spend_limit_cents":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"title":"Monthly Spend Limit (cents)","description":"Pay-as-you-go only. Stop accepting new findings once this month's charges reach this amount. Leave empty to use the limit set in the cloud portal."}}},"PatchedLocationFindingReferenceRequest":{"type":"object","description":"Serializer for the LocationFindingReference model with serializers for the related objects.","properties":{"relationship":{"enum":["owned_by","used_by",""],"type":"string","x-spec-enum-id":"8c638fc6583828e5","description":"The relationship between two locations\n\n* `owned_by` - is owned by\n* `used_by` - is used by"},"relationship_data":{"description":"Any extra data about this relationship"},"status":{"enum":["Active","Mitigated","FalsePositive","RiskAccepted","OutOfScope"],"type":"string","x-spec-enum-id":"918ee82ac8d9cac7","description":"The status of the the given Location\n\n* `Active` - Active\n* `Mitigated` - Mitigated\n* `FalsePositive` - False Positive\n* `RiskAccepted` - Risk Accepted\n* `OutOfScope` - Out Of Scope"},"location":{"type":"integer"},"finding":{"type":"integer"},"auditor":{"type":"integer","nullable":true,"description":"The user who audited the location"}}},"PatchedLocationProductReferenceRequest":{"type":"object","description":"Serializer for the LocationProductReference model with serializers for the related objects.","properties":{"relationship":{"enum":["owned_by","used_by",""],"type":"string","x-spec-enum-id":"8c638fc6583828e5","description":"The relationship between two locations\n\n* `owned_by` - is owned by\n* `used_by` - is used by"},"relationship_data":{"description":"Any extra data about this relationship"},"status":{"enum":["Active","Mitigated"],"type":"string","x-spec-enum-id":"bcfb073a62b96b70","description":"The status of the the given Location\n\n* `Active` - Active\n* `Mitigated` - Mitigated"},"location":{"type":"integer"},"product":{"type":"integer"}}},"PatchedLoginBannerRequest":{"type":"object","properties":{"banner_enable":{"type":"boolean"},"banner_message":{"type":"string","default":"","maxLength":500}}},"PatchedMappingSubtypeFiltersRequest":{"type":"object","description":"Per-subtype filter overrides. The criteria dict is flat (no stage key) -- subtype\nfilters only apply at sync, merged over ConnectorConfig.filters['sync']. An empty dict\nclears all overrides for the subtype.","properties":{"test_type_name":{"type":"string","minLength":1,"description":"The test_type_name of the subtype whose filters to update."},"filters":{"description":"Flat criterion dict (e.g. {'severity': 'Critical'}). Empty dict clears overrides."}}},"PatchedMetaMainRequest":{"type":"object","properties":{"product":{"type":"integer","nullable":true},"finding":{"type":"integer","nullable":true},"metadata":{"type":"array","items":{"$ref":"#/components/schemas/MetadataRequest"}}}},"PatchedMetaRequest":{"type":"object","properties":{"product":{"type":"integer","nullable":true},"endpoint":{"type":"integer","nullable":true},"location":{"type":"integer","nullable":true},"location_product":{"type":"integer","nullable":true},"finding":{"type":"integer","nullable":true},"name":{"type":"string","minLength":1,"maxLength":120},"value":{"type":"string","minLength":1,"maxLength":300}}},"PatchedMitigationPolicyRequest":{"type":"object","description":"Base serializer for all models.","properties":{"title":{"type":"string","minLength":1,"description":"A brief description of the mitigation policy","maxLength":1024},"description":{"type":"string","minLength":1,"description":"The detailed description of the policy, including how to mitigate the finding and any stakeholders to inform"},"is_default":{"type":"boolean","description":"Whether this policy is the default policy for findings where no policy is specified"}}},"PatchedNetworkLocationsRequest":{"type":"object","properties":{"location":{"type":"string","minLength":1,"description":"Location of network testing: Examples: VPN, Internet or Internal.","maxLength":500}}},"PatchedNoteRequest":{"type":"object","properties":{"entry":{"type":"string","minLength":1},"private":{"type":"boolean","description":"Only you and superusers can see this note. It is also left out of reports and issue-tracker sync."},"edited":{"type":"boolean"}}},"PatchedNoteTypeRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"description":{"type":"string","minLength":1,"maxLength":200},"is_single":{"type":"boolean"},"is_active":{"type":"boolean"},"is_mandatory":{"type":"boolean"}}},"PatchedNotificationWebhooksRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Name of the incoming webhook","maxLength":100},"url":{"type":"string","format":"uri","minLength":1,"description":"The full URL of the incoming webhook","maxLength":200},"header_name":{"type":"string","nullable":true,"description":"Name of the header required for interacting with Webhook endpoint","maxLength":100},"header_value":{"type":"string","nullable":true,"description":"Content of the header required for interacting with Webhook endpoint","maxLength":100},"owner":{"type":"integer","nullable":true,"description":"Owner/receiver of notification, if empty processed as system notification"}}},"PatchedNotificationsRequest":{"type":"object","properties":{"product":{"type":"integer","nullable":true},"user":{"type":"integer","nullable":true},"product_type_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"product_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"engagement_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"test_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"scan_added":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"jira_update":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"upcoming_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"stale_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"auto_close_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"close_engagement":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"user_mentioned":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"code_review":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"review_requested":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"other":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"sla_breach":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"sla_breach_combined":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"risk_acceptance_expiration":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"template":{"type":"boolean","default":false},"scan_added_empty":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"digest":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["mail"]},"digest_frequency":{"enum":["Daily","Weekly - Monday","Weekly - Tuesday","Weekly - Wednesday","Weekly - Thursday","Weekly - Friday","Weekly - Saturday","Weekly - Sunday","Monthly - 1st","Monthly - 15th","",null],"type":"string","description":"* `Daily` - Daily\n* `Weekly - Monday` - Weekly - Monday\n* `Weekly - Tuesday` - Weekly - Tuesday\n* `Weekly - Wednesday` - Weekly - Wednesday\n* `Weekly - Thursday` - Weekly - Thursday\n* `Weekly - Friday` - Weekly - Friday\n* `Weekly - Saturday` - Weekly - Saturday\n* `Weekly - Sunday` - Weekly - Sunday\n* `Monthly - 1st` - Monthly - 1st\n* `Monthly - 15th` - Monthly - 15th","x-spec-enum-id":"4b2def200351ec56","nullable":true},"finding_risk_accepted":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"connector_health_warning":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"remediation_action_due":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"ai_component_discovered":{"type":"array","items":{"enum":["slack","msteams","mail","webhooks","alert"],"type":"string","description":"* `slack` - slack\n* `msteams` - msteams\n* `mail` - mail\n* `webhooks` - webhooks\n* `alert` - alert","x-spec-enum-id":"1b984ac114f52c4c"},"default":["alert"]},"hierarchy_suggestions_ready":{"type":"array","items":{"enum":["mail","alert"],"type":"string","description":"* `mail` - mail\n* `alert` - alert","x-spec-enum-id":"3d949c97f674a35f"},"default":["alert"]},"review_requested_scope":{"enum":["all","selected"],"type":"string","description":"* `all` - All\n* `selected` - Selected","x-spec-enum-id":"0dc4c4c4241c5a40"},"review_requested_products":{"type":"array","items":{"type":"integer"}},"review_requested_product_types":{"type":"array","items":{"type":"integer"}}}},"PatchedObligationResultRequest":{"type":"object","description":"Base serializer for all models.","properties":{"assessment":{"type":"integer"},"control":{"type":"integer","title":"Obligation"},"status":{"enum":["satisfied","partially_satisfied","not_satisfied","not_applicable","unknown"],"type":"string","x-spec-enum-id":"5662d6e57f125b99","title":"Evidence Status","description":"Effective evidence state. This is an assessment aid, not a legal conclusion\n\n* `satisfied` - Satisfied\n* `partially_satisfied` - Partially satisfied\n* `not_satisfied` - Not satisfied\n* `not_applicable` - Not applicable\n* `unknown` - Unknown"},"narrative":{"type":"string","description":"Assessor narrative for this obligation"},"manual_override":{"type":"boolean","description":"Whether a human-set status takes precedence over recomputation"},"override_reason":{"type":"string"}}},"PatchedPOAMItemRequest":{"type":"object","description":"Base serializer for all models.","properties":{"controls_overridden":{"type":"boolean","description":"When True, sync stops re-deriving the controls from finding mappings"},"status":{"enum":["open","closed"],"type":"string","x-spec-enum-id":"da18659620c74b54","default":"open","description":"Open items appear on the Open POA&M Items worksheet; closed on the Closed one\n\n* `open` - Open\n* `closed` - Closed"},"closure_reason":{"enum":["remediated","false_positive_approved","operational_requirement","no_longer_detected","manual","",null],"type":"string","x-spec-enum-id":"11bf00512578d41a","nullable":true,"description":"Why this item was closed\n\n* `remediated` - Remediated\n* `false_positive_approved` - False positive approved\n* `operational_requirement` - Operational requirement approved\n* `no_longer_detected` - No longer detected\n* `manual` - Closed manually"},"closed_date":{"type":"string","format":"date","nullable":true,"description":"The date this item was closed"},"weakness_name":{"type":"string","minLength":1,"description":"The template's Weakness Name column","maxLength":500},"weakness_description":{"type":"string","description":"The template's Weakness Description column"},"detector_source":{"type":"string","title":"Weakness Detector Source","description":"The scanner / assessment source that detected the weakness","maxLength":300},"source_identifier":{"type":"string","title":"Weakness Source Identifier","description":"The detector's identifier for the weakness (plugin/rule/check id)","maxLength":500},"asset_identifier_override":{"type":"string","description":"Overrides the asset list derived from linked findings at export time"},"point_of_contact":{"type":"string","description":"The template's Point of Contact column","maxLength":300},"resources_required":{"type":"string","description":"The template's Resources Required column"},"remediation_plan":{"type":"string","description":"The template's Remediation Plan column; milestones are folded in when rendering Excel"},"scheduled_completion_date":{"type":"string","format":"date","nullable":true,"description":"Frozen at creation from the finding's enforced SLA deadline, falling back to the detection date and risk rating when no SLA is enforced; the template says 'do not modify'"},"vendor_dependency":{"type":"boolean","description":"Whether remediation depends on a vendor fix"},"last_vendor_checkin":{"type":"string","format":"date","nullable":true,"title":"Last Vendor Check-in Date","description":"FedRAMP requires at least monthly vendor check-ins for vendor-dependent items"},"vendor_product_name":{"type":"string","title":"Vendor Dependent Product Name","description":"The vendor product remediation depends on","maxLength":300},"original_risk_rating":{"enum":["High","Moderate","Low"],"type":"string","x-spec-enum-id":"568f7c4ec987ae2a","description":"The initial risk rating on the FedRAMP High/Moderate/Low scale\n\n* `High` - High\n* `Moderate` - Moderate\n* `Low` - Low"},"adjusted_risk_rating":{"enum":["High","Moderate","Low","",null],"type":"string","x-spec-enum-id":"568f7c4ec987ae2a","nullable":true,"description":"The post-deviation risk rating, when a risk adjustment was approved\n\n* `High` - High\n* `Moderate` - Moderate\n* `Low` - Low"},"risk_adjustment":{"enum":["no","pending","yes"],"type":"string","x-spec-enum-id":"734f80480dbe23d6","description":"Risk Adjustment deviation state (No/Pending/Yes)\n\n* `no` - No\n* `pending` - Pending\n* `yes` - Yes"},"false_positive":{"enum":["no","pending","yes"],"type":"string","x-spec-enum-id":"734f80480dbe23d6","description":"False Positive deviation state (No/Pending/Yes)\n\n* `no` - No\n* `pending` - Pending\n* `yes` - Yes"},"operational_requirement":{"enum":["no","pending","yes"],"type":"string","x-spec-enum-id":"734f80480dbe23d6","description":"Operational Requirement deviation state (No/Pending/Yes)\n\n* `no` - No\n* `pending` - Pending\n* `yes` - Yes"},"deviation_rationale":{"type":"string","description":"Rationale for any deviation, including mitigating factors and exposure"},"comments":{"type":"string","description":"The template's Comments column"},"product":{"type":"integer","description":"The product (system) this POA&M item belongs to"},"findings":{"type":"array","items":{"type":"integer"},"description":"The findings evidencing this weakness across assets"},"controls":{"type":"array","items":{"type":"integer"},"description":"The affected security controls (the template's Controls column)"},"supporting_documents":{"type":"array","items":{"type":"integer","title":"Supporting Documents"},"description":"Evidence and deviation-request documents for this item"}}},"PatchedPOAMMilestoneRequest":{"type":"object","description":"Base serializer for all models.","properties":{"item":{"type":"integer","title":"POA&M Item","description":"The POA&M item this milestone belongs to"},"description":{"type":"string","minLength":1,"description":"What this milestone accomplishes"},"scheduled_date":{"type":"string","format":"date","description":"When this milestone is planned to complete"},"completed_date":{"type":"string","format":"date","nullable":true,"description":"When this milestone actually completed"},"order":{"type":"integer","maximum":2147483647,"minimum":0,"description":"Display order within the item"}}},"PatchedPageLayoutRequest":{"type":"object","properties":{"page_key":{"type":"string","minLength":1,"title":"Page","description":"The View page this layout applies to: organization, asset, engagement, test, or finding.","maxLength":32},"name":{"type":"string","minLength":1,"maxLength":100},"is_shared":{"type":"boolean","title":"Shared","description":"If true, this layout is published as a template available to every user."},"layout":{"description":"Map of widget id -> grid position {x, y, w, h, min_w, min_h}."},"widgets":{"description":"Ordered list of widget configurations (type, title, config)."},"settings":{"description":"Layout-level options. Reserved: carries nothing today."}}},"PatchedPrioritizationEngineRequest":{"type":"object","description":"Base serializer for all models.","properties":{"name":{"type":"string","minLength":1,"maxLength":512},"description":{"type":"string","nullable":true},"finding_severity_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of severity."},"finding_external_score_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of external scoring mechanisms."},"finding_endpoints_ratio_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the ratio of endpoints on a finding compared to endpoints on product."},"product_business_criticality_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of business criticality."},"product_user_records_ratio_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the ratio of user records on the product relative to the total user records for the product type."},"product_revenue_ratio_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the ratio of product revenue relative to the total revenue for the product type."},"product_external_audience_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust how having an external audience impacts the product."},"product_internet_accessible_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust how internet accessibility impacts the product."},"finding_reachability_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of the finding's reachability verdict."},"finding_correlation_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of the blast radius of the finding's root cause."},"low_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Low risk findings."},"medium_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Medium risk findings."},"needs_action_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Needs Action risk findings."},"urgent_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Urgent risk findings."},"actively_exploited_risk_floor":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Minimum Risk band for findings whose threat intelligence reports active exploitation in the wild. Leave empty to apply no floor.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"reachable_risk_floor":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Minimum Risk band for findings whose vulnerable code is confirmed reachable (observed at runtime, or a static call path from an entry point). Leave empty to apply no floor.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"unreachable_risk_ceiling":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Maximum Risk band for findings a source reports as unreachable, applied only when that verdict meets the minimum confidence below. Never closes or hides a finding — it only caps where it sorts. Leave empty to apply no ceiling.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"unreachable_ceiling_min_confidence":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"title":"Unreachable Ceiling Minimum Confidence","description":"Only cap a finding's Risk band when the unreachable verdict's confidence is at least this value. Capping on a low-confidence verdict is how a live Critical gets buried, so the ceiling is deliberately confidence-gated."},"finding_deployment_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of whether the finding is deployed in production."},"exposed_risk_floor":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Minimum Risk band for findings on assets that are reachable from the internet (fully or partially exposed). Leave empty to apply no floor.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"internal_only_risk_ceiling":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"title":"Isolated Risk Ceiling","description":"Maximum Risk band for findings on assets reported as isolated, applied only when that verdict meets the minimum confidence below. Never closes or hides a finding — it only caps where it sorts. Leave empty to apply no ceiling.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"internal_only_ceiling_min_confidence":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"title":"Isolated Ceiling Minimum Confidence","description":"Only cap a finding's Risk band when the isolation verdict's confidence is at least this value. A user's own exposure override is not confidence-gated — a person asserting isolation is the strongest statement available."}}},"PatchedProOpenSurveyRequest":{"type":"object","description":"Serializer for a ProOpenSurvey (General_Survey model).","properties":{"expiration":{"type":"string","format":"date-time"},"survey":{"type":"integer"}}},"PatchedProQuestionRequest":{"type":"object","description":"Polymorphic serializer for a Question. Determines the correct subclass serializer to use and uses it.","properties":{"type":{"type":"string","minLength":1,"description":"Type of question, e.g., 'text' or 'choice'"}}},"PatchedProReportBlockRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"block_type":{"enum":["tabular","detail","chart","stock","widget"],"type":"string","description":"* `tabular` - Tabular\n* `detail` - Detail\n* `chart` - Chart\n* `stock` - Stock\n* `widget` - Widget","x-spec-enum-id":"0cc06c78cd06dfb3"},"header":{"type":"string","nullable":true,"maxLength":255},"description":{"type":"string","nullable":true},"tabular_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockTabularConfigurationRequest"}],"nullable":true},"detail_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockDetailConfigurationRequest"}],"nullable":true},"chart_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockChartConfigurationRequest"}],"nullable":true},"stock_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockStockConfigurationRequest"}],"nullable":true},"widget_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockWidgetConfigurationRequest"}],"nullable":true},"filter_entries":{"type":"array","items":{"$ref":"#/components/schemas/ProReportBlockFilterEntryRequest"}}}},"PatchedProReportScheduleRequest":{"type":"object","description":"A standing report request: template + format + filters, and the cadence it runs on.\n\nThe cadence is a nested ``schedule`` object: written as the same body the generic\n``/schedule`` sub-routes take (``trigger_expression`` cron, optional ``enabled``,\n``name``), read back as the full ``SchedulingServiceSchedule`` representation\n(``next_run``, ``last_run``, ``status``, ``trigger_expression_readable``).","properties":{"name":{"type":"string","description":"Label carried onto every report this schedule generates. Blank falls back to the template name.","maxLength":255},"template_id":{"type":"integer","writeOnly":true},"file_format":{"enum":["pdf","html","csv","xlsx","json"],"type":"string","description":"* `pdf` - PDF\n* `html` - HTML\n* `csv` - CSV\n* `xlsx` - Excel\n* `json` - JSON","x-spec-enum-id":"d56a1997f5638847"},"runtime_filters":{},"variables":{},"schedule":{"type":"object","additionalProperties":{},"writeOnly":true}}},"PatchedProReportTemplateRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"default":""},"template_blocks_write":{"type":"array","items":{"$ref":"#/components/schemas/ProReportTemplateBlockWriteRequest"},"writeOnly":true,"title":"Template Blocks"},"theme_id":{"type":"integer","writeOnly":true,"nullable":true,"title":"Theme"}}},"PatchedProReportThemeRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"primary_color":{"type":"string","minLength":1,"maxLength":7},"secondary_color":{"type":"string","minLength":1,"maxLength":7},"accent_color":{"type":"string","minLength":1,"maxLength":7},"text_color":{"type":"string","minLength":1,"maxLength":7},"background_color":{"type":"string","minLength":1,"maxLength":7},"base_font_size":{"type":"integer","maximum":16,"minimum":8,"description":"Body font size of generated reports, in pixels."},"footer_text":{"type":"string","nullable":true},"show_page_numbers":{"type":"boolean"}}},"PatchedProSurveyRequest":{"type":"object","description":"Serializer for a ProSurvey (Engagement_Survey model).","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","minLength":1},"active":{"type":"boolean"},"questions":{"type":"array","items":{"type":"integer"}}}},"PatchedProductAPIScanConfigurationRequest":{"type":"object","description":"Enforce ``view_tool_configuration`` on ``tool_configuration`` writes.\n\nSelecting a ``tool_configuration`` lets an import run authenticated requests\nwith the credential stored on it, so it is gated by the same\n``view_tool_configuration`` permission that guards the tool-configuration\nviews, not just the object permission these endpoints already check.\n\nMix this into *every* serializer exposing the field, including alias\nserializers over the same model, so the rule holds wherever the field is\nreachable.\n\nThe check hangs off ``run_validation`` rather than ``validate`` on purpose: a\nsubclass that defines its own ``validate`` would otherwise shadow the mixin's\nand silently drop the guard.\n\nNo-ops when the field is absent (replay-safe on PATCH), mirroring\ndojo.authorization.api_permissions.check_update_permission.","properties":{"service_key_1":{"type":"string","nullable":true,"maxLength":200},"service_key_2":{"type":"string","nullable":true,"maxLength":200},"service_key_3":{"type":"string","nullable":true,"maxLength":200},"product":{"type":"integer"},"tool_configuration":{"type":"integer"}}},"PatchedProductLifecycleRequest":{"type":"object","properties":{"value":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","maxLength":50},"name":{"type":"string","minLength":1,"description":"Label shown in dropdowns and on the asset.","maxLength":200},"icon":{"type":"string","description":"Optional Font Awesome icon class (classic UI only).","maxLength":100},"display_order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Optional ordering for the dropdown (lower first)."}}},"PatchedProductOriginRequest":{"type":"object","properties":{"value":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","maxLength":50},"name":{"type":"string","minLength":1,"description":"Label shown in dropdowns and on the asset.","maxLength":200},"icon":{"type":"string","description":"Optional Font Awesome icon class (classic UI only).","maxLength":100},"display_order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Optional ordering for the dropdown (lower first)."}}},"PatchedProductPlatformRequest":{"type":"object","properties":{"value":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","maxLength":50},"name":{"type":"string","minLength":1,"description":"Label shown in dropdowns and on the asset.","maxLength":200},"icon":{"type":"string","description":"Optional Font Awesome icon class (classic UI only).","maxLength":100},"display_order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Optional ordering for the dropdown (lower first)."}}},"PatchedProductsRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"business_criticality":{"enum":["very high","high","medium","low","very low","none","",null],"type":"string","description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","x-spec-enum-id":"ef412461eb271471","nullable":true},"platform":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"lifecycle":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"origin":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"parent":{"type":"integer","nullable":true},"prioritization_engine":{"type":"integer","nullable":true},"asset_type":{"type":"string","minLength":1,"description":"Stable lookup key, e.g. 'repository'. Referenced by connectors and imports.","nullable":true},"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","minLength":1,"maxLength":4000},"prod_numeric_grade":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"user_records":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"Estimate the number of user records within the application."},"revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Estimate the application's revenue."},"external_audience":{"type":"boolean","description":"Specify if the application is used by people outside the organization."},"internet_accessible":{"type":"boolean","description":"Specify if the application is accessible from the public internet."},"enable_product_tag_inheritance":{"type":"boolean","description":"Enables product tag inheritance. Any tags added on a product will automatically be added to all Engagements, Tests, and Findings"},"enable_simple_risk_acceptance":{"type":"boolean","description":"Allows simple risk acceptance by checking/unchecking a checkbox."},"enable_full_risk_acceptance":{"type":"boolean","description":"Allows full risk acceptance using a risk acceptance form, expiration date, uploaded proof, etc."},"disable_sla_breach_notifications":{"type":"boolean","description":"Disable SLA breach notifications if configured in the global settings"},"product_manager":{"type":"integer","nullable":true},"technical_contact":{"type":"integer","nullable":true},"team_manager":{"type":"integer","nullable":true},"prod_type":{"type":"integer"},"sla_configuration":{"type":"integer"},"regulations":{"type":"array","items":{"type":"integer"}},"tags":{"type":"array","items":{"type":"string","minLength":1}}}},"PatchedPsirtAdvisoryCommentRequest":{"type":"object","properties":{"advisory":{"type":"integer"},"section":{"type":"string","description":"Which part of the advisory the note is about, e.g. summary / impact","maxLength":50},"body":{"type":"string","minLength":1},"kind":{"enum":["approval","question","blocking_rejection"],"type":"string","description":"* `approval` - Approval Note\n* `question` - Question\n* `blocking_rejection` - Blocking Rejection","x-spec-enum-id":"a12c23b8d766b4e7"},"state":{"enum":["unaddressed","addressed","resolved_by_revision"],"type":"string","description":"* `unaddressed` - Unaddressed\n* `addressed` - Addressed\n* `resolved_by_revision` - Resolved by Revision","x-spec-enum-id":"776cb7e2f046dff8"}}},"PatchedPsirtAdvisoryManualTargetRequest":{"type":"object","properties":{"advisory":{"type":"integer"},"product_type":{"type":"integer"},"product":{"type":"integer","nullable":true,"description":"Null targets the whole product type"},"source":{"enum":["auto","manual","excluded"],"type":"string","description":"* `auto` - Derived\n* `manual` - Added by Hand\n* `excluded` - Excluded by Hand","x-spec-enum-id":"8d02a220e0c06746"},"justification":{"type":"string"}}},"PatchedPsirtAdvisoryRequest":{"type":"object","description":"An advisory, its nested timeline, and everything a workbench needs to render it.","properties":{"advisory_id":{"type":"string","maxLength":100},"title":{"type":"string","minLength":1,"maxLength":500},"summary":{"type":"string"},"impact":{"type":"string"},"remediation":{"type":"string"},"external_ticket_id":{"type":"string","maxLength":100},"external_ticket_url":{"type":"string","maxLength":1000},"reception_date":{"type":"string","format":"date","nullable":true,"description":"When the underlying issue was first reported to us"},"disclosure_date":{"type":"string","format":"date","nullable":true,"description":"Planned or actual public disclosure date"},"disclosure_label":{"type":"string","description":"How the disclosure date is described publicly, e.g. 'Q3 2026'","maxLength":100},"feedback_deadline":{"type":"string","format":"date","nullable":true,"description":"Date by which recipients are asked to respond"},"issue_priority":{"type":"string","maxLength":20},"is_candidate":{"type":"boolean","description":"A draft the engine proposed, not yet adopted by a human"},"audit_state":{"enum":["pending","in_progress","undergoing_reanalysis","delayed"],"type":"string","description":"* `pending` - Pending\n* `in_progress` - In Progress\n* `undergoing_reanalysis` - Undergoing Reanalysis\n* `delayed` - Delayed","x-spec-enum-id":"2b8b0ea58a8a8981"},"embargoed_until":{"type":"string","format":"date-time","nullable":true,"description":"Publishing is refused before this moment, whatever the schedule says"},"author":{"type":"integer","nullable":true},"milestones":{"type":"array","items":{"$ref":"#/components/schemas/PsirtAdvisoryMilestoneRequest"}}}},"PatchedPsirtCaseAttachmentRequest":{"type":"object","properties":{"case":{"type":"integer"},"file":{"type":"string","format":"binary"},"filename":{"type":"string","minLength":1,"description":"The name the uploader gave it, kept for display","maxLength":500},"content_type":{"type":"string","maxLength":255},"size_bytes":{"type":"integer","maximum":9223372036854775807,"minimum":-9223372036854775808,"format":"int64","nullable":true},"description":{"type":"string"}}},"PatchedPsirtCaseRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"description":"What this case is about, in one line","maxLength":500},"disclosure_status":{"enum":["draft","embargoed","coordinated","public"],"type":"string","description":"* `draft` - Draft\n* `embargoed` - Embargoed\n* `coordinated` - Coordinated\n* `public` - Public","x-spec-enum-id":"078e06464495f1eb"},"disclosure_date":{"type":"string","format":"date-time","nullable":true,"description":"Planned or actual disclosure date"},"closed_at":{"type":"string","format":"date-time","nullable":true,"description":"When the case was concluded. Null = open"},"mitigation_priority":{"enum":["p0k_crisis","p1_high","p2_medium","p3_low","",null],"type":"string","x-spec-enum-id":"4cf17c56b9aa4d22","nullable":true,"description":"Response tier. Null until an analyst or the worthiness pass sets one\n\n* `p0k_crisis` - P0/K — Crisis\n* `p1_high` - P1 — High\n* `p2_medium` - P2 — Medium\n* `p3_low` - P3 — Low"},"mitigation_status":{"enum":["not_started","in_analysis","awaiting_vendor","fix_available","mitigated","accepted_risk","not_affected"],"type":"string","description":"* `not_started` - Not Started\n* `in_analysis` - In Analysis\n* `awaiting_vendor` - Awaiting Vendor\n* `fix_available` - Fix Available\n* `mitigated` - Mitigated\n* `accepted_risk` - Accepted Risk\n* `not_affected` - Not Affected","x-spec-enum-id":"b77278205bb2bf21"},"max_cvss":{"type":"number","format":"double","nullable":true},"max_epss":{"type":"number","format":"double","nullable":true},"max_pcrss":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"scores_overridden":{"type":"boolean","description":"True when a human set the scores. The roll-up leaves an overridden case alone"},"analysis_notes":{"type":"string","nullable":true},"analyst":{"type":"integer","nullable":true,"description":"Who owns this case"}}},"PatchedPsirtComponentProfileRequest":{"type":"object","description":"One (dependency, product) annotation, with the inventory it annotates.","properties":{"dependency":{"type":"integer","description":"The inventory row this profile annotates"},"product":{"type":"integer","description":"The product the annotation applies within; judgement is per-product"},"pcrss_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"Static component risk rating per PSIRT policy (1-5). Inherited by matches on this dependency unless an analyst overrides it on the match"},"cpe":{"type":"string","nullable":true,"description":"Analyst-supplied Common Platform Enumeration identifier. Dependency is purl-keyed and carries no CPE, yet CPE is the oracle's highest-precedence correlation axis","maxLength":500},"tags":{"type":"array","items":{"type":"string","maxLength":100}}}},"PatchedPsirtFeedPrefilterSubscriptionRequest":{"type":"object","description":"Which feeds a group applies to: one feed, or the global default row.","properties":{"group":{"type":"integer","description":"The pre-filter group being subscribed"},"feed_source":{"type":"integer","nullable":true,"description":"The feed this subscription applies to; null with is_default is the global row"},"opted_out":{"type":"boolean","description":"When true on a feed-scoped row, that feed opts out of the global default group without the default being deleted"},"is_default":{"type":"boolean","description":"True with feed_source null: the global row every feed inherits"}}},"PatchedPsirtFeedSourceRequest":{"type":"object","description":"List/detail/create/update serializer for feed sources.\n\nRead-side computed fields drive the Feeds page chips: ``health_state``\n(green/amber/red/gray/off), ``display_label``, ``has_credentials``,\n``has_current_acceptance`` (the re-acceptance banner keys on this), and\n``transport_available`` (a cleared FEAT-374 re-point whose connector has\nnot landed renders as \"coming soon\", not as broken).","properties":{"name":{"type":"string","minLength":1,"description":"Stable internal identifier used for vendor-keyed lookups and connector construction; rename the user-facing label via display_name instead","maxLength":255},"display_name":{"type":"string","nullable":true,"description":"User-editable display label; falls back to name when null. name remains the stable internal identifier","maxLength":255},"source_type":{"enum":["freshrss","cisa_api","euvd_api","nvd_api","direct_rss","csaf_github","ubuntu_security_api","exploitdb_gitlab","git_vulns"],"type":"string","x-spec-enum-id":"81077480c35ed8f5","description":"Connector protocol used to poll this source\n\n* `freshrss` - FreshRSS\n* `cisa_api` - CISA API\n* `euvd_api` - EUVD API\n* `nvd_api` - NVD API\n* `direct_rss` - Direct RSS\n* `csaf_github` - CSAF GitHub\n* `ubuntu_security_api` - Ubuntu Security API\n* `exploitdb_gitlab` - Exploit-DB GitLab\n* `git_vulns` - Kernel vulns.git"},"url":{"type":"string","minLength":1,"description":"Endpoint the connector polls; immutable on shipped catalog rows","maxLength":1000},"poll_interval_minutes":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Polling interval in minutes"},"poll_timeout_seconds":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"Per-feed envelope override for the poll timeout; null falls through to the global defense-in-depth ceiling. Known-slow feeds (e.g. very large RSS bodies) get this knob without further architectural change"},"auto_enrich":{"type":"boolean","description":"Automatically queue new items for enrichment after each poll"},"auto_detail_enhance":{"type":"boolean","description":"Automatically run detail-page enhancement on new items"},"auto_process":{"type":"boolean","description":"Auto relevance funnel: per-feed opt-in to automatic pre-filter and matching of new/changed items on poll. The analyst kill-switch for a noisy or expensive feed"},"prefilter_enabled":{"type":"boolean","description":"Whether pre-filtering is enabled for this feed"},"category":{"type":"integer","nullable":true,"description":"Category folder for sidebar organization"},"credentials":{"writeOnly":true},"config":{"description":"Non-secret connector settings as JSON; secrets belong in credentials"}}},"PatchedPsirtMatchRequest":{"type":"object","description":"One match, with enough provenance for an analyst to judge it.","properties":{"status":{"enum":["unconfirmed","confirmed","false_positive","exported"],"type":"string","x-spec-enum-id":"c216571c53815beb","description":"Analyst confirmation state of this match\n\n* `unconfirmed` - Unconfirmed\n* `confirmed` - Confirmed\n* `false_positive` - False Positive\n* `exported` - Exported"},"analyst_notes":{"type":"string","nullable":true,"description":"Free-form triage notes from the reviewing analyst"}}},"PatchedPsirtMatchRuleRequest":{"type":"object","description":"A rule, its conditions and actions, and the trust verdict on all of it.","properties":{"name":{"type":"string","minLength":1,"description":"Unique name for the rule","maxLength":255},"description":{"type":"string","nullable":true,"description":"Human-readable description of the rule","maxLength":1000},"group":{"type":"integer","nullable":true,"description":"Optional rule group for composite matching; null leaves the rule standalone"},"rule_type":{"enum":["keyword","regex","cpe","version_range"],"type":"string","description":"* `keyword` - Keyword\n* `regex` - Regex\n* `cpe` - CPE\n* `version_range` - Version Range","x-spec-enum-id":"1a7920df188b6d4f"},"pattern":{"type":"string","maxLength":1000},"component_field":{"type":"string","minLength":1,"description":"Dependency field the single-pattern form matches against (name, version, cpe, purl). PAE's 'vendor' has no Dependency column of its own — the purl namespace carries it","maxLength":50},"condition_logic":{"enum":["and","or"],"type":"string","x-spec-enum-id":"76e361de7090662e","description":"How the conditions within this rule combine\n\n* `and` - And\n* `or` - Or"},"target_mode":{"enum":["component","asset"],"type":"string","x-spec-enum-id":"16482f9f869263aa","description":"Whether the rule produces matches against dependencies ('component') or products ('asset'). Decides which of PsirtMatch.dependency / PsirtMatch.product is set\n\n* `component` - Dependency\n* `asset` - Product"},"priority":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Higher priority rules are applied first"},"enabled":{"type":"boolean","description":"Whether this rule is evaluated"},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtRuleConditionRequest"}},"actions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtRuleActionRequest"}}}},"PatchedPsirtMaterialChangePolicyRequest":{"type":"object","properties":{"severity_tier_changes_enabled":{"type":"boolean","description":"If true, severity moves within medium/high/critical are material, and so is an escalation into that set from below — a feed that supplies tiers but no CVSS score must not escalate to Critical in silence. Downgrades out of the set are not"},"cvss_v3_delta_threshold":{"type":"string","format":"decimal","pattern":"^-?\\d{0,2}(?:\\.\\d{0,1})?$"},"kev_add_enabled":{"type":"boolean","description":"If true, KEV listing add events are material"},"kev_remove_enabled":{"type":"boolean","description":"If true, KEV listing remove events are material. Default off"},"epss_high_boundary":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,3})?$"},"epss_transition_enabled":{"type":"boolean","description":"If true, EPSS scores crossing epss_high_boundary are material"},"affected_products_changes_enabled":{"type":"boolean","description":"If true, affected-products set add/remove is material"},"cve_changes_enabled":{"type":"boolean","title":"CVE Set Changes Enabled","description":"If true, a CVE joining or leaving an advisory is material. Default on: it is the plainest case of the facts moving under something already published"},"severity_floor":{"enum":["none","low","medium","high","critical"],"type":"string","description":"* `none` - none\n* `low` - low\n* `medium` - medium\n* `high` - high\n* `critical` - critical","x-spec-enum-id":"181ccb29c3e45def"}}},"PatchedPsirtPrefilterGroupRequest":{"type":"object","description":"A feed rule: its conditions, its actions, and where it applies.","properties":{"name":{"type":"string","minLength":1,"description":"Unique name for the pre-filter group","maxLength":255},"description":{"type":"string","nullable":true,"description":"Human-readable description of the group","maxLength":1000},"enabled":{"type":"boolean","description":"Whether this group is evaluated"},"match_logic":{"enum":["any","all"],"type":"string","x-spec-enum-id":"0a55c3153ef51701","description":"'any' (at least one condition matches) or 'all' (every condition matches)\n\n* `any` - Any\n* `all` - All"},"priority":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Evaluation order; lower number is evaluated first"},"fallthrough":{"type":"boolean","description":"Continue evaluating other groups after this one matches"},"weight":{"type":"number","format":"double","description":"Author trust multiplier on this group's score contribution; 1.0 is neutral"},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtPrefilterConditionRequest"}},"actions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtPrefilterActionRequest"}},"feed_scope":{"type":"integer","writeOnly":true,"nullable":true}}},"PatchedPsirtRecencyConfigRequest":{"type":"object","properties":{"window_days":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Persistent default recency window (days) for 'new' item counts"}}},"PatchedPsirtRuleGroupRequest":{"type":"object","description":"A group of rules and where it applies.","properties":{"name":{"type":"string","minLength":1,"description":"Unique name for the group","maxLength":255},"description":{"type":"string","nullable":true,"description":"Human-readable description of the group","maxLength":1000},"operator":{"enum":["and","or"],"type":"string","x-spec-enum-id":"76e361de7090662e","description":"Logical operator: 'and' (all rules must match) or 'or' (any rule can match)\n\n* `and` - And\n* `or` - Or"},"enabled":{"type":"boolean","description":"Whether this group is active"},"priority":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Higher priority groups are evaluated first"},"is_template":{"type":"boolean","description":"Templates are copy-only and never subscribed directly, so editing the shipped library cannot change what an existing subscription evaluates"},"is_default":{"type":"boolean","description":"Auto-applied as the global default subscription when a subscription row names neither a product type nor a product"}}},"PatchedPsirtRuleGroupSubscriptionRequest":{"type":"object","description":"Where a group applies. Exactly one of product / product_type, or a global default.","properties":{"group":{"type":"integer","description":"The rule group being subscribed"},"product":{"type":"integer","nullable":true,"description":"When set, the group applies to this product only. Mutually exclusive with product_type"},"product_type":{"type":"integer","nullable":true,"description":"When set, the group applies to every product of this type. Mutually exclusive with product"},"is_default":{"type":"boolean","description":"True with neither product_type nor product set: the global default applied to every product"},"opted_out":{"type":"boolean","description":"When true on a product-scoped row, that product opts out of an otherwise-applicable default subscription without the default being deleted"}}},"PatchedPsirtSlaClockDefinitionRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string"},"can_pause":{"type":"boolean","description":"Whether this clock may be paused. A publication clock generally may not — the date was promised to someone outside"},"allow_tier_upgrade_while_running":{"type":"boolean","description":"Whether a running clock may be re-tiered upward. Off by default: silently moving a deadline is how a breach disappears"},"enabled":{"type":"boolean"}}},"PatchedPsirtSlaPolicyRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"clock_definition":{"type":"integer","description":"The clock this policy parameterizes"},"tier":{"type":"string","minLength":1,"description":"Tier code the resolver returns, e.g. critical_exploited. Its vocabulary depends on the definition's tier resolver, not on the case priority codes","maxLength":50},"deadline_duration":{"type":"string","description":"Time allowed from arm to deadline"},"warning_threshold":{"type":"string","description":"How long before the deadline the clock starts warning"},"enabled":{"type":"boolean"}}},"PatchedPsirtWorthinessConfigRequest":{"type":"object","properties":{"w_specificity":{"type":"integer","maximum":100,"minimum":0,"title":"Specificity Weight","description":"Specificity weight in points; the four weights must sum to 100"},"w_prefilter":{"type":"integer","maximum":100,"minimum":0,"title":"Prefilter Weight","description":"Pre-filter weight in points; the four weights must sum to 100"},"w_severity":{"type":"integer","maximum":100,"minimum":0,"title":"Severity Weight","description":"Severity weight in points; the four weights must sum to 100"},"w_urgency":{"type":"integer","maximum":100,"minimum":0,"title":"Urgency Weight","description":"Urgency weight in points; the four weights must sum to 100"},"t_critical":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Critical Threshold","description":"Critical band lower bound; thresholds must be strictly ascending"},"t_high":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"High Threshold","description":"High band lower bound; thresholds must be strictly ascending"},"t_med":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Medium Threshold","description":"Medium band lower bound; thresholds must be strictly ascending"},"t_low_med":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Low-Medium Threshold","description":"Low-medium band lower bound; thresholds must be strictly ascending"}}},"PatchedPublicMappingSubtypeStatusRequest":{"type":"object","description":"User-facing variant -- restricts to GOOD and IGNORED (users shouldn't set MISSING).","properties":{"test_type_name":{"type":"string","minLength":1,"description":"The test_type_name of the subtype to update."},"status":{"enum":["GOOD","IGNORED"],"type":"string","x-spec-enum-id":"8f517a58d3bf4672","description":"The new status for this subtype. Only GOOD and IGNORED are user-settable.\n\n* `GOOD` - GOOD\n* `IGNORED` - IGNORED"}}},"PatchedRecordStatusRequest":{"type":"object","properties":{"state":{"enum":["GOOD","IGNORED"],"type":"string","description":"* `GOOD` - GOOD\n* `IGNORED` - IGNORED","x-spec-enum-id":"8f517a58d3bf4672"}}},"PatchedRegulationRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"The name of the regulation.","maxLength":128},"acronym":{"type":"string","minLength":1,"description":"A shortened representation of the name.","maxLength":20},"category":{"enum":["privacy","finance","education","medical","corporate","security","government","other"],"type":"string","x-spec-enum-id":"18b03e6cbd7d3e7d","description":"The subject of the regulation.\n\n* `privacy` - Privacy\n* `finance` - Finance\n* `education` - Education\n* `medical` - Medical\n* `corporate` - Corporate\n* `security` - Security\n* `government` - Government\n* `other` - Other"},"jurisdiction":{"type":"string","minLength":1,"description":"The territory over which the regulation applies.","maxLength":64},"description":{"type":"string","description":"Information about the regulation's purpose."},"reference":{"description":"An external URL for more information.","oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]}}},"PatchedRegulatoryAssessmentRequest":{"type":"object","description":"Base serializer for all models.","properties":{"product":{"type":"integer","nullable":true,"description":"The product whose evidence is being assessed, for a single-asset scope"},"catalog":{"type":"integer","title":"Regulatory Catalog","description":"The regulatory obligation catalog used by this assessment"},"period_start":{"type":"string","format":"date","description":"First date included in the evidence period"},"period_end":{"type":"string","format":"date","description":"Last date included in the evidence period"},"status":{"enum":["draft","in_review","final"],"type":"string","x-spec-enum-id":"6a2167955947f373","description":"Assessment workflow status\n\n* `draft` - Draft\n* `in_review` - In review\n* `final` - Final"},"notes":{"type":"string","description":"Assessment-level notes"},"product_release":{"type":"string","title":"Release Assessed","description":"The version or release of the asset this assessment covers, per CRA Annex VII point 1(b)","maxLength":128}}},"PatchedRegulatoryProfileRequest":{"type":"object","description":"Base serializer for all models.","properties":{"pci_scope":{"enum":["not_assessed","cde","connected_or_security_impacting","out_of_scope"],"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},"pci_component_kind":{"enum":["unspecified","bespoke_or_custom_software","third_party_software","system_component","payment_page"],"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},"pci_public_facing_web_app":{"type":"boolean","nullable":true,"title":"Public-facing web application","description":"Whether this product is a public-facing web application, which triggers Requirements 6.4.1 and 6.4.2. Left unset it is derived from the product being internet accessible and having an external audience; set it explicitly to override that derivation."},"pci_assessment_anchor":{"type":"string","format":"date","nullable":true,"title":"Assessment anchor date","description":"The date the PCI DSS assessment year is anchored to, which sets the start of the Requirement 11 quarterly scan grid. Left unset it defaults to 1 January of the current year."},"supports_critical_or_important_function":{"type":"boolean","title":"Supports a critical or important function","description":"Whether this product supports a critical or important function, per DORA Article 8(1). Drives the weekly scanning expectation for such assets."},"cra_product_class":{"enum":["not_applicable","default","important_class_1","important_class_2","critical"],"type":"string","x-spec-enum-id":"d4721e87a16da54d","description":"The product's class under the Cyber Resilience Act (Article 7, Annexes III and IV), which sets its conformity assessment route. Recorded here for reporting.\n\n* `not_applicable` - Not applicable\n* `default` - Default\n* `important_class_1` - Important, class I\n* `important_class_2` - Important, class II\n* `critical` - Critical"},"support_period_end":{"type":"string","format":"date","nullable":true,"description":"The end of the product's support period, per CRA Article 13(8). Past this date the product should stop appearing as in support in evidence."},"security_contact":{"type":"string","description":"An email address or URL for reporting vulnerabilities, per CRA Annex I Part II point 6.","maxLength":255},"cvd_policy_url":{"title":"Coordinated vulnerability disclosure policy URL","description":"A link to the product's coordinated vulnerability disclosure policy, per CRA Annex I Part II point 5.","oneOf":[{"type":"string","format":"uri","maxLength":512},{"type":"string","maxLength":0}]},"is_cyber_device":{"type":"boolean","title":"Cyber device","description":"Whether this product is a cyber device whose submission carries the Section 524B elements. Recorded by the sponsor; DefectDojo does not determine the classification."},"device_identifier":{"type":"string","description":"The Unique Device Identifier, or an internal model code where no UDI has been issued.","maxLength":128},"submission_stage":{"enum":["not_applicable","premarket","postmarket"],"type":"string","x-spec-enum-id":"82185feab3391f84","description":"Where the device sits relative to its submission.\n\n* `not_applicable` - Not applicable\n* `premarket` - Premarket\n* `postmarket` - Postmarket"},"patch_cycle_days":{"type":"integer","maximum":2147483647,"minimum":1,"nullable":true,"title":"Patch cycle (days)","description":"The regular interval on which the sponsor ships security updates. Section 524B asks for a cycle that is reasonably justified, so the interval and its rationale are recorded together."},"patch_cycle_rationale":{"type":"string","description":"Why that interval is appropriate for this device."},"sla_locked":{"type":"boolean","description":"When set, this product opts out of criticality-driven SLA assignment and keeps its current SLA configuration."},"notes":{"type":"string","description":"Free-form notes for the assessor."},"product":{"type":"integer","description":"The product this regulatory profile describes"}}},"PatchedRegulatoryReportRequest":{"type":"object","description":"A CRA Article 14 report.\n\nCreation goes through ``pro.regulatory.reporting.create_report`` so the stages, their\nstatutory clocks and the audit ledger are written in one transaction. After creation the\nstatutory anchors (``awareness_at``, ``corrective_measure_available_at``) and the report's\nidentity (``product``, ``regime``) are frozen on this serializer: they move only through the\ndedicated actions, each of which needs a justification and writes an audit event, so a PATCH\ncan never silently rewrite a deadline.","properties":{"awareness_justification":{"type":"string","writeOnly":true,"description":"Required when awareness_at is supplied explicitly instead of defaulting to now."},"regime":{"enum":["exploited_vulnerability","severe_incident"],"type":"string","x-spec-enum-id":"dba0969d08d6cd4a","description":"Which Article 14 reporting regime this report falls under.\n\n* `exploited_vulnerability` - Actively exploited vulnerability\n* `severe_incident` - Severe incident"},"reference_code":{"type":"string","description":"A human-facing reference for this report (e.g. an internal case ref).","maxLength":64},"title":{"type":"string","description":"A short operator label for this report.","maxLength":255},"advisory_reference":{"type":"string","description":"An external reference (CVE, vendor advisory id) for a trigger that is not a PSIRT advisory.","maxLength":255},"awareness_at":{"type":"string","format":"date-time","title":"Awareness timestamp","description":"When the manufacturer became aware. The statutory clock anchor; defaults to now at creation but is editable with a mandatory justification (audited)."},"corrective_measure_available_at":{"type":"string","format":"date-time","nullable":true,"title":"Corrective measure available","description":"Anchor for an exploited-vulnerability final report (available + 14 days)."},"sensitivity":{"enum":["standard","restricted"],"type":"string","x-spec-enum-id":"57fcd6a05eeafea4","description":"Sensitivity classification of this report's contents.\n\n* `standard` - Standard\n* `restricted` - Restricted"},"product":{"type":"integer","description":"The affected product with digital elements this report concerns."},"advisory":{"type":"integer","nullable":true,"description":"The PSIRT advisory covering the exploited vulnerability, when it exists in PSIRT. Backs the start-a-report-from-an-advisory flow."}}},"PatchedResponseTimeframeRequest":{"type":"object","description":"One cell of a policy's matrix.\n\n``max_days`` is exposed read-only beside the stored hours because the hours are the published\nfigure and the days are what the SLA arithmetic uses. A client that only ever saw days could\nnot render the twelve-hour cell the in-force FedRAMP table actually contains.","properties":{"policy":{"type":"integer","description":"The policy this timeframe belongs to."},"impact_level":{"type":"string","nullable":true,"description":"An impact code from the policy's vocabulary, or empty for any impact level.","maxLength":32},"internet_reachable":{"type":"boolean","nullable":true,"description":"Whether this row applies to internet-reachable findings, or null for either."},"credibly_exploitable":{"type":"boolean","nullable":true,"description":"Whether this row applies to credibly exploitable findings, or null for either."},"authorization_level":{"type":"string","nullable":true,"description":"An authorization or certification level from the policy's vocabulary, or empty for any.","maxLength":32},"max_hours":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Maximum Hours","description":"The maximum hours the standard allows for responding to a finding in this cell."},"note":{"type":"string","description":"A short citation locating this cell in the published document.","maxLength":256}}},"PatchedRoleRequest":{"type":"object","description":"Read/write serializer for custom roles.\n\n``permissions`` is a nested writable list of ``{permission, scope}`` grants;\nwriting it replaces the role's grant set atomically. ``is_system`` and\n``cloned_from`` are read-only (set only by the seed / the clone action); the\nviewset additionally blocks any write to a built-in (``is_system``) role.","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000},"permissions":{"type":"array","items":{"$ref":"#/components/schemas/RolePermissionRequest"}}}},"PatchedSLAConfigurationRequest":{"type":"object","description":"Base serializer for all models.","properties":{"configuration_type":{"enum":["Severity","Risk"],"type":"string","x-spec-enum-id":"a4582373721827bc","title":"SLA Configuration Type","description":"Indicates what basis the SLA will be calculated on for findings associated with this SLA configuration.\n\n* `Severity` - Measure SLA based on Finding Severity\n* `Risk` - Measure SLA based on Finding Risk"},"sla_start_policy":{"enum":["detection_date","publish_date","fix_available_date","earliest_known"],"type":"string","x-spec-enum-id":"9833b70ca10af085","description":"Which date the SLA clock starts from. The default keeps the clock on the detection date. Other policies start it from the vulnerability publish date, the date a fix became available, or the earliest of those, so the clock reflects how long a fix was possible. A computed start after the detection date is clamped to the detection date, so a policy can only tighten the clock, never lengthen it. Required for PCI DSS Requirement 6.3.3, where the one-month clock runs from patch release.\n\n* `detection_date` - When the finding was detected (default)\n* `publish_date` - When the vulnerability was published\n* `fix_available_date` - When a fix became available\n* `earliest_known` - The earliest known of the above"},"name":{"type":"string","minLength":1,"title":"Custom SLA Name","description":"A unique name for the set of SLAs."},"description":{"type":"string","nullable":true,"minLength":1},"restart_sla_on_reactivation":{"type":"boolean","title":"Restart SLA when findings are reactivated","description":"When enabled, findings that were previously mitigated but are reactivated durign reimport will have their SLA period restarted."},"critical":{"type":"integer","default":7,"title":"Critical Finding SLA Days","description":"The number of days to remediate a critical finding."},"enforce_critical":{"type":"boolean","default":true,"title":"Enforce Critical Finding SLA Days","description":"When enabled, critical findings will be assigned an SLA expiration date based on the critical finding SLA days within this SLA configuration."},"high":{"type":"integer","default":30,"title":"High Finding SLA Days","description":"The number of days to remediate a high finding."},"enforce_high":{"type":"boolean","default":true,"title":"Enforce High Finding SLA Days","description":"When enabled, high findings will be assigned an SLA expiration date based on the high finding SLA days within this SLA configuration."},"medium":{"type":"integer","default":90,"title":"Medium Finding SLA Days","description":"The number of days to remediate a medium finding."},"enforce_medium":{"type":"boolean","default":true,"title":"Enforce Medium Finding SLA Days","description":"When enabled, medium findings will be assigned an SLA expiration date based on the medium finding SLA days within this SLA configuration."},"low":{"type":"integer","default":120,"title":"Low Finding SLA Days","description":"The number of days to remediate a low finding."},"enforce_low":{"type":"boolean","default":true,"title":"Enforce Low Finding SLA Days","description":"When enabled, low findings will be assigned an SLA expiration date based on the low finding SLA days within this SLA configuration."},"urgent_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":7,"title":"Urgent Risk Finding SLA Days","description":"The number of days to remediate an urgent risk finding."},"enforce_urgent_risk":{"type":"boolean","title":"Enforce Urgent Risk Finding SLA Days","description":"When enabled, urgent risk findings will be assigned an SLA expiration date based on the urgent risk finding SLA days within this SLA configuration."},"needs_action_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":30,"title":"Needs Action Risk Finding SLA Days","description":"The number of days to remediate a needs action risk finding."},"enforce_needs_action_risk":{"type":"boolean","title":"Enforce Needs Action Risk Finding SLA Days","description":"When enabled, needs action risk findings will be assigned an SLA expiration date based on the needs action risk finding SLA days within this SLA configuration."},"medium_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":90,"title":"Medium Risk Finding SLA Days","description":"The number of days to remediate a medium risk finding."},"enforce_medium_risk":{"type":"boolean","title":"Enforce Medium Risk Finding SLA Days","description":"When enabled, medium risk findings will be assigned an SLA expiration date based on the medium risk finding SLA days within this SLA configuration."},"low_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":120,"title":"Low Risk Finding SLA Days","description":"The number of days to remediate a low risk finding."},"enforce_low_risk":{"type":"boolean","title":"Enforce Low Risk Finding SLA Days","description":"When enabled, low risk findings will be assigned an SLA expiration date based on the low risk finding SLA days within this SLA configuration."},"cap_by_kev_due_date":{"type":"boolean","title":"Cap SLA by CISA KEV Due Date","description":"When enabled, enforced SLA expiration dates are capped at the CISA Known Exploited Vulnerabilities catalog due date for findings listed in that catalog (as FedRAMP-style remediation timelines require)."},"vdr_enabled":{"type":"boolean","title":"Enable VDR Deadlines","description":"When enabled, findings that are internet-reachable and/or credibly exploitable get tightened remediation deadlines per the FedRAMP Vulnerability Detection and Response standard."},"vdr_urgent_days":{"type":"integer","maximum":2147483647,"minimum":0,"description":"Deadline (days from discovery) for internet-reachable AND credibly exploitable findings."},"vdr_exploitable_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"VDR Credibly-Exploitable Days","description":"Deadline (days from discovery) for credibly exploitable findings that are not internet-reachable."},"vdr_reachable_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"VDR Internet-Reachable Days","description":"Deadline (days from discovery) for internet-reachable findings that are not credibly exploitable."},"vdr_epss_threshold":{"type":"number","format":"double","description":"A finding is treated as credibly exploitable when its EPSS score meets this threshold."},"vdr_reachability_tag":{"type":"string","description":"Findings carrying this tag are treated as internet-reachable for VDR tiering.","maxLength":64},"vdr_use_exposure_verdicts":{"type":"boolean","title":"Use Asset Exposure for VDR Tiering","description":"Also treat a finding as internet-reachable when its asset's computed exposure says so, in addition to the tag above. Off by default: a compliance deadline should tighten only when the compliance owner decides it should, never as a side effect of enabling a feature."},"vdr_pain_enabled":{"type":"boolean","title":"Use PAIN Ratings for VDR Deadlines","description":"When enabled, VDR deadlines come from the twelve-cell FedRAMP matrix below, keyed on each finding's Potential Agency Impact rating, instead of the three tiers above. Findings with no PAIN rating keep their base SLA."},"vdr_pain5_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-5, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-5 finding that is credibly exploitable AND internet-reachable."},"vdr_pain5_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-5, Exploitable Only","description":"Deadline in days for a PAIN-5 finding that is credibly exploitable but not internet-reachable."},"vdr_pain5_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-5, Not Likely Exploitable","description":"Deadline in days for a PAIN-5 finding that is not credibly exploitable."},"vdr_pain4_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-4, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-4 finding that is credibly exploitable AND internet-reachable."},"vdr_pain4_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-4, Exploitable Only","description":"Deadline in days for a PAIN-4 finding that is credibly exploitable but not internet-reachable."},"vdr_pain4_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-4, Not Likely Exploitable","description":"Deadline in days for a PAIN-4 finding that is not credibly exploitable."},"vdr_pain3_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-3, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-3 finding that is credibly exploitable AND internet-reachable."},"vdr_pain3_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-3, Exploitable Only","description":"Deadline in days for a PAIN-3 finding that is credibly exploitable but not internet-reachable."},"vdr_pain3_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-3, Not Likely Exploitable","description":"Deadline in days for a PAIN-3 finding that is not credibly exploitable."},"vdr_pain2_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-2, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-2 finding that is credibly exploitable AND internet-reachable."},"vdr_pain2_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-2, Exploitable Only","description":"Deadline in days for a PAIN-2 finding that is credibly exploitable but not internet-reachable."},"vdr_pain2_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-2, Not Likely Exploitable","description":"Deadline in days for a PAIN-2 finding that is not credibly exploitable."},"response_policy":{"type":"integer","nullable":true,"title":"Vulnerability Response Policy","description":"The published response standard that sets deadlines for findings under this SLA configuration. When set, it replaces the VDR tiers and the PAIN matrix above. When null, those settings continue to apply exactly as before."},"authorization_level":{"type":"string","description":"This service's authorization or certification level under the response policy, for example a FedRAMP certification class. Free text validated against the policy's own vocabulary, because the level names are the standard's and change when it does.","maxLength":32}}},"PatchedScanCadencePolicyRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"enabled":{"type":"boolean"},"scope_type":{"enum":["all","product_type","regulation","criticality","product"],"type":"string","description":"* `all` - All products\n* `product_type` - Product type\n* `regulation` - Regulation\n* `criticality` - Business criticality\n* `product` - Product","x-spec-enum-id":"080987e46d51879f","title":"Scope"},"product_type":{"type":"integer","nullable":true},"regulation":{"type":"integer","nullable":true},"product":{"type":"integer","nullable":true},"business_criticality":{"enum":["very high","high","medium","low","very low","none","",null],"type":"string","description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","x-spec-enum-id":"ef412461eb271471","nullable":true},"critical_functions_only":{"type":"boolean"},"required_test_types":{"type":"array","items":{"type":"integer"},"description":"Empty means any test type qualifies."},"interval_days":{"type":"integer","maximum":36500,"minimum":1,"title":"Interval in days"},"grace_days":{"type":"integer","maximum":36500,"minimum":0,"title":"Grace in days"},"notify":{"type":"boolean","title":"Notify on overdue transition"}}},"PatchedServiceUserUpdateRequest":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":150},"description":{"type":"string"},"expires_in_days":{"enum":[30,60,90,180,null],"x-spec-enum-id":"24300396586ae48a","nullable":true,"description":"Token lifetime in days: 30, 60, 90 or 180, or null for No Expiration.\n\n* `30` - 30\n* `60` - 60\n* `90` - 90\n* `180` - 180\n* `None` - None"},"is_active":{"type":"boolean"},"global_role_id":{"type":"integer","nullable":true}}},"PatchedSettingsRequest":{"type":"object","properties":{"alerts_enabled":{"type":"boolean","title":"Due Date Alerts","description":"Notify assignees and owning teams as action due dates approach."},"alert_days":{"type":"array","items":{"type":"integer","maximum":365,"minimum":0},"maxItems":10},"at_risk_days":{"type":"integer","maximum":32767,"minimum":0,"description":"An action due within this many days is At risk."},"due_soon_days":{"type":"integer","maximum":32767,"minimum":0,"description":"An action due within this many days is Due soon."}}},"PatchedSignificantChangeRequest":{"type":"object","description":"Base serializer for all models.","properties":{"title":{"type":"string","minLength":1,"description":"A short name for the change, as an assessor would recognize it","maxLength":255},"description":{"type":"string","description":"What changed, and why the entity judged it significant"},"change_date":{"type":"string","format":"date","description":"The date the change took effect, which is when the scan clock starts"},"requires_internal_scan":{"type":"boolean","title":"Requires an internal scan","description":"Whether Requirement 11.3.1.3 calls for an internal scan after this change"},"requires_asv_scan":{"type":"boolean","title":"Requires an external ASV scan","description":"Whether Requirement 11.3.2.1 calls for an external scan after this change"},"requires_pentest":{"type":"boolean","title":"Requires a penetration test","description":"Whether Requirement 11.4 calls for a penetration test after this change"},"product":{"type":"integer","description":"The product the change was made to"}}},"PatchedSonarqubeIssueRequest":{"type":"object","properties":{"key":{"type":"string","minLength":1,"description":"SonarQube issue key","maxLength":60},"status":{"type":"string","minLength":1,"description":"SonarQube issue status","maxLength":20},"type":{"type":"string","minLength":1,"description":"SonarQube issue type","maxLength":20}}},"PatchedSonarqubeIssueTransitionRequest":{"type":"object","properties":{"finding_status":{"type":"string","minLength":1,"maxLength":100},"sonarqube_status":{"type":"string","minLength":1,"maxLength":50},"transitions":{"type":"string","minLength":1,"maxLength":100},"sonarqube_issue":{"type":"integer"}}},"PatchedTargetedRiskAnalysisRequest":{"type":"object","description":"Base serializer for all models.","properties":{"requirement_ref":{"type":"string","minLength":1,"title":"PCI DSS requirement","description":"The requirement this analysis justifies a frequency for, e.g. 6.3.3 or 11.3.1.1.","pattern":"^(\\d+(\\.\\d+){0,3}|A[1-3](\\.\\d+){0,3})$","maxLength":16},"title":{"type":"string","minLength":1,"description":"A short name for this analysis.","maxLength":255},"assets_and_threats":{"type":"string","description":"What is being protected and the threats to it (Requirement 12.3.1)."},"likelihood_and_impact":{"type":"string","description":"The likelihood and impact analysis behind the chosen frequency (Requirement 12.3.1)."},"decision":{"type":"string","description":"The frequency or timeframe decided on, and the reasoning (Requirement 12.3.1)."},"scope_product_type":{"type":"integer","nullable":true,"title":"Scope organization","description":"Limit this analysis to one organization. Leave both scope fields empty for entity-wide."},"scope_product":{"type":"integer","nullable":true,"description":"Limit this analysis to one product. Leave both scope fields empty for entity-wide."},"linked_sla_configuration":{"type":"integer","nullable":true,"description":"The SLA configuration whose frequency this analysis justifies, if any."}}},"PatchedTestImportRequest":{"type":"object","properties":{"import_settings":{"nullable":true},"type":{"type":"string","minLength":1,"maxLength":64},"version":{"type":"string","nullable":true,"maxLength":100},"build_id":{"type":"string","nullable":true,"description":"Build ID that was tested, a reimport may update this field.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash tested, a reimport may update this field.","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch that was tested, a reimport may update this field.","maxLength":150}}},"PatchedTestTypeRequest":{"type":"object","properties":{"soc":{"type":"boolean"},"static_tool":{"type":"boolean"},"dynamic_tool":{"type":"boolean"},"active":{"type":"boolean"}}},"PatchedTestsRequest":{"type":"object","description":"Regression guard for Sentry DJANGO-D2P.\n\nDRF ``ModelSerializer.update()`` calls ``instance.<m2m>.set(new_list)`` for\nevery M2M field present in ``validated_data``, even when the new list is\nidentical to the current one. On tagulous ``TagField``s that triggers a\nfull teardown + re-add of the M2M, which runs SELECT + UPDATE ``count``\nbookkeeping per tag (N+1).\n\nThis mixin short-circuits the ``.set()`` call per ``TagListSerializerField``\nwhen the normalized incoming list equals ``instance.<attr>.get_tag_list()``.\nAll other M2M fields keep the stock DRF behavior.\n\nOpt in by adding ``SkipUnchangedTagsMixin`` to the base-class list of any\nserializer that exposes a ``TagListSerializerField`` for update.","properties":{"processing":{"type":"boolean","description":"Dictate that the test is undergoing an Import or ReImport"},"deduplication":{"type":"boolean","description":"Dictate that the test is undergoing Deduplication for all findings that were imported last"},"false_positive_history":{"type":"boolean","description":"Dictate that the test is undergoing False Positive History for all findings that were imported last"},"pci_role":{"enum":["none","internal_vulnerability_scan","external_asv_scan","web_application_assessment","penetration_test","segmentation_test",""],"type":"string","x-spec-enum-id":"df388145a7e568b9","description":"Overrides the test type's PCI DSS role for this test alone. Blank inherits it.\n\n* `none` - Not a PCI test\n* `internal_vulnerability_scan` - Internal vulnerability scan\n* `external_asv_scan` - External ASV scan\n* `web_application_assessment` - Web application assessment\n* `penetration_test` - Penetration test\n* `segmentation_test` - Segmentation test"},"authenticated":{"enum":["unknown","yes","no"],"type":"string","x-spec-enum-id":"d1c998de7a29cb98","description":"Whether this scan ran with credentials (PCI DSS Requirement 11.3.1.2)\n\n* `unknown` - Unknown\n* `yes` - Authenticated\n* `no` - Not authenticated"},"asv_result":{"enum":["not_applicable","pass","fail"],"type":"string","x-spec-enum-id":"2622389e4dfa2e13","description":"The result the Approved Scanning Vendor reported, as recorded by the entity\n\n* `not_applicable` - Not applicable\n* `pass` - Passing\n* `fail` - Failing"},"asv_vendor":{"type":"string","description":"The Approved Scanning Vendor that ran the scan"},"asv_attestation_reference":{"type":"string","description":"The entity's reference for the ASV attestation covering this scan"},"after_change":{"type":"integer","nullable":true,"description":"The significant change this scan was run in response to"},"pci_note":{"type":"string","description":"Context an assessor would ask for about this test"},"title":{"type":"string","nullable":true,"maxLength":255},"description":{"type":"string","nullable":true},"target_start":{"type":"string","format":"date-time"},"target_end":{"type":"string","format":"date-time"},"percent_complete":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"version":{"type":"string","nullable":true,"maxLength":100},"build_id":{"type":"string","nullable":true,"description":"Build ID that was tested, a reimport may update this field.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash tested, a reimport may update this field.","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch that was tested, a reimport may update this field.","maxLength":150},"lead":{"type":"integer","nullable":true},"test_type":{"type":"integer"},"environment":{"type":"integer","nullable":true},"api_scan_configuration":{"type":"integer","nullable":true},"tags":{"type":"array","items":{"type":"string","minLength":1}}}},"PatchedToolConfigurationRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","nullable":true,"maxLength":2000},"url":{"type":"string","nullable":true,"maxLength":2000},"authentication_type":{"enum":["API","Password","SSH","",null],"type":"string","description":"* `API` - API Key\n* `Password` - Username/Password\n* `SSH` - SSH","x-spec-enum-id":"e1a582895a9e03b4","nullable":true},"extras":{"type":"string","nullable":true,"description":"Additional definitions that will be consumed by scanner","maxLength":255},"username":{"type":"string","nullable":true,"maxLength":200},"password":{"type":"string","writeOnly":true,"nullable":true,"maxLength":900},"auth_title":{"type":"string","nullable":true,"title":"Title for SSH/API Key","maxLength":200},"ssh":{"type":"string","writeOnly":true,"nullable":true,"maxLength":9000},"api_key":{"type":"string","writeOnly":true,"nullable":true,"maxLength":900},"tool_type":{"type":"integer"}}},"PatchedToolProductSettingsRequest":{"type":"object","description":"Enforce ``view_tool_configuration`` on ``tool_configuration`` writes.\n\nSelecting a ``tool_configuration`` lets an import run authenticated requests\nwith the credential stored on it, so it is gated by the same\n``view_tool_configuration`` permission that guards the tool-configuration\nviews, not just the object permission these endpoints already check.\n\nMix this into *every* serializer exposing the field, including alias\nserializers over the same model, so the rule holds wherever the field is\nreachable.\n\nThe check hangs off ``run_validation`` rather than ``validate`` on purpose: a\nsubclass that defines its own ``validate`` would otherwise shadow the mixin's\nand silently drop the guard.\n\nNo-ops when the field is absent (replay-safe on PATCH), mirroring\ndojo.authorization.api_permissions.check_update_permission.","properties":{"setting_url":{"type":"string","minLength":1},"product":{"type":"integer"},"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","nullable":true,"maxLength":2000},"url":{"type":"string","nullable":true,"maxLength":2000},"tool_project_id":{"type":"string","nullable":true,"maxLength":200},"tool_configuration":{"type":"integer"}}},"PatchedToolTypeRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","nullable":true,"maxLength":2000}}},"PatchedURLRequest":{"type":"object","description":"Serializer for the URL model with primary keys for related objects.","properties":{"tags":{"type":"array","items":{"type":"string","minLength":1}},"protocol":{"type":"string","description":"The protocol of the URL (e.g., http, https, ftp, etc.)","maxLength":10},"user_info":{"type":"string","description":"Connection details for a given user","maxLength":512},"host":{"type":"string","minLength":1,"description":"The host of the URL, which can be a domain name or an IP address","maxLength":256},"port":{"type":"integer","maximum":65535,"minimum":1,"nullable":true,"description":"The port number of the URL (optional)"},"path":{"type":"string","description":"The path of the URL (optional),","maxLength":2048},"query":{"type":"string","description":"The query string of the URL (optional)","maxLength":2048},"fragment":{"type":"string","description":"The fragment identifier of the URL (optional)","maxLength":2048},"host_validation_failure":{"type":"boolean","description":"Dictates whether the endpoint was found to have host validation issues during creation"}}},"PatchedUnauthenticatedSystemExceptionRequest":{"type":"object","description":"Base serializer for all models.","properties":{"system_identifier":{"type":"string","minLength":1,"title":"System","description":"The host, device or component that cannot accept scanning credentials","maxLength":255},"reason":{"type":"string","minLength":1,"description":"Why the system cannot accept credentials (Requirement 11.3.1.2)"},"compensating_control":{"type":"string","description":"What offsets the missing credentials: the control the entity relies on in place of an authenticated scan. Requirement 11.3.1.2 asks for this alongside the reason, because a system that cannot be scanned with credentials is only acceptable when something else covers it."},"valid_from":{"type":"string","format":"date","description":"The date the exception starts to apply"},"valid_until":{"type":"string","format":"date","nullable":true,"description":"The date the exception lapses. Empty means it stands until removed."},"product":{"type":"integer","description":"The product the excepted system belongs to"}}},"PatchedVulnerabilityResponsePolicyRequest":{"type":"object","description":"A published standard as data, with its cells nested for reading.","properties":{"name":{"type":"string","minLength":1,"description":"Display name for this policy, for example 'FedRAMP VDR 2026'.","maxLength":128},"standard":{"type":"string","minLength":1,"description":"The published standard's own identifier, for example 'FedRAMP VDR'. Free text, because every framework names itself differently and this column must not privilege one of them.","maxLength":128},"version":{"type":"string","minLength":1,"description":"The version identifier the standard publishes for itself, for example a release date. Together with the standard this is the seed key, so a revision arrives as a new row.","maxLength":64},"effective_from":{"type":"string","format":"date","description":"The date this version of the standard takes effect."},"enabled":{"type":"boolean","description":"When disabled, SLA configurations pointing at this policy fall back to their own VDR settings. Lets an operator stage a policy before it governs any deadline."},"impact_vocabulary":{"description":"The standard's adverse-impact level codes, as a JSON list in ascending order of impact, for example [\"N1\", \"N2\", \"N3\", \"N4\", \"N5\"]. Ascending order is what lets a threshold be expressed as 'above this code' without this code knowing the words."},"authorization_vocabulary":{"description":"The standard's authorization or certification level codes, as a JSON list, for example [\"A\", \"B\", \"C\", \"D\"]. Free-form for the same reason as the impact vocabulary: the in-force FedRAMP rules key timeframes on certification classes, while older FedRAMP material and other frameworks key them on low/moderate/high."},"severity_impact_map":{"title":"Severity to Impact Map","description":"The fallback mapping from a finding's severity onto this policy's impact vocabulary, for example {\"Critical\": \"N5\"}. Only consulted when nothing better is known. Configurable per policy because severity is a poor proxy for impact on a customer's mission and the customer has to be able to correct it."},"epss_threshold":{"type":"number","format":"double","nullable":true,"description":"The EPSS score at or above which a finding counts as credibly exploitable under this policy. Null defers to the SLA configuration's own VDR EPSS threshold."},"evaluation_days":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"How many days after detection the standard allows for evaluating a vulnerability. Null means the standard sets no evaluation deadline."},"evaluation_days_by_authorization":{"title":"Evaluation Days by Authorization Level","description":"Per-authorization-level overrides of the evaluation deadline, for example {\"D\": 2}. Consulted before the flat evaluation days above."},"escalate_to_incident":{"title":"Escalation Condition","description":"The condition under which the standard treats a vulnerability as a reportable incident until it is mitigated, as a JSON object. Recorded here rather than in code so a revision that moves the threshold is a seed change."},"acceptance_days":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"The point after which the standard categorises an unresolved vulnerability as accepted. Null means the standard sets no such backstop."},"source_url":{"description":"Where this version of the standard is published.","oneOf":[{"type":"string","format":"uri","maxLength":256},{"type":"string","maxLength":0}]},"note":{"type":"string","description":"A short citation locating these timeframes in the published document."}}},"PauseRequestRequest":{"type":"object","description":"Pausing needs a category and a reason. Both are required.","properties":{"category":{"enum":["vendor_wait","engineering_analysis","legal_review","customer_request","other"],"type":"string","description":"* `vendor_wait` - Waiting on Vendor\n* `engineering_analysis` - Engineering Analysis\n* `legal_review` - Legal Review\n* `customer_request` - Customer Request\n* `other` - Other","x-spec-enum-id":"df3c8ae4dab1af74"},"justification":{"type":"string","minLength":1}},"required":["category","justification"]},"PlanCreateRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"A name to recognize the plan by in the list.","maxLength":255},"ops":{"type":"array","items":{},"description":"The operations, applied in a fixed order whatever their order here: organizations are created, assets move to their organization (taking their subtree along unless move_children is false), parents are set (checked against the new organization), fields are set, then secondary memberships change. Each is an object with an \"op\" key: create_organization {name, org_type, parent}; create_asset {name, organization, description, parent} (undo removes it again only while it is still empty and unchanged); set_organization {asset, organization, move_children}; add_membership / remove_membership {asset, organization}; set_parent {asset, parent (null detaches)}; set_fields {asset, fields} where fields holds any of business_criticality, user_records, revenue, external_audience, internet_accessible, prioritization_engine, sla_configuration, asset_type (code), lifecycle (the option's value, such as retirement), technical_contact, team_manager, product_manager, tags_add, tags_remove. A reference is an id (12 or {\"id\": 12}) or, when the id is not known, {\"match\": {\"name\": \"...\"}} (users match on \"username\"). An organization or asset the plan creates is referenced by its name. At most 10000 operations.","maxItems":10000}},"required":["name","ops"]},"PlanDetail":{"type":"object","description":"A plan with its operations, its diff and the record of an apply.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"status":{"enum":["draft","applying","applied","failed","stale","discarded"],"type":"string","description":"* `draft` - Draft\n* `applying` - Applying\n* `applied` - Applied\n* `failed` - Failed\n* `stale` - Stale\n* `discarded` - Discarded","x-spec-enum-id":"84d3c16873e15bca","readOnly":true},"source":{"enum":["api","csv","undo","advisor"],"type":"string","description":"* `api` - API\n* `csv` - CSV import\n* `undo` - Undo\n* `advisor` - Advisor","x-spec-enum-id":"97319936fe017b00","readOnly":true},"summary":{"type":"object","additionalProperties":{"type":"integer"},"readOnly":true},"inverse_of":{"type":"integer","readOnly":true,"nullable":true,"title":"Undoes"},"suggestion":{"type":"integer","readOnly":true,"nullable":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/_User"}],"readOnly":true,"nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created"},"applied_by":{"allOf":[{"$ref":"#/components/schemas/_User"}],"readOnly":true,"nullable":true},"apply_started_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Apply started"},"applied_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Apply finished"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated"},"ops":{"readOnly":true,"title":"Operations"},"diff":{"readOnly":true},"result":{"readOnly":true}},"required":["applied_at","applied_by","apply_started_at","created_at","created_by","diff","id","inverse_of","name","ops","result","source","status","suggestion","summary","updated_at"]},"PlanList":{"type":"object","description":"A plan without its operations and diff, for the list.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"status":{"enum":["draft","applying","applied","failed","stale","discarded"],"type":"string","description":"* `draft` - Draft\n* `applying` - Applying\n* `applied` - Applied\n* `failed` - Failed\n* `stale` - Stale\n* `discarded` - Discarded","x-spec-enum-id":"84d3c16873e15bca","readOnly":true},"source":{"enum":["api","csv","undo","advisor"],"type":"string","description":"* `api` - API\n* `csv` - CSV import\n* `undo` - Undo\n* `advisor` - Advisor","x-spec-enum-id":"97319936fe017b00","readOnly":true},"summary":{"type":"object","additionalProperties":{"type":"integer"},"readOnly":true},"inverse_of":{"type":"integer","readOnly":true,"nullable":true,"title":"Undoes"},"suggestion":{"type":"integer","readOnly":true,"nullable":true},"created_by":{"allOf":[{"$ref":"#/components/schemas/_User"}],"readOnly":true,"nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created"},"applied_by":{"allOf":[{"$ref":"#/components/schemas/_User"}],"readOnly":true,"nullable":true},"apply_started_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Apply started"},"applied_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Apply finished"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated"}},"required":["applied_at","applied_by","apply_started_at","created_at","created_by","id","inverse_of","name","source","status","suggestion","summary","updated_at"]},"PlanLocked":{"type":"object","properties":{"detail":{"type":"string"},"locked":{"type":"array","items":{"type":"object","additionalProperties":{}},"description":"The operations refused because their asset is held by a running priority or SLA recalculation."}},"required":["detail","locked"]},"PlanRebuildRequest":{"type":"object","properties":{"exclude_ops":{"type":"array","items":{"type":"integer","minimum":0},"description":"Operation indexes (the plan's ops order) to leave out of the new draft.","maxItems":10000}}},"PlanRefused":{"type":"object","properties":{"detail":{"type":"string"},"errors":{"type":"array","items":{"type":"object","additionalProperties":{}}},"code":{"type":"string","description":"advisor_plan: the plan belongs to a hierarchy suggestion; act on it from there."},"suggestion":{"type":"integer","nullable":true,"description":"With advisor_plan: the hierarchy suggestion the plan belongs to."}},"required":["detail"]},"PlanStale":{"type":"object","properties":{"detail":{"type":"string"},"drift":{"type":"array","items":{"type":"object","additionalProperties":{}},"description":"The recorded entries the current state no longer matches, and effects the plan would now have that were not reviewed."}},"required":["detail","drift"]},"PlanUploadRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"file":{"type":"string","format":"binary","description":"Instead of JSON, upload an asset CSV as multipart form data (a file field named file, plus name). One row per asset, columns: asset_id, asset_name, organization, parent_id, parent_name, asset_type, business_criticality, user_records, revenue, external_audience, internet_accessible, prioritization_engine, sla_configuration, technical_contact, team_manager, product_manager, tags_add, tags_remove. asset_id wins over asset_name and parent_id over parent_name; an empty cell or a missing row changes nothing; null clears a value (parent_id null detaches); tags_add and tags_remove take comma-separated tags. GET /api/v2/hierarchy/assets.csv/ exports the current state in exactly this format, so an exported file imported back unchanged produces an empty plan. At most 10000 rows; operations that change nothing are left out of the stored plan."}},"required":["file","name"]},"PrefilterPreviewRequestRequest":{"type":"object","description":"A dry run of conditions that may not be saved yet.","properties":{"conditions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtPrefilterConditionRequest"}},"match_logic":{"enum":["any","all"],"type":"string","description":"* `any` - Any\n* `all` - All","x-spec-enum-id":"0a55c3153ef51701","default":"any"},"feed_source":{"type":"integer","nullable":true},"limit":{"type":"integer","maximum":5000,"minimum":1}},"required":["conditions"]},"PresetApplication":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"preset_key":{"type":"string","readOnly":true},"preset_name":{"type":"string","readOnly":true},"previewed_by_username":{"type":"string","readOnly":true},"applied_by_username":{"type":"string","readOnly":true},"reverted_by_username":{"type":"string","readOnly":true},"drifted":{"type":"boolean","readOnly":true},"status":{"enum":["previewed","applied","partially_applied","reverted"],"type":"string","x-spec-enum-id":"8ca65ee3ca0de9eb","readOnly":true,"description":"Where this application is in its lifecycle.\n\n* `previewed` - Previewed\n* `applied` - Applied\n* `partially_applied` - Partially applied\n* `reverted` - Reverted"},"scope_type":{"enum":["instance","product_type","product"],"type":"string","x-spec-enum-id":"244477cf639989fa","readOnly":true,"description":"What the checks in this application are evaluated against.\n\n* `instance` - Whole instance\n* `product_type` - One product type\n* `product` - One product"},"variant":{"type":"string","readOnly":true,"description":"The preset variant that was planned, for example a maturity level. Empty when the preset has none."},"plan":{"readOnly":true,"description":"The exact set of changes as previewed, one entry per preset item."},"result":{"readOnly":true,"description":"What applying the plan did, per item, and what reverting it did afterwards."},"drift":{"readOnly":true,"description":"Items whose current values no longer match what this application wrote."},"drift_detected_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"When the sweep first found the applied settings no longer matching. Empty while they match."},"drift_checked_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"When the drift sweep last compared this application against the current settings."},"applied_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"When the plan was applied."},"reverted_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"When the application was reverted."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the application record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the application record was updated"},"preset":{"type":"integer","readOnly":true,"description":"The preset this plan was built from."},"scope_product_type":{"type":"integer","readOnly":true,"nullable":true,"description":"Set when the scope type is a single product type."},"scope_product":{"type":"integer","readOnly":true,"nullable":true,"description":"Set when the scope type is a single product."},"previewed_by":{"type":"integer","readOnly":true,"nullable":true,"description":"Who built this plan."},"applied_by":{"type":"integer","readOnly":true,"nullable":true,"description":"Who applied the plan."},"reverted_by":{"type":"integer","readOnly":true,"nullable":true,"description":"Who reverted the application."}},"required":["applied_at","applied_by","applied_by_username","created_at","drift","drift_checked_at","drift_detected_at","drifted","id","plan","preset","preset_key","preset_name","previewed_by","previewed_by_username","result","reverted_at","reverted_by","reverted_by_username","scope_product","scope_product_type","scope_type","status","updated_at","variant"]},"PresetApplyRequestRequest":{"type":"object","properties":{"application":{"type":"integer"}},"required":["application"]},"PresetCheckAnswer":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"check":{"type":"string","readOnly":true},"label":{"type":"string","readOnly":true},"variant":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true},"detail":{"type":"string","readOnly":true},"count":{"type":"integer","readOnly":true,"nullable":true},"params":{"readOnly":true}},"required":["check","count","detail","id","label","params","status","variant"]},"PresetImportRequest":{"type":"object","properties":{"format":{"type":"string"},"format_version":{"type":"integer"},"exported_at":{"type":"string"},"key":{"type":"string","minLength":1},"name":{"type":"string","minLength":1},"framework":{"type":"string","minLength":1},"version":{"type":"string","minLength":1},"publisher":{"type":"string","default":""},"source_url":{"type":"string","default":""},"summary":{"type":"string","default":""},"definition":{},"supersedes":{"type":"string","default":""}},"required":["definition","framework","key","name","version"]},"PresetItem":{"type":"object","properties":{"section":{"type":"string","readOnly":true},"id":{"type":"string","readOnly":true},"variant":{"type":"string","readOnly":true},"text":{"type":"string","readOnly":true},"note":{"type":"string","readOnly":true}},"required":["id","note","section","text","variant"]},"PresetLatestApplication":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"status":{"type":"string","readOnly":true},"variant":{"type":"string","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"applied_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"drifted":{"type":"boolean","readOnly":true}},"required":["applied_at","created_at","drifted","id","status","variant"]},"PresetPlanRequestRequest":{"type":"object","properties":{"scope_type":{"enum":["instance","product_type","product"],"type":"string","description":"* `instance` - Whole instance\n* `product_type` - One product type\n* `product` - One product","x-spec-enum-id":"244477cf639989fa","default":"instance"},"scope_product":{"type":"integer","nullable":true},"scope_product_type":{"type":"integer","nullable":true},"variant":{"type":"string","default":""}}},"PresetVariant":{"type":"object","properties":{"key":{"type":"string","readOnly":true},"label":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true}},"required":["description","key","label"]},"PreviewDeltaStatistics":{"type":"object","description":"Delta statistics for import preview — like DeltaStatisticsSerializer but adds created_duplicate.","properties":{"created":{"$ref":"#/components/schemas/SeverityStatusStatistics"},"created_duplicate":{"$ref":"#/components/schemas/SeverityStatusStatistics"},"closed":{"$ref":"#/components/schemas/SeverityStatusStatistics"}},"required":["closed","created","created_duplicate"]},"PreviewReImportDeltaStatistics":{"type":"object","description":"Delta statistics for reimport preview — adds reactivated and untouched.","properties":{"created":{"$ref":"#/components/schemas/SeverityStatusStatistics"},"created_duplicate":{"$ref":"#/components/schemas/SeverityStatusStatistics"},"closed":{"$ref":"#/components/schemas/SeverityStatusStatistics"},"reactivated":{"$ref":"#/components/schemas/SeverityStatusStatistics"},"untouched":{"$ref":"#/components/schemas/SeverityStatusStatistics"}},"required":["closed","created","created_duplicate","reactivated","untouched"]},"PreviewReImportStatistics":{"type":"object","description":"Statistics wrapper for reimport preview.","properties":{"delta":{"$ref":"#/components/schemas/PreviewReImportDeltaStatistics"}},"required":["delta"]},"PreviewRequestRequest":{"type":"object","description":"A dry run over the recent advisory corpus.\n\n``conditions`` previews an unsaved condition set; omitted, the saved rule is\npreviewed instead. ``prior_conditions`` adds the before/after delta an author\nediting a rule needs — the new number alone does not say whether the edit\nwidened or narrowed anything.","properties":{"conditions":{"type":"array","items":{"type":"object","additionalProperties":{}}},"prior_conditions":{"type":"array","items":{"type":"object","additionalProperties":{}}},"condition_logic":{"type":"string","minLength":1,"default":"and"},"lookback_days":{"type":"integer","maximum":365,"minimum":1,"default":30},"sample_limit":{"type":"integer","maximum":50,"minimum":0,"default":10}}},"PreviewStatistics":{"type":"object","description":"Statistics wrapper for import preview (delta only — no DB writes, so no before/after).","properties":{"delta":{"$ref":"#/components/schemas/PreviewDeltaStatistics"}},"required":["delta"]},"PrioritizationEngine":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":512},"description":{"type":"string","nullable":true},"async_updating":{"type":"boolean","readOnly":true,"description":"Findings under this Prioritization Engine are asynchronously being updated"},"finding_severity_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of severity."},"finding_external_score_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of external scoring mechanisms."},"finding_endpoints_ratio_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the ratio of endpoints on a finding compared to endpoints on product."},"product_business_criticality_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of business criticality."},"product_user_records_ratio_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the ratio of user records on the product relative to the total user records for the product type."},"product_revenue_ratio_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the ratio of product revenue relative to the total revenue for the product type."},"product_external_audience_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust how having an external audience impacts the product."},"product_internet_accessible_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust how internet accessibility impacts the product."},"finding_reachability_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of the finding's reachability verdict."},"finding_correlation_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of the blast radius of the finding's root cause."},"low_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Low risk findings."},"medium_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Medium risk findings."},"needs_action_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Needs Action risk findings."},"urgent_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Urgent risk findings."},"actively_exploited_risk_floor":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Minimum Risk band for findings whose threat intelligence reports active exploitation in the wild. Leave empty to apply no floor.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"reachable_risk_floor":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Minimum Risk band for findings whose vulnerable code is confirmed reachable (observed at runtime, or a static call path from an entry point). Leave empty to apply no floor.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"unreachable_risk_ceiling":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Maximum Risk band for findings a source reports as unreachable, applied only when that verdict meets the minimum confidence below. Never closes or hides a finding — it only caps where it sorts. Leave empty to apply no ceiling.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"unreachable_ceiling_min_confidence":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"title":"Unreachable Ceiling Minimum Confidence","description":"Only cap a finding's Risk band when the unreachable verdict's confidence is at least this value. Capping on a low-confidence verdict is how a live Critical gets buried, so the ceiling is deliberately confidence-gated."},"finding_deployment_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of whether the finding is deployed in production."},"exposed_risk_floor":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Minimum Risk band for findings on assets that are reachable from the internet (fully or partially exposed). Leave empty to apply no floor.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"internal_only_risk_ceiling":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"title":"Isolated Risk Ceiling","description":"Maximum Risk band for findings on assets reported as isolated, applied only when that verdict meets the minimum confidence below. Never closes or hides a finding — it only caps where it sorts. Leave empty to apply no ceiling.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"internal_only_ceiling_min_confidence":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"title":"Isolated Ceiling Minimum Confidence","description":"Only cap a finding's Risk band when the isolation verdict's confidence is at least this value. A user's own exposure override is not confidence-gated — a person asserting isolation is the strongest statement available."}},"required":["async_updating","id","name"]},"PrioritizationEngineRequest":{"type":"object","description":"Base serializer for all models.","properties":{"name":{"type":"string","minLength":1,"maxLength":512},"description":{"type":"string","nullable":true},"finding_severity_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of severity."},"finding_external_score_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of external scoring mechanisms."},"finding_endpoints_ratio_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the ratio of endpoints on a finding compared to endpoints on product."},"product_business_criticality_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of business criticality."},"product_user_records_ratio_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the ratio of user records on the product relative to the total user records for the product type."},"product_revenue_ratio_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the ratio of product revenue relative to the total revenue for the product type."},"product_external_audience_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust how having an external audience impacts the product."},"product_internet_accessible_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust how internet accessibility impacts the product."},"finding_reachability_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of the finding's reachability verdict."},"finding_correlation_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of the blast radius of the finding's root cause."},"low_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Low risk findings."},"medium_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Medium risk findings."},"needs_action_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Needs Action risk findings."},"urgent_risk_threshold":{"type":"number","format":"double","minimum":1.0,"description":"Highest value Priority for Urgent risk findings."},"actively_exploited_risk_floor":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Minimum Risk band for findings whose threat intelligence reports active exploitation in the wild. Leave empty to apply no floor.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"reachable_risk_floor":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Minimum Risk band for findings whose vulnerable code is confirmed reachable (observed at runtime, or a static call path from an entry point). Leave empty to apply no floor.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"unreachable_risk_ceiling":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Maximum Risk band for findings a source reports as unreachable, applied only when that verdict meets the minimum confidence below. Never closes or hides a finding — it only caps where it sorts. Leave empty to apply no ceiling.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"unreachable_ceiling_min_confidence":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"title":"Unreachable Ceiling Minimum Confidence","description":"Only cap a finding's Risk band when the unreachable verdict's confidence is at least this value. Capping on a low-confidence verdict is how a live Critical gets buried, so the ceiling is deliberately confidence-gated."},"finding_deployment_scalar":{"type":"number","format":"double","maximum":2.0,"minimum":0.0,"description":"Scalar to adjust the impact of whether the finding is deployed in production."},"exposed_risk_floor":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"description":"Minimum Risk band for findings on assets that are reachable from the internet (fully or partially exposed). Leave empty to apply no floor.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"internal_only_risk_ceiling":{"enum":["Low","Medium","Needs Action","Urgent","",null],"type":"string","x-spec-enum-id":"c09ae27af59e77a8","nullable":true,"title":"Isolated Risk Ceiling","description":"Maximum Risk band for findings on assets reported as isolated, applied only when that verdict meets the minimum confidence below. Never closes or hides a finding — it only caps where it sorts. Leave empty to apply no ceiling.\n\n* `Low` - Low\n* `Medium` - Medium\n* `Needs Action` - Needs Action\n* `Urgent` - Urgent"},"internal_only_ceiling_min_confidence":{"type":"number","format":"double","maximum":1.0,"minimum":0.0,"title":"Isolated Ceiling Minimum Confidence","description":"Only cap a finding's Risk band when the isolation verdict's confidence is at least this value. A user's own exposure override is not confidence-gated — a person asserting isolation is the strongest statement available."}},"required":["name"]},"PriorityDrivers":{"type":"object","description":"Response schema of ``{id}/priority_drivers``.","properties":{"id":{"type":"integer"},"name":{"type":"string"},"organization":{"$ref":"#/components/schemas/_NamedRef"},"reasons":{"type":"array","items":{"type":"string"}},"missing_fields":{"type":"array","items":{"type":"string"}},"fields":{"type":"array","items":{"$ref":"#/components/schemas/_PriorityField"}},"prioritization_engine":{"allOf":[{"$ref":"#/components/schemas/_Engine"}],"nullable":true},"sla_configuration":{"$ref":"#/components/schemas/_Sla"}},"required":["fields","id","missing_fields","name","organization","prioritization_engine","reasons","sla_configuration"]},"ProAnsweredSurvey":{"type":"object","description":"Serializer for a ProAnsweredSurvey (Answered_Survey model).","properties":{"id":{"type":"integer","readOnly":true},"completed":{"type":"boolean"},"answered_on":{"type":"string","format":"date","nullable":true},"engagement":{"type":"integer","nullable":true},"survey":{"type":"integer"},"assignee":{"type":"integer","nullable":true},"responder":{"type":"integer","nullable":true},"prefetch":{"type":"object","properties":{"assignee":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"engagement":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/FindingEngagement"}},"responder":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}}}}},"required":["id","survey"]},"ProGeneratedReport":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255},"template":{"allOf":[{"$ref":"#/components/schemas/ProReportTemplateList"}],"readOnly":true},"requested_by":{"type":"string","readOnly":true},"requested_at":{"type":"string","format":"date-time","readOnly":true},"status":{"enum":["pending","processing","completed","failed"],"type":"string","description":"* `pending` - Pending\n* `processing` - Processing\n* `completed` - Completed\n* `failed` - Failed","x-spec-enum-id":"a8f61caf99619754","readOnly":true},"file_format":{"enum":["pdf","html","csv","xlsx","json"],"type":"string","description":"* `pdf` - PDF\n* `html` - HTML\n* `csv` - CSV\n* `xlsx` - Excel\n* `json` - JSON","x-spec-enum-id":"d56a1997f5638847"},"error_message":{"type":"string","readOnly":true},"completed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"variables":{}},"required":["completed_at","error_message","file_format","id","requested_at","requested_by","status","template"]},"ProGeneratedReportList":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"template_name":{"type":"string","readOnly":true},"requested_by":{"type":"string","readOnly":true},"requested_at":{"type":"string","format":"date-time","readOnly":true},"status":{"enum":["pending","processing","completed","failed"],"type":"string","description":"* `pending` - Pending\n* `processing` - Processing\n* `completed` - Completed\n* `failed` - Failed","x-spec-enum-id":"a8f61caf99619754"},"file_format":{"enum":["pdf","html","csv","xlsx","json"],"type":"string","description":"* `pdf` - PDF\n* `html` - HTML\n* `csv` - CSV\n* `xlsx` - Excel\n* `json` - JSON","x-spec-enum-id":"d56a1997f5638847"},"error_message":{"type":"string"},"completed_at":{"type":"string","format":"date-time","nullable":true}},"required":["file_format","id","name","requested_at","requested_by","template_name"]},"ProGeneratedReportRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":255},"template_id":{"type":"integer","writeOnly":true},"file_format":{"enum":["pdf","html","csv","xlsx","json"],"type":"string","description":"* `pdf` - PDF\n* `html` - HTML\n* `csv` - CSV\n* `xlsx` - Excel\n* `json` - JSON","x-spec-enum-id":"d56a1997f5638847"},"runtime_filters":{"writeOnly":true},"chart_snapshots":{"writeOnly":true},"variables":{}},"required":["file_format","template_id"]},"ProOpenSurvey":{"type":"object","description":"Serializer for a ProOpenSurvey (General_Survey model).","properties":{"id":{"type":"integer","readOnly":true},"num_responses":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"readOnly":true},"generated":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"expiration":{"type":"string","format":"date-time"},"survey":{"type":"integer"},"prefetch":{"type":"object","properties":{}}},"required":["generated","id","num_responses","survey"]},"ProOpenSurveyRequest":{"type":"object","description":"Serializer for a ProOpenSurvey (General_Survey model).","properties":{"expiration":{"type":"string","format":"date-time"},"survey":{"type":"integer"}},"required":["survey"]},"ProQuestion":{"type":"object","description":"Polymorphic serializer for a Question. Determines the correct subclass serializer to use and uses it.","properties":{"type":{"type":"string","description":"Type of question, e.g., 'text' or 'choice'"},"prefetch":{"type":"object","properties":{}}},"required":["type"]},"ProQuestionRequest":{"type":"object","description":"Polymorphic serializer for a Question. Determines the correct subclass serializer to use and uses it.","properties":{"type":{"type":"string","minLength":1,"description":"Type of question, e.g., 'text' or 'choice'"}},"required":["type"]},"ProReportBlock":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255},"block_type":{"enum":["tabular","detail","chart","stock","widget"],"type":"string","description":"* `tabular` - Tabular\n* `detail` - Detail\n* `chart` - Chart\n* `stock` - Stock\n* `widget` - Widget","x-spec-enum-id":"0cc06c78cd06dfb3"},"header":{"type":"string","nullable":true,"maxLength":255},"description":{"type":"string","nullable":true},"created_by":{"type":"string","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"tabular_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockTabularConfiguration"}],"nullable":true},"detail_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockDetailConfiguration"}],"nullable":true},"chart_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockChartConfiguration"}],"nullable":true},"stock_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockStockConfiguration"}],"nullable":true},"widget_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockWidgetConfiguration"}],"nullable":true},"filter_entries":{"type":"array","items":{"$ref":"#/components/schemas/ProReportBlockFilterEntry"}}},"required":["block_type","created","created_by","id","name","updated"]},"ProReportBlockChartConfiguration":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"model_choice":{"enum":["finding","asset","generic"],"type":"string","description":"* `finding` - Finding\n* `asset` - Asset\n* `generic` - Generic","x-spec-enum-id":"550d8682175db79a"},"chart_key":{"enum":["severity_over_time","status_over_time","active_age_by_severity","active_age_by_risk","average_time_to_remediation","findings_fixed","tests_performed","average_risk_over_time","total_by_risk_category","priority_distribution","open_findings_over_time","noise_reduction_by_category","noise_reduction_hours_saved","past_sla_by_asset","past_sla_by_organization","past_sla_by_severity_by_asset","assets_tested"],"type":"string","description":"* `severity_over_time` - Active Findings by Severity\n* `status_over_time` - Active, Mitigated, and Risk Accepted Findings\n* `active_age_by_severity` - Average Finding Age by Severity\n* `active_age_by_risk` - Average Finding Age by Risk\n* `average_time_to_remediation` - Average Time to Remediation\n* `findings_fixed` - Findings Fixed Over Time\n* `tests_performed` - Tests Performed Over Time\n* `average_risk_over_time` - Average Risk Over Time\n* `total_by_risk_category` - Total Findings by Risk Category\n* `priority_distribution` - Finding Priority Distribution\n* `open_findings_over_time` - Open Findings Over Time\n* `noise_reduction_by_category` - Noise Reduction by Category\n* `noise_reduction_hours_saved` - Noise Reduction / Hours Saved Over Time\n* `past_sla_by_asset` - Findings Past SLA by Asset\n* `past_sla_by_organization` - Findings Past SLA by Organization\n* `past_sla_by_severity_by_asset` - Severity of Findings Past SLA by Asset\n* `assets_tested` - Assets Tested Over Time","x-spec-enum-id":"4a6df9b2c86ac03b"},"date_range":{"type":"integer","maximum":3650,"minimum":1,"nullable":true,"description":"Trailing window in days (1-3650); leave empty for all time."}},"required":["chart_key","id","model_choice"]},"ProReportBlockChartConfigurationRequest":{"type":"object","properties":{"model_choice":{"enum":["finding","asset","generic"],"type":"string","description":"* `finding` - Finding\n* `asset` - Asset\n* `generic` - Generic","x-spec-enum-id":"550d8682175db79a"},"chart_key":{"enum":["severity_over_time","status_over_time","active_age_by_severity","active_age_by_risk","average_time_to_remediation","findings_fixed","tests_performed","average_risk_over_time","total_by_risk_category","priority_distribution","open_findings_over_time","noise_reduction_by_category","noise_reduction_hours_saved","past_sla_by_asset","past_sla_by_organization","past_sla_by_severity_by_asset","assets_tested"],"type":"string","description":"* `severity_over_time` - Active Findings by Severity\n* `status_over_time` - Active, Mitigated, and Risk Accepted Findings\n* `active_age_by_severity` - Average Finding Age by Severity\n* `active_age_by_risk` - Average Finding Age by Risk\n* `average_time_to_remediation` - Average Time to Remediation\n* `findings_fixed` - Findings Fixed Over Time\n* `tests_performed` - Tests Performed Over Time\n* `average_risk_over_time` - Average Risk Over Time\n* `total_by_risk_category` - Total Findings by Risk Category\n* `priority_distribution` - Finding Priority Distribution\n* `open_findings_over_time` - Open Findings Over Time\n* `noise_reduction_by_category` - Noise Reduction by Category\n* `noise_reduction_hours_saved` - Noise Reduction / Hours Saved Over Time\n* `past_sla_by_asset` - Findings Past SLA by Asset\n* `past_sla_by_organization` - Findings Past SLA by Organization\n* `past_sla_by_severity_by_asset` - Severity of Findings Past SLA by Asset\n* `assets_tested` - Assets Tested Over Time","x-spec-enum-id":"4a6df9b2c86ac03b"},"date_range":{"type":"integer","maximum":3650,"minimum":1,"nullable":true,"description":"Trailing window in days (1-3650); leave empty for all time."}},"required":["chart_key","model_choice"]},"ProReportBlockDetailConfiguration":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"model_choice":{"enum":["organization","asset","engagement","test","finding","test_type","risk_acceptance","location","url","dependency","location_asset"],"type":"string","description":"* `organization` - Organization\n* `asset` - Asset\n* `engagement` - Engagement\n* `test` - Test\n* `finding` - Finding\n* `test_type` - Test Type\n* `risk_acceptance` - Risk Acceptance\n* `location` - Location\n* `url` - URL\n* `dependency` - Dependency\n* `location_asset` - Location Asset","x-spec-enum-id":"eeba0930916c07c5"},"fields":{"type":"array","items":{"type":"string","maxLength":100}},"ordering":{"type":"string","nullable":true,"maxLength":100}},"required":["id","model_choice"]},"ProReportBlockDetailConfigurationRequest":{"type":"object","properties":{"model_choice":{"enum":["organization","asset","engagement","test","finding","test_type","risk_acceptance","location","url","dependency","location_asset"],"type":"string","description":"* `organization` - Organization\n* `asset` - Asset\n* `engagement` - Engagement\n* `test` - Test\n* `finding` - Finding\n* `test_type` - Test Type\n* `risk_acceptance` - Risk Acceptance\n* `location` - Location\n* `url` - URL\n* `dependency` - Dependency\n* `location_asset` - Location Asset","x-spec-enum-id":"eeba0930916c07c5"},"fields":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"ordering":{"type":"string","nullable":true,"maxLength":100}},"required":["model_choice"]},"ProReportBlockFilterEntry":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"field":{"type":"string","maxLength":255},"value":{"type":"string","maxLength":1000}},"required":["field","id","value"]},"ProReportBlockFilterEntryRequest":{"type":"object","properties":{"field":{"type":"string","minLength":1,"maxLength":255},"value":{"type":"string","minLength":1,"maxLength":1000}},"required":["field","value"]},"ProReportBlockList":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255},"block_type":{"enum":["tabular","detail","chart","stock","widget"],"type":"string","description":"* `tabular` - Tabular\n* `detail` - Detail\n* `chart` - Chart\n* `stock` - Stock\n* `widget` - Widget","x-spec-enum-id":"0cc06c78cd06dfb3"},"header":{"type":"string","nullable":true,"maxLength":255},"description":{"type":"string","nullable":true},"created_by":{"type":"string","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"configuration_summary":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"filter_count":{"type":"integer","readOnly":true}},"required":["block_type","configuration_summary","created","created_by","filter_count","id","name","updated"]},"ProReportBlockListRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"block_type":{"enum":["tabular","detail","chart","stock","widget"],"type":"string","description":"* `tabular` - Tabular\n* `detail` - Detail\n* `chart` - Chart\n* `stock` - Stock\n* `widget` - Widget","x-spec-enum-id":"0cc06c78cd06dfb3"},"header":{"type":"string","nullable":true,"maxLength":255},"description":{"type":"string","nullable":true}},"required":["block_type","name"]},"ProReportBlockRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"block_type":{"enum":["tabular","detail","chart","stock","widget"],"type":"string","description":"* `tabular` - Tabular\n* `detail` - Detail\n* `chart` - Chart\n* `stock` - Stock\n* `widget` - Widget","x-spec-enum-id":"0cc06c78cd06dfb3"},"header":{"type":"string","nullable":true,"maxLength":255},"description":{"type":"string","nullable":true},"tabular_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockTabularConfigurationRequest"}],"nullable":true},"detail_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockDetailConfigurationRequest"}],"nullable":true},"chart_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockChartConfigurationRequest"}],"nullable":true},"stock_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockStockConfigurationRequest"}],"nullable":true},"widget_configuration":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockWidgetConfigurationRequest"}],"nullable":true},"filter_entries":{"type":"array","items":{"$ref":"#/components/schemas/ProReportBlockFilterEntryRequest"}}},"required":["block_type","name"]},"ProReportBlockStockConfiguration":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"stock_type":{"enum":["cover_page","table_of_contents","page_break","image","text_block"],"type":"string","description":"* `cover_page` - Cover Page\n* `table_of_contents` - Table of Contents\n* `page_break` - Page Break\n* `image` - Image\n* `text_block` - Text Block","x-spec-enum-id":"6f28c5b5e37123d2"},"title":{"type":"string","nullable":true},"subtitle":{"type":"string","nullable":true},"image":{"type":"integer","nullable":true},"image_detail":{"allOf":[{"$ref":"#/components/schemas/File"}],"readOnly":true},"text_content":{"type":"string","nullable":true}},"required":["id","image_detail","stock_type"]},"ProReportBlockStockConfigurationRequest":{"type":"object","properties":{"stock_type":{"enum":["cover_page","table_of_contents","page_break","image","text_block"],"type":"string","description":"* `cover_page` - Cover Page\n* `table_of_contents` - Table of Contents\n* `page_break` - Page Break\n* `image` - Image\n* `text_block` - Text Block","x-spec-enum-id":"6f28c5b5e37123d2"},"title":{"type":"string","nullable":true},"subtitle":{"type":"string","nullable":true},"image":{"type":"integer","nullable":true},"image_file":{"type":"string","format":"binary","writeOnly":true,"nullable":true},"text_content":{"type":"string","nullable":true}},"required":["stock_type"]},"ProReportBlockTabularConfiguration":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"model_choice":{"enum":["organization","asset","engagement","test","finding","test_type","risk_acceptance","location","url","dependency","location_asset"],"type":"string","description":"* `organization` - Organization\n* `asset` - Asset\n* `engagement` - Engagement\n* `test` - Test\n* `finding` - Finding\n* `test_type` - Test Type\n* `risk_acceptance` - Risk Acceptance\n* `location` - Location\n* `url` - URL\n* `dependency` - Dependency\n* `location_asset` - Location Asset","x-spec-enum-id":"eeba0930916c07c5"},"fields":{"type":"array","items":{"type":"string","maxLength":100}},"ordering":{"type":"string","nullable":true,"maxLength":100}},"required":["id","model_choice"]},"ProReportBlockTabularConfigurationRequest":{"type":"object","properties":{"model_choice":{"enum":["organization","asset","engagement","test","finding","test_type","risk_acceptance","location","url","dependency","location_asset"],"type":"string","description":"* `organization` - Organization\n* `asset` - Asset\n* `engagement` - Engagement\n* `test` - Test\n* `finding` - Finding\n* `test_type` - Test Type\n* `risk_acceptance` - Risk Acceptance\n* `location` - Location\n* `url` - URL\n* `dependency` - Dependency\n* `location_asset` - Location Asset","x-spec-enum-id":"eeba0930916c07c5"},"fields":{"type":"array","items":{"type":"string","minLength":1,"maxLength":100}},"ordering":{"type":"string","nullable":true,"maxLength":100}},"required":["model_choice"]},"ProReportBlockWidgetConfiguration":{"type":"object","description":"A dashboard widget type plus that widget's own config object.\n\n``config`` is only shape-checked here. The real check needs the effective\n``widget_type`` (which on a partial update may live on the instance rather\nthan in the payload), so the parent runs the widget's own validator: see\n``ProReportBlockSerializer._validate_widget_configuration``.","properties":{"id":{"type":"integer","readOnly":true},"widget_type":{"type":"string","maxLength":50},"config":{}},"required":["id","widget_type"]},"ProReportBlockWidgetConfigurationRequest":{"type":"object","description":"A dashboard widget type plus that widget's own config object.\n\n``config`` is only shape-checked here. The real check needs the effective\n``widget_type`` (which on a partial update may live on the instance rather\nthan in the payload), so the parent runs the widget's own validator: see\n``ProReportBlockSerializer._validate_widget_configuration``.","properties":{"widget_type":{"type":"string","minLength":1,"maxLength":50},"config":{}},"required":["widget_type"]},"ProReportSchedule":{"type":"object","description":"A standing report request: template + format + filters, and the cadence it runs on.\n\nThe cadence is a nested ``schedule`` object: written as the same body the generic\n``/schedule`` sub-routes take (``trigger_expression`` cron, optional ``enabled``,\n``name``), read back as the full ``SchedulingServiceSchedule`` representation\n(``next_run``, ``last_run``, ``status``, ``trigger_expression_readable``).","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"Label carried onto every report this schedule generates. Blank falls back to the template name.","maxLength":255},"template":{"allOf":[{"$ref":"#/components/schemas/ProReportTemplateList"}],"readOnly":true},"file_format":{"enum":["pdf","html","csv","xlsx","json"],"type":"string","description":"* `pdf` - PDF\n* `html` - HTML\n* `csv` - CSV\n* `xlsx` - Excel\n* `json` - JSON","x-spec-enum-id":"d56a1997f5638847"},"runtime_filters":{},"variables":{},"created_by":{"type":"string","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"}},"required":["created","created_by","file_format","id","template","updated"]},"ProReportScheduleRequest":{"type":"object","description":"A standing report request: template + format + filters, and the cadence it runs on.\n\nThe cadence is a nested ``schedule`` object: written as the same body the generic\n``/schedule`` sub-routes take (``trigger_expression`` cron, optional ``enabled``,\n``name``), read back as the full ``SchedulingServiceSchedule`` representation\n(``next_run``, ``last_run``, ``status``, ``trigger_expression_readable``).","properties":{"name":{"type":"string","description":"Label carried onto every report this schedule generates. Blank falls back to the template name.","maxLength":255},"template_id":{"type":"integer","writeOnly":true},"file_format":{"enum":["pdf","html","csv","xlsx","json"],"type":"string","description":"* `pdf` - PDF\n* `html` - HTML\n* `csv` - CSV\n* `xlsx` - Excel\n* `json` - JSON","x-spec-enum-id":"d56a1997f5638847"},"runtime_filters":{},"variables":{},"schedule":{"type":"object","additionalProperties":{},"writeOnly":true}},"required":["file_format","schedule","template_id"]},"ProReportTemplate":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255},"description":{"type":"string","nullable":true,"default":""},"created_by":{"type":"string","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"template_blocks":{"type":"array","items":{"$ref":"#/components/schemas/ProReportTemplateBlock"},"readOnly":true},"theme":{"allOf":[{"$ref":"#/components/schemas/ProReportTheme"}],"readOnly":true}},"required":["created","created_by","id","name","template_blocks","theme","updated"]},"ProReportTemplateBlock":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"block":{"allOf":[{"$ref":"#/components/schemas/ProReportBlockList"}],"readOnly":true},"order":{"type":"integer","maximum":2147483647,"minimum":0}},"required":["block","id"]},"ProReportTemplateBlockRequest":{"type":"object","properties":{"block_id":{"type":"integer","writeOnly":true},"order":{"type":"integer","maximum":2147483647,"minimum":0}},"required":["block_id"]},"ProReportTemplateBlockWrite":{"type":"object","properties":{"block_id":{"type":"integer"},"order":{"type":"integer","maximum":2147483647,"minimum":0}},"required":["block_id"]},"ProReportTemplateBlockWriteRequest":{"type":"object","properties":{"block_id":{"type":"integer"},"order":{"type":"integer","maximum":2147483647,"minimum":0}},"required":["block_id"]},"ProReportTemplateList":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255},"description":{"type":"string"},"created_by":{"type":"string","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"block_count":{"type":"integer","readOnly":true}},"required":["block_count","created","created_by","id","name","updated"]},"ProReportTemplateListRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string"}},"required":["name"]},"ProReportTemplateRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"default":""},"template_blocks_write":{"type":"array","items":{"$ref":"#/components/schemas/ProReportTemplateBlockWriteRequest"},"writeOnly":true,"title":"Template Blocks"},"theme_id":{"type":"integer","writeOnly":true,"nullable":true,"title":"Theme"}},"required":["name"]},"ProReportTheme":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255},"primary_color":{"type":"string","maxLength":7},"secondary_color":{"type":"string","maxLength":7},"accent_color":{"type":"string","maxLength":7},"text_color":{"type":"string","maxLength":7},"background_color":{"type":"string","maxLength":7},"base_font_size":{"type":"integer","maximum":16,"minimum":8,"description":"Body font size of generated reports, in pixels."},"header_image":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"footer_image":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"footer_text":{"type":"string","nullable":true},"show_page_numbers":{"type":"boolean"},"created_by":{"type":"integer","readOnly":true,"nullable":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"}},"required":["created","created_by","footer_image","header_image","id","name","updated"]},"ProReportThemeRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"primary_color":{"type":"string","minLength":1,"maxLength":7},"secondary_color":{"type":"string","minLength":1,"maxLength":7},"accent_color":{"type":"string","minLength":1,"maxLength":7},"text_color":{"type":"string","minLength":1,"maxLength":7},"background_color":{"type":"string","minLength":1,"maxLength":7},"base_font_size":{"type":"integer","maximum":16,"minimum":8,"description":"Body font size of generated reports, in pixels."},"footer_text":{"type":"string","nullable":true},"show_page_numbers":{"type":"boolean"}},"required":["name"]},"ProSurvey":{"type":"object","description":"Serializer for a ProSurvey (Engagement_Survey model).","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":200},"description":{"type":"string"},"active":{"type":"boolean"},"questions":{"type":"array","items":{"type":"integer"}},"prefetch":{"type":"object","properties":{}}},"required":["id","questions"]},"ProSurveyRequest":{"type":"object","description":"Serializer for a ProSurvey (Engagement_Survey model).","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","minLength":1},"active":{"type":"boolean"},"questions":{"type":"array","items":{"type":"integer"}}},"required":["questions"]},"ProUserProfile":{"type":"object","description":"Restore the RBAC nested fields the OSS ``UserProfileSerializer`` dropped.\n\nThe 3.0 authorization refactor gutted OSS ``UserProfileSerializer`` down to\n``user`` / ``user_contact_info`` when RBAC moved to Pro, silently removing\n``global_role`` / ``dojo_group_member`` / ``product_member`` /\n``product_type_member`` from ``/api/v2/user_profile/``. Pro owns the RBAC\nmodels, so it re-exposes the same fields here using its own serializers.\nRead-only on this endpoint (the nested serializers' ``validate`` runs only on\nwrites, which this profile endpoint never performs).","properties":{"user":{"$ref":"#/components/schemas/User"},"user_contact_info":{"$ref":"#/components/schemas/UserContactInfo"},"global_role":{"$ref":"#/components/schemas/GlobalRole"},"dojo_group_member":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedDojoGroupMember"}},"product_type_member":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedProductTypeMember"}},"product_member":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedProductMember"}}},"required":["user"]},"Product":{"type":"object","description":"Refuse a *new* contact assignment to a deactivated account.\n\nAn inactive account exists to keep a historical reference readable, such as\nattribution for an import run by somebody who has since left. Picking one up as\na new contact turns that record back into a live relationship, which is what\nthe web UI's dropdowns have always refused (dojo.product.ui.forms.ProductForm).\nThis closes the same gap on the API.\n\nMix this into *every* serializer that writes one of ``CONTACT_FIELDS``,\nincluding alias serializers over the same model, so the rule holds wherever the\nfield is reachable.\n\nThe check hangs off ``run_validation`` rather than ``validate`` on purpose: a\nsubclass that defines its own ``validate`` would otherwise shadow the mixin's\nand silently drop the guard. It also means the Pro subclasses inherit the guard\nwithout a change of their own.\n\nNo-ops when the field is absent (replay-safe on PATCH), when the value is null\n(clearing a contact is always allowed), and when the submitted user already\nholds that field on this row. That last case is what keeps an existing\nassignment intact: a full PUT, and the Vue form's PATCH, both echo every\ncurrent value back, and rejecting the echo would delete a historical reference\nrather than protect it.","properties":{"id":{"type":"integer","readOnly":true},"findings_count":{"type":"integer","readOnly":true},"findings_list":{"type":"array","items":{"type":"integer"},"readOnly":true},"business_criticality":{"enum":["very high","high","medium","low","very low","none","",null],"type":"string","description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","x-spec-enum-id":"ef412461eb271471","nullable":true},"platform":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"lifecycle":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"origin":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"product_meta":{"type":"array","items":{"$ref":"#/components/schemas/ProductMeta"},"readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"name":{"type":"string","maxLength":255},"description":{"type":"string","maxLength":4000},"prod_numeric_grade":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"user_records":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"Estimate the number of user records within the application."},"revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Estimate the application's revenue."},"external_audience":{"type":"boolean","description":"Specify if the application is used by people outside the organization."},"internet_accessible":{"type":"boolean","description":"Specify if the application is accessible from the public internet."},"enable_product_tag_inheritance":{"type":"boolean","description":"Enables product tag inheritance. Any tags added on a product will automatically be added to all Engagements, Tests, and Findings"},"enable_simple_risk_acceptance":{"type":"boolean","description":"Allows simple risk acceptance by checking/unchecking a checkbox."},"enable_full_risk_acceptance":{"type":"boolean","description":"Allows full risk acceptance using a risk acceptance form, expiration date, uploaded proof, etc."},"disable_sla_breach_notifications":{"type":"boolean","description":"Disable SLA breach notifications if configured in the global settings"},"product_manager":{"type":"integer","nullable":true},"technical_contact":{"type":"integer","nullable":true},"team_manager":{"type":"integer","nullable":true},"prod_type":{"type":"integer"},"sla_configuration":{"type":"integer"},"authorized_users":{"type":"array","items":{"type":"integer"}},"regulations":{"type":"array","items":{"type":"integer"}},"tags":{"type":"array","items":{"type":"string"}}},"required":["created","description","findings_count","findings_list","id","name","prod_type","product_meta"]},"ProductAPIScanConfiguration":{"type":"object","description":"Enforce ``view_tool_configuration`` on ``tool_configuration`` writes.\n\nSelecting a ``tool_configuration`` lets an import run authenticated requests\nwith the credential stored on it, so it is gated by the same\n``view_tool_configuration`` permission that guards the tool-configuration\nviews, not just the object permission these endpoints already check.\n\nMix this into *every* serializer exposing the field, including alias\nserializers over the same model, so the rule holds wherever the field is\nreachable.\n\nThe check hangs off ``run_validation`` rather than ``validate`` on purpose: a\nsubclass that defines its own ``validate`` would otherwise shadow the mixin's\nand silently drop the guard.\n\nNo-ops when the field is absent (replay-safe on PATCH), mirroring\ndojo.authorization.api_permissions.check_update_permission.","properties":{"id":{"type":"integer","readOnly":true},"service_key_1":{"type":"string","nullable":true,"maxLength":200},"service_key_2":{"type":"string","nullable":true,"maxLength":200},"service_key_3":{"type":"string","nullable":true,"maxLength":200},"product":{"type":"integer"},"tool_configuration":{"type":"integer"},"prefetch":{"type":"object","properties":{"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"tool_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ToolConfiguration"}}}}},"required":["id","product","tool_configuration"]},"ProductAPIScanConfigurationRequest":{"type":"object","description":"Enforce ``view_tool_configuration`` on ``tool_configuration`` writes.\n\nSelecting a ``tool_configuration`` lets an import run authenticated requests\nwith the credential stored on it, so it is gated by the same\n``view_tool_configuration`` permission that guards the tool-configuration\nviews, not just the object permission these endpoints already check.\n\nMix this into *every* serializer exposing the field, including alias\nserializers over the same model, so the rule holds wherever the field is\nreachable.\n\nThe check hangs off ``run_validation`` rather than ``validate`` on purpose: a\nsubclass that defines its own ``validate`` would otherwise shadow the mixin's\nand silently drop the guard.\n\nNo-ops when the field is absent (replay-safe on PATCH), mirroring\ndojo.authorization.api_permissions.check_update_permission.","properties":{"service_key_1":{"type":"string","nullable":true,"maxLength":200},"service_key_2":{"type":"string","nullable":true,"maxLength":200},"service_key_3":{"type":"string","nullable":true,"maxLength":200},"product":{"type":"integer"},"tool_configuration":{"type":"integer"}},"required":["product","tool_configuration"]},"ProductCadenceStatus":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","readOnly":true},"product_name":{"type":"string","readOnly":true},"policy":{"type":"integer","readOnly":true},"policy_name":{"type":"string","readOnly":true},"status":{"enum":["compliant","due","overdue","never_scanned"],"type":"string","description":"* `compliant` - Compliant\n* `due` - Due\n* `overdue` - Overdue\n* `never_scanned` - Never scanned","x-spec-enum-id":"a57afa4f30880245","readOnly":true},"last_test_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last qualifying scan"},"last_test_type":{"type":"integer","readOnly":true,"nullable":true,"title":"Last qualifying test type"},"last_test_type_name":{"type":"string","readOnly":true},"overdue_since":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"computed_at":{"type":"string","format":"date-time","readOnly":true},"interval_days":{"type":"integer","readOnly":true},"grace_days":{"type":"integer","readOnly":true}},"required":["computed_at","grace_days","id","interval_days","last_test_at","last_test_type","last_test_type_name","overdue_since","policy","policy_name","product","product_name","status"]},"ProductExposureBatchRequest":{"type":"object","description":"Provider-facing batch, which has to name the asset it is talking about.","properties":{"source":{"type":"string","minLength":1,"maxLength":300},"items":{"type":"array","items":{"$ref":"#/components/schemas/ExposureItemRequest"}},"product":{"type":"integer"}},"required":["items","product","source"]},"ProductLifecycle":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"value":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","maxLength":50},"name":{"type":"string","description":"Label shown in dropdowns and on the asset.","maxLength":200},"icon":{"type":"string","description":"Optional Font Awesome icon class (classic UI only).","maxLength":100},"display_order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Optional ordering for the dropdown (lower first)."}},"required":["id","name","value"]},"ProductLifecycleRequest":{"type":"object","properties":{"value":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","maxLength":50},"name":{"type":"string","minLength":1,"description":"Label shown in dropdowns and on the asset.","maxLength":200},"icon":{"type":"string","description":"Optional Font Awesome icon class (classic UI only).","maxLength":100},"display_order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Optional ordering for the dropdown (lower first)."}},"required":["name","value"]},"ProductMeta":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"value":{"type":"string","maxLength":300}},"required":["name","value"]},"ProductOrigin":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"value":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","maxLength":50},"name":{"type":"string","description":"Label shown in dropdowns and on the asset.","maxLength":200},"icon":{"type":"string","description":"Optional Font Awesome icon class (classic UI only).","maxLength":100},"display_order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Optional ordering for the dropdown (lower first)."}},"required":["id","name","value"]},"ProductOriginRequest":{"type":"object","properties":{"value":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","maxLength":50},"name":{"type":"string","minLength":1,"description":"Label shown in dropdowns and on the asset.","maxLength":200},"icon":{"type":"string","description":"Optional Font Awesome icon class (classic UI only).","maxLength":100},"display_order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Optional ordering for the dropdown (lower first)."}},"required":["name","value"]},"ProductPlatform":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"value":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","maxLength":50},"name":{"type":"string","description":"Label shown in dropdowns and on the asset.","maxLength":200},"icon":{"type":"string","description":"Optional Font Awesome icon class (classic UI only).","maxLength":100},"display_order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Optional ordering for the dropdown (lower first)."}},"required":["id","name","value"]},"ProductPlatformRequest":{"type":"object","properties":{"value":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","maxLength":50},"name":{"type":"string","minLength":1,"description":"Label shown in dropdowns and on the asset.","maxLength":200},"icon":{"type":"string","description":"Optional Font Awesome icon class (classic UI only).","maxLength":100},"display_order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Optional ordering for the dropdown (lower first)."}},"required":["name","value"]},"ProductType":{"type":"object","description":"Enforce the member-management permission on ``authorized_users`` writes.\n\n``authorized_users`` is a writable M2M on ``Product`` and ``Product_Type``, so\nevery ``ModelSerializer`` over those models picks it up unless it is explicitly\nexcluded. Object access is derived from that list, which makes writing it a\nmember-management operation rather than an ordinary edit: it is gated behind\n``Product_Manage_Members`` / ``Product_Type_Manage_Members``, the same\npermissions the web UI requires (dojo.product.ui.views.add_product_authorized_users).\nThe rest of these endpoints is governed by the corresponding ``_Edit`` permission.\n\nMix this into *every* serializer exposing the field, including alias\nserializers over the same models, so the rule holds wherever the field is\nreachable. The permission is derived from ``Meta.model``, so there is nothing\nper-serializer to configure or forget.\n\nThe check hangs off ``run_validation`` rather than ``validate`` on purpose: a\nsubclass that defines its own ``validate`` would otherwise shadow the mixin's\nand silently drop the guard.\n\nNo-ops when the field is absent or unchanged (replay-safe), mirroring\ndojo.authorization.api_permissions.check_update_permission.","properties":{"id":{"type":"integer","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"name":{"type":"string","maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000},"critical_product":{"type":"boolean"},"key_product":{"type":"boolean"},"authorized_users":{"type":"array","items":{"type":"integer"}}},"required":["created","id","name","updated"]},"Products":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"id":{"type":"integer","readOnly":true},"findings_count":{"type":"integer","readOnly":true},"findings_list":{"type":"array","items":{"type":"integer"},"readOnly":true},"business_criticality":{"enum":["very high","high","medium","low","very low","none","",null],"type":"string","description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","x-spec-enum-id":"ef412461eb271471","nullable":true},"platform":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"lifecycle":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"origin":{"type":"string","description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"product_meta":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldValueMeta"},"readOnly":true},"parent":{"type":"integer","nullable":true},"members":{"type":"array","items":{"type":"integer"},"readOnly":true},"authorization_groups":{"type":"array","items":{"type":"integer"},"readOnly":true},"prioritization_engine":{"type":"integer","nullable":true},"asset_type":{"type":"string","description":"Stable lookup key, e.g. 'repository'. Referenced by connectors and imports.","nullable":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"name":{"type":"string","maxLength":255},"description":{"type":"string","maxLength":4000},"prod_numeric_grade":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"user_records":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"Estimate the number of user records within the application."},"revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Estimate the application's revenue."},"external_audience":{"type":"boolean","description":"Specify if the application is used by people outside the organization."},"internet_accessible":{"type":"boolean","description":"Specify if the application is accessible from the public internet."},"enable_product_tag_inheritance":{"type":"boolean","description":"Enables product tag inheritance. Any tags added on a product will automatically be added to all Engagements, Tests, and Findings"},"enable_simple_risk_acceptance":{"type":"boolean","description":"Allows simple risk acceptance by checking/unchecking a checkbox."},"enable_full_risk_acceptance":{"type":"boolean","description":"Allows full risk acceptance using a risk acceptance form, expiration date, uploaded proof, etc."},"disable_sla_breach_notifications":{"type":"boolean","description":"Disable SLA breach notifications if configured in the global settings"},"product_manager":{"type":"integer","nullable":true},"technical_contact":{"type":"integer","nullable":true},"team_manager":{"type":"integer","nullable":true},"prod_type":{"type":"integer"},"sla_configuration":{"type":"integer"},"regulations":{"type":"array","items":{"type":"integer"}},"tags":{"type":"array","items":{"type":"string"}},"prefetch":{"type":"object","properties":{"authorized_users":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"prod_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ProductType"}},"product_manager":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"regulations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Regulation"}},"sla_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/SLAConfiguration"}},"team_manager":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"technical_contact":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"locations":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/LocationProductReference"}}}}},"required":["authorization_groups","created","description","findings_count","findings_list","id","members","name","prod_type","product_meta"]},"ProductsRequest":{"type":"object","description":"Extend from the BaseModelSerializer to allow for generalized extensions.","properties":{"business_criticality":{"enum":["very high","high","medium","low","very low","none","",null],"type":"string","description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","x-spec-enum-id":"ef412461eb271471","nullable":true},"platform":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"lifecycle":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"origin":{"type":"string","minLength":1,"description":"Stable machine value used by the API, imports and automation rules. Immutable once created.","nullable":true},"parent":{"type":"integer","nullable":true},"prioritization_engine":{"type":"integer","nullable":true},"asset_type":{"type":"string","minLength":1,"description":"Stable lookup key, e.g. 'repository'. Referenced by connectors and imports.","nullable":true},"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","minLength":1,"maxLength":4000},"prod_numeric_grade":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"user_records":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"Estimate the number of user records within the application."},"revenue":{"type":"string","format":"decimal","pattern":"^-?\\d{0,13}(?:\\.\\d{0,2})?$","nullable":true,"description":"Estimate the application's revenue."},"external_audience":{"type":"boolean","description":"Specify if the application is used by people outside the organization."},"internet_accessible":{"type":"boolean","description":"Specify if the application is accessible from the public internet."},"enable_product_tag_inheritance":{"type":"boolean","description":"Enables product tag inheritance. Any tags added on a product will automatically be added to all Engagements, Tests, and Findings"},"enable_simple_risk_acceptance":{"type":"boolean","description":"Allows simple risk acceptance by checking/unchecking a checkbox."},"enable_full_risk_acceptance":{"type":"boolean","description":"Allows full risk acceptance using a risk acceptance form, expiration date, uploaded proof, etc."},"disable_sla_breach_notifications":{"type":"boolean","description":"Disable SLA breach notifications if configured in the global settings"},"product_manager":{"type":"integer","nullable":true},"technical_contact":{"type":"integer","nullable":true},"team_manager":{"type":"integer","nullable":true},"prod_type":{"type":"integer"},"sla_configuration":{"type":"integer"},"regulations":{"type":"array","items":{"type":"integer"}},"tags":{"type":"array","items":{"type":"string","minLength":1}}},"required":["description","name","prod_type"]},"PsirtAdvisory":{"type":"object","description":"An advisory, its nested timeline, and everything a workbench needs to render it.","properties":{"id":{"type":"integer","readOnly":true},"advisory_id":{"type":"string","maxLength":100},"title":{"type":"string","maxLength":500},"status":{"enum":["draft","review","approved","published","revised","superseded"],"type":"string","description":"* `draft` - Draft\n* `review` - In Review\n* `approved` - Approved\n* `published` - Published\n* `revised` - Revised\n* `superseded` - Superseded","x-spec-enum-id":"d964746435c55bc3","readOnly":true},"summary":{"type":"string"},"impact":{"type":"string"},"remediation":{"type":"string"},"external_ticket_id":{"type":"string","maxLength":100},"external_ticket_url":{"type":"string","maxLength":1000},"reception_date":{"type":"string","format":"date","nullable":true,"description":"When the underlying issue was first reported to us"},"disclosure_date":{"type":"string","format":"date","nullable":true,"description":"Planned or actual public disclosure date"},"disclosure_label":{"type":"string","description":"How the disclosure date is described publicly, e.g. 'Q3 2026'","maxLength":100},"feedback_deadline":{"type":"string","format":"date","nullable":true,"description":"Date by which recipients are asked to respond"},"issue_priority":{"type":"string","maxLength":20},"is_candidate":{"type":"boolean","description":"A draft the engine proposed, not yet adopted by a human"},"audit_state":{"enum":["pending","in_progress","undergoing_reanalysis","delayed"],"type":"string","description":"* `pending` - Pending\n* `in_progress` - In Progress\n* `undergoing_reanalysis` - Undergoing Reanalysis\n* `delayed` - Delayed","x-spec-enum-id":"2b8b0ea58a8a8981"},"current_version":{"type":"integer","readOnly":true,"description":"Bumped on each revision. Snapshots record which version they froze"},"published_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"revised_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"embargoed_until":{"type":"string","format":"date-time","nullable":true,"description":"Publishing is refused before this moment, whatever the schedule says"},"scheduled_publish_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"When an armed schedule will fire"},"last_schedule_error":{"type":"string","readOnly":true},"staleness_state":{"enum":["fresh","stale_source","stale_enrichment","stale_both"],"type":"string","description":"* `fresh` - Fresh\n* `stale_source` - Source Changed\n* `stale_enrichment` - Enrichment Changed\n* `stale_both` - Source and Enrichment Changed","x-spec-enum-id":"1489887810d366b7","readOnly":true},"lineage_id":{"type":"string","format":"uuid","readOnly":true,"nullable":true,"description":"Shared by an advisory and its revisions, so a reader can follow one story across supersessions"},"author":{"type":"integer","nullable":true},"author_username":{"type":"string","readOnly":true},"approved_by_username":{"type":"string","readOnly":true},"published_by_username":{"type":"string","readOnly":true},"locked_by":{"type":"integer","readOnly":true,"nullable":true},"locked_by_username":{"type":"string","readOnly":true},"lock_expires_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"milestones":{"type":"array","items":{"$ref":"#/components/schemas/PsirtAdvisoryMilestone"}},"signoff_state":{"type":"object","additionalProperties":{},"readOnly":true},"recipients":{"type":"object","additionalProperties":{},"readOnly":true},"preflight":{"type":"object","additionalProperties":{},"readOnly":true},"can_publish":{"type":"object","additionalProperties":{},"description":"Whether publishing would succeed, and the reason if not.\n\nServed rather than left to the client so the button's enabled state and the\nserver's refusal are the same judgement. A UI deriving this from status and\nsignoff counts would offer publish on an embargoed advisory.","readOnly":true},"available_transitions":{"type":"array","items":{"type":"string"},"readOnly":true},"delivery_state":{"type":"object","additionalProperties":{},"readOnly":true},"case_count":{"type":"integer","readOnly":true,"default":0},"cases":{"type":"array","items":{"$ref":"#/components/schemas/PsirtAdvisoryCaseRow"},"readOnly":true},"cra_article14_suggested":{"type":"boolean","description":"Whether any attached case warrants a CRA Article 14 early-warning report.\n\nComputed only for the detail view, like the case field, so the advisory list does\nnot pay the per-case cost.","readOnly":true},"comment_count":{"type":"integer","readOnly":true,"default":0},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["approved_by_username","author_username","available_transitions","can_publish","case_count","cases","comment_count","cra_article14_suggested","created_at","current_version","delivery_state","id","last_schedule_error","lineage_id","lock_expires_at","locked_by","locked_by_username","preflight","published_at","published_by_username","recipients","revised_at","scheduled_publish_at","signoff_state","staleness_state","status","title","updated_at"]},"PsirtAdvisoryCaseRow":{"type":"object","description":"The compact case row the workbench lists — read-only by construction.\n\nThree fields, and deliberately no state column: ``PsirtCase`` has no single\nstatus (it carries disclosure and mitigation states separately), and the\nfirst draft of this serializer invented one — every advisory render 500d.","properties":{"id":{"type":"integer"},"reference_id":{"type":"string"},"title":{"type":"string"}},"required":["id","reference_id","title"]},"PsirtAdvisoryComment":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"advisory":{"type":"integer"},"section":{"type":"string","description":"Which part of the advisory the note is about, e.g. summary / impact","maxLength":50},"author":{"type":"integer","readOnly":true,"nullable":true},"author_username":{"type":"string","readOnly":true},"body":{"type":"string"},"kind":{"enum":["approval","question","blocking_rejection"],"type":"string","description":"* `approval` - Approval Note\n* `question` - Question\n* `blocking_rejection` - Blocking Rejection","x-spec-enum-id":"a12c23b8d766b4e7"},"state":{"enum":["unaddressed","addressed","resolved_by_revision"],"type":"string","description":"* `unaddressed` - Unaddressed\n* `addressed` - Addressed\n* `resolved_by_revision` - Resolved by Revision","x-spec-enum-id":"776cb7e2f046dff8"},"created_at":{"type":"string","format":"date-time","readOnly":true},"resolved_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"resolved_by":{"type":"integer","readOnly":true,"nullable":true},"resolved_by_username":{"type":"string","readOnly":true}},"required":["advisory","author","author_username","body","created_at","id","resolved_at","resolved_by","resolved_by_username"]},"PsirtAdvisoryCommentRequest":{"type":"object","properties":{"advisory":{"type":"integer"},"section":{"type":"string","description":"Which part of the advisory the note is about, e.g. summary / impact","maxLength":50},"body":{"type":"string","minLength":1},"kind":{"enum":["approval","question","blocking_rejection"],"type":"string","description":"* `approval` - Approval Note\n* `question` - Question\n* `blocking_rejection` - Blocking Rejection","x-spec-enum-id":"a12c23b8d766b4e7"},"state":{"enum":["unaddressed","addressed","resolved_by_revision"],"type":"string","description":"* `unaddressed` - Unaddressed\n* `addressed` - Addressed\n* `resolved_by_revision` - Resolved by Revision","x-spec-enum-id":"776cb7e2f046dff8"}},"required":["advisory","body"]},"PsirtAdvisoryManualTarget":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"advisory":{"type":"integer"},"product_type":{"type":"integer"},"product_type_name":{"type":"string","readOnly":true},"product":{"type":"integer","nullable":true,"description":"Null targets the whole product type"},"product_name":{"type":"string","readOnly":true},"source":{"enum":["auto","manual","excluded"],"type":"string","description":"* `auto` - Derived\n* `manual` - Added by Hand\n* `excluded` - Excluded by Hand","x-spec-enum-id":"8d02a220e0c06746"},"justification":{"type":"string"},"added_by":{"type":"integer","readOnly":true,"nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true}},"required":["added_by","advisory","created_at","id","product_name","product_type_name"]},"PsirtAdvisoryManualTargetRequest":{"type":"object","properties":{"advisory":{"type":"integer"},"product_type":{"type":"integer"},"product":{"type":"integer","nullable":true,"description":"Null targets the whole product type"},"source":{"enum":["auto","manual","excluded"],"type":"string","description":"* `auto` - Derived\n* `manual` - Added by Hand\n* `excluded` - Excluded by Hand","x-spec-enum-id":"8d02a220e0c06746"},"justification":{"type":"string"}},"required":["advisory"]},"PsirtAdvisoryMilestone":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"label":{"type":"string","maxLength":255},"date":{"type":"string","format":"date","nullable":true},"order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Render position. Ties break by primary key, which is insertion order — the content fingerprint reproduces exactly that sequence"},"notes":{"type":"string"}},"required":["id","label"]},"PsirtAdvisoryMilestoneRequest":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":255},"date":{"type":"string","format":"date","nullable":true},"order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Render position. Ties break by primary key, which is insertion order — the content fingerprint reproduces exactly that sequence"},"notes":{"type":"string"}},"required":["label"]},"PsirtAdvisoryRequest":{"type":"object","description":"An advisory, its nested timeline, and everything a workbench needs to render it.","properties":{"advisory_id":{"type":"string","maxLength":100},"title":{"type":"string","minLength":1,"maxLength":500},"summary":{"type":"string"},"impact":{"type":"string"},"remediation":{"type":"string"},"external_ticket_id":{"type":"string","maxLength":100},"external_ticket_url":{"type":"string","maxLength":1000},"reception_date":{"type":"string","format":"date","nullable":true,"description":"When the underlying issue was first reported to us"},"disclosure_date":{"type":"string","format":"date","nullable":true,"description":"Planned or actual public disclosure date"},"disclosure_label":{"type":"string","description":"How the disclosure date is described publicly, e.g. 'Q3 2026'","maxLength":100},"feedback_deadline":{"type":"string","format":"date","nullable":true,"description":"Date by which recipients are asked to respond"},"issue_priority":{"type":"string","maxLength":20},"is_candidate":{"type":"boolean","description":"A draft the engine proposed, not yet adopted by a human"},"audit_state":{"enum":["pending","in_progress","undergoing_reanalysis","delayed"],"type":"string","description":"* `pending` - Pending\n* `in_progress` - In Progress\n* `undergoing_reanalysis` - Undergoing Reanalysis\n* `delayed` - Delayed","x-spec-enum-id":"2b8b0ea58a8a8981"},"embargoed_until":{"type":"string","format":"date-time","nullable":true,"description":"Publishing is refused before this moment, whatever the schedule says"},"author":{"type":"integer","nullable":true},"milestones":{"type":"array","items":{"$ref":"#/components/schemas/PsirtAdvisoryMilestoneRequest"}}},"required":["title"]},"PsirtAdvisorySignoff":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"advisory":{"type":"integer"},"reviewer":{"type":"integer"},"reviewer_username":{"type":"string","readOnly":true},"role":{"type":"string","description":"What the reviewer is signing off as, e.g. engineering / legal / product","maxLength":50},"status":{"enum":["pending","approved","rejected","recused"],"type":"string","description":"* `pending` - Pending\n* `approved` - Approved\n* `rejected` - Rejected\n* `recused` - Recused","x-spec-enum-id":"5e5c7e44d79f6606","readOnly":true},"comment":{"type":"string"},"requested_at":{"type":"string","format":"date-time","readOnly":true},"responded_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"stale":{"type":"boolean","description":"Whether this approval still covers the current content.\n\nComputed here rather than client-side: a client comparing fingerprints would\nneed the projection rules, and any divergence would show a reviewer as approved\nwhile the server refuses to publish.","readOnly":true}},"required":["advisory","id","requested_at","responded_at","reviewer","reviewer_username","role","stale","status"]},"PsirtAdvisorySnapshot":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"version":{"type":"integer","readOnly":true,"description":"The advisory version this froze"},"content":{"readOnly":true,"description":"The rendered advisory payload"},"content_fingerprint":{"type":"string","readOnly":true,"description":"The content hash at publish time, for comparison against a later state"},"branding":{"readOnly":true,"nullable":true,"description":"The branding applied, captured so a re-render matches the original"},"created_at":{"type":"string","format":"date-time","readOnly":true},"created_by_username":{"type":"string","readOnly":true}},"required":["branding","content","content_fingerprint","created_at","created_by_username","id","version"]},"PsirtAffectedProduct":{"type":"object","description":"One structured affected-product row, as the source or NVD stated it.","properties":{"id":{"type":"integer","readOnly":true},"vendor":{"type":"string","readOnly":true,"description":"Vendor name (e.g. 'openssl', 'apache')"},"product":{"type":"string","readOnly":true,"description":"Product name (e.g. 'openssl', 'httpd')"},"version_start":{"type":"string","readOnly":true,"nullable":true,"description":"Start of the affected version range"},"version_start_type":{"enum":["including","excluding",null],"type":"string","x-spec-enum-id":"3bed659509cc85fa","readOnly":true,"nullable":true,"description":"Whether version_start is 'including' or 'excluding'\n\n* `including` - Including\n* `excluding` - Excluding"},"version_end":{"type":"string","readOnly":true,"nullable":true,"description":"End of the affected version range"},"version_end_type":{"enum":["including","excluding",null],"type":"string","x-spec-enum-id":"3bed659509cc85fa","readOnly":true,"nullable":true,"description":"Whether version_end is 'including' or 'excluding'\n\n* `including` - Including\n* `excluding` - Excluding"},"version_range":{"type":"string","description":"Human-readable range, with the inclusivity spelled out.\n\n``< 2.9.14`` and ``<= 2.9.14`` are different claims about who is\naffected, so the boundary is rendered as an operator rather than dropped\nthe way a bare \"2.9.0 - 2.9.14\" would drop it.","readOnly":true},"cpe":{"type":"string","readOnly":true,"nullable":true,"description":"Full CPE URI if available"},"source":{"type":"string","readOnly":true,"description":"Data source: NVD, EUVD, KEV"}},"required":["cpe","id","product","source","vendor","version_end","version_end_type","version_range","version_start","version_start_type"]},"PsirtCase":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","description":"What this case is about, in one line","maxLength":500},"reference_id":{"type":"string","readOnly":true,"nullable":true,"description":"Human tracking id, e.g. CASE-2026-0001"},"disclosure_status":{"enum":["draft","embargoed","coordinated","public"],"type":"string","description":"* `draft` - Draft\n* `embargoed` - Embargoed\n* `coordinated` - Coordinated\n* `public` - Public","x-spec-enum-id":"078e06464495f1eb"},"disclosure_date":{"type":"string","format":"date-time","nullable":true,"description":"Planned or actual disclosure date"},"closed_at":{"type":"string","format":"date-time","nullable":true,"description":"When the case was concluded. Null = open"},"is_open":{"type":"boolean","readOnly":true},"mitigation_priority":{"enum":["p0k_crisis","p1_high","p2_medium","p3_low","",null],"type":"string","x-spec-enum-id":"4cf17c56b9aa4d22","nullable":true,"description":"Response tier. Null until an analyst or the worthiness pass sets one\n\n* `p0k_crisis` - P0/K — Crisis\n* `p1_high` - P1 — High\n* `p2_medium` - P2 — Medium\n* `p3_low` - P3 — Low"},"mitigation_status":{"enum":["not_started","in_analysis","awaiting_vendor","fix_available","mitigated","accepted_risk","not_affected"],"type":"string","description":"* `not_started` - Not Started\n* `in_analysis` - In Analysis\n* `awaiting_vendor` - Awaiting Vendor\n* `fix_available` - Fix Available\n* `mitigated` - Mitigated\n* `accepted_risk` - Accepted Risk\n* `not_affected` - Not Affected","x-spec-enum-id":"b77278205bb2bf21"},"max_cvss":{"type":"number","format":"double","nullable":true},"max_epss":{"type":"number","format":"double","nullable":true},"max_pcrss":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"scores_overridden":{"type":"boolean","description":"True when a human set the scores. The roll-up leaves an overridden case alone"},"oldest_ingestion_date":{"type":"string","format":"date","readOnly":true,"nullable":true,"description":"Earliest advisory in this case — how long the problem has been visible"},"analysis_notes":{"type":"string","nullable":true},"analyst":{"type":"integer","nullable":true,"description":"Who owns this case"},"analyst_username":{"type":"string","readOnly":true},"match_count":{"type":"integer","readOnly":true,"default":0},"advisory_count":{"type":"integer","readOnly":true,"default":0},"component_count":{"type":"integer","readOnly":true,"default":0},"attachment_count":{"type":"integer","readOnly":true,"default":0},"sla":{"type":"array","items":{},"description":"The clocks running against this case's advisories.\n\nA case has no clock of its own — the obligation belongs to the records inside\nit — so this gathers the clocks on its advisories. Presented on the case\nbecause \"is this late?\" is a question people ask of the work item.","readOnly":true},"cra_article14_suggested":{"type":"boolean","description":"Whether this case warrants a CRA Article 14 early-warning report.\n\nComputed only for the detail view: the case drawer renders the suggestion banner,\nand evaluating the condition per row on the queue would add queries to a list that\nnever shows it.","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["advisory_count","analyst_username","attachment_count","component_count","cra_article14_suggested","created_at","id","is_open","match_count","oldest_ingestion_date","reference_id","sla","title","updated_at"]},"PsirtCaseAttachment":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"case":{"type":"integer"},"file":{"type":"string","format":"uri"},"filename":{"type":"string","description":"The name the uploader gave it, kept for display","maxLength":500},"content_type":{"type":"string","maxLength":255},"size_bytes":{"type":"integer","maximum":9223372036854775807,"minimum":-9223372036854775808,"format":"int64","nullable":true},"description":{"type":"string"},"uploaded_by":{"type":"integer","readOnly":true,"nullable":true},"uploaded_by_username":{"type":"string","readOnly":true},"uploaded_at":{"type":"string","format":"date-time","readOnly":true}},"required":["case","file","filename","id","uploaded_at","uploaded_by","uploaded_by_username"]},"PsirtCaseAttachmentRequest":{"type":"object","properties":{"case":{"type":"integer"},"file":{"type":"string","format":"binary"},"filename":{"type":"string","minLength":1,"description":"The name the uploader gave it, kept for display","maxLength":500},"content_type":{"type":"string","maxLength":255},"size_bytes":{"type":"integer","maximum":9223372036854775807,"minimum":-9223372036854775808,"format":"int64","nullable":true},"description":{"type":"string"}},"required":["case","file","filename"]},"PsirtCaseRequest":{"type":"object","properties":{"title":{"type":"string","minLength":1,"description":"What this case is about, in one line","maxLength":500},"disclosure_status":{"enum":["draft","embargoed","coordinated","public"],"type":"string","description":"* `draft` - Draft\n* `embargoed` - Embargoed\n* `coordinated` - Coordinated\n* `public` - Public","x-spec-enum-id":"078e06464495f1eb"},"disclosure_date":{"type":"string","format":"date-time","nullable":true,"description":"Planned or actual disclosure date"},"closed_at":{"type":"string","format":"date-time","nullable":true,"description":"When the case was concluded. Null = open"},"mitigation_priority":{"enum":["p0k_crisis","p1_high","p2_medium","p3_low","",null],"type":"string","x-spec-enum-id":"4cf17c56b9aa4d22","nullable":true,"description":"Response tier. Null until an analyst or the worthiness pass sets one\n\n* `p0k_crisis` - P0/K — Crisis\n* `p1_high` - P1 — High\n* `p2_medium` - P2 — Medium\n* `p3_low` - P3 — Low"},"mitigation_status":{"enum":["not_started","in_analysis","awaiting_vendor","fix_available","mitigated","accepted_risk","not_affected"],"type":"string","description":"* `not_started` - Not Started\n* `in_analysis` - In Analysis\n* `awaiting_vendor` - Awaiting Vendor\n* `fix_available` - Fix Available\n* `mitigated` - Mitigated\n* `accepted_risk` - Accepted Risk\n* `not_affected` - Not Affected","x-spec-enum-id":"b77278205bb2bf21"},"max_cvss":{"type":"number","format":"double","nullable":true},"max_epss":{"type":"number","format":"double","nullable":true},"max_pcrss":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"scores_overridden":{"type":"boolean","description":"True when a human set the scores. The roll-up leaves an overridden case alone"},"analysis_notes":{"type":"string","nullable":true},"analyst":{"type":"integer","nullable":true,"description":"Who owns this case"}},"required":["title"]},"PsirtComponentInventoryRow":{"type":"object","description":"One (component, product) inventory row with its PSIRT overlay.\n\nA read-only projection over ``LocationProductReference``: the inventory is\nowned by the SBOM importer, and this page annotates it rather than editing\nit. The profile columns come from annotation subqueries — null when no\nanalyst has touched the pair — and the match counts are per *component*,\nbecause a match records the dependency that fired, not the pair.","properties":{"id":{"type":"integer","readOnly":true},"dependency":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"version":{"type":"string","readOnly":true,"nullable":true},"purl_type":{"type":"string","readOnly":true,"nullable":true},"namespace":{"type":"string","readOnly":true,"nullable":true},"product":{"type":"integer","readOnly":true},"product_name":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true},"profile_id":{"type":"integer","readOnly":true,"nullable":true},"pcrss_score":{"type":"integer","readOnly":true,"nullable":true},"cpe":{"type":"string","readOnly":true,"nullable":true},"tags":{"type":"array","items":{"type":"string"},"readOnly":true},"match_count":{"type":"integer","readOnly":true},"verified_match_count":{"type":"integer","readOnly":true}},"required":["cpe","dependency","id","match_count","name","namespace","pcrss_score","product","product_name","profile_id","purl_type","status","tags","verified_match_count","version"]},"PsirtComponentProfile":{"type":"object","description":"One (dependency, product) annotation, with the inventory it annotates.","properties":{"id":{"type":"integer","readOnly":true},"dependency":{"type":"integer","description":"The inventory row this profile annotates"},"dependency_name":{"type":"string","readOnly":true},"dependency_version":{"type":"string","readOnly":true},"dependency_purl":{"type":"string","nullable":true,"description":"The purl the profile hangs off, so a row is identifiable without a join.","readOnly":true},"product":{"type":"integer","description":"The product the annotation applies within; judgement is per-product"},"product_name":{"type":"string","readOnly":true},"pcrss_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"Static component risk rating per PSIRT policy (1-5). Inherited by matches on this dependency unless an analyst overrides it on the match"},"cpe":{"type":"string","nullable":true,"description":"Analyst-supplied Common Platform Enumeration identifier. Dependency is purl-keyed and carries no CPE, yet CPE is the oracle's highest-precedence correlation axis","maxLength":500},"tags":{"type":"array","items":{"type":"string","maxLength":100}},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["created_at","dependency","dependency_name","dependency_purl","dependency_version","id","product","product_name","updated_at"]},"PsirtComponentProfileRequest":{"type":"object","description":"One (dependency, product) annotation, with the inventory it annotates.","properties":{"dependency":{"type":"integer","description":"The inventory row this profile annotates"},"product":{"type":"integer","description":"The product the annotation applies within; judgement is per-product"},"pcrss_score":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"Static component risk rating per PSIRT policy (1-5). Inherited by matches on this dependency unless an analyst overrides it on the match"},"cpe":{"type":"string","nullable":true,"description":"Analyst-supplied Common Platform Enumeration identifier. Dependency is purl-keyed and carries no CPE, yet CPE is the oracle's highest-precedence correlation axis","maxLength":500},"tags":{"type":"array","items":{"type":"string","maxLength":100}}},"required":["dependency","product"]},"PsirtExposure":{"type":"object","description":"The \"am I affected?\" answer, as the detail page leads with it.\n\n``headline`` is the tri-state and the four values are a closed vocabulary the\nUI switches on: ``affected`` / ``unknown`` / ``not_affected`` /\n``no_inventory_signal``. The last two are deliberately distinct — \"every\nversion I carry is outside the range\" and \"I have nothing to compare\" are\ndifferent answers, and collapsing them would report ignorance as safety.","properties":{"headline":{"type":"string","readOnly":true},"affected":{"type":"array","items":{"$ref":"#/components/schemas/PsirtExposureVerdict"},"readOnly":true},"not_affected":{"type":"array","items":{"$ref":"#/components/schemas/PsirtExposureVerdict"},"readOnly":true},"unknown":{"type":"array","items":{"$ref":"#/components/schemas/PsirtExposureVerdict"},"readOnly":true},"affected_product_ids":{"type":"array","items":{"type":"integer"},"readOnly":true}},"required":["affected","affected_product_ids","headline","not_affected","unknown"]},"PsirtExposureVerdict":{"type":"object","description":"One component's verdict, as ``_verdict_payload`` flattens it.\n\nSchema-only: the payload is built by hand below, and this class exists so the\npublic OpenAPI document can describe the three verdict lists instead of\ndefaulting them to ``string``.","properties":{"dependency_id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"version":{"type":"string","readOnly":true},"purl":{"type":"string","readOnly":true},"product_ids":{"type":"array","items":{"type":"integer"},"readOnly":true},"status":{"type":"string","readOnly":true}},"required":["dependency_id","name","product_ids","purl","status","version"]},"PsirtFeedCategory":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"Human-readable category name","maxLength":255},"slug":{"type":"string","description":"URL-friendly identifier, auto-generated from the name","maxLength":255},"parent":{"type":"integer","nullable":true,"description":"Parent category for nesting; null for top-level categories"},"display_order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Sort order within the parent category"},"icon":{"type":"string","nullable":true,"description":"Optional CSS icon class","maxLength":50},"is_default":{"type":"boolean","description":"Protects the seeded default categories from deletion"}},"required":["id","name","slug"]},"PsirtFeedEnableRequest":{"type":"object","description":"Request body for the enable action.","properties":{"accepted_licence_hash":{"type":"string","minLength":1},"credentials":{}},"required":["accepted_licence_hash"]},"PsirtFeedPrefilterSubscription":{"type":"object","description":"Which feeds a group applies to: one feed, or the global default row.","properties":{"id":{"type":"integer","readOnly":true},"group":{"type":"integer","description":"The pre-filter group being subscribed"},"feed_source":{"type":"integer","nullable":true,"description":"The feed this subscription applies to; null with is_default is the global row"},"feed_source_name":{"type":"string","readOnly":true},"opted_out":{"type":"boolean","description":"When true on a feed-scoped row, that feed opts out of the global default group without the default being deleted"},"is_default":{"type":"boolean","description":"True with feed_source null: the global row every feed inherits"},"scope":{"type":"string","readOnly":true}},"required":["feed_source_name","group","id","scope"]},"PsirtFeedPrefilterSubscriptionRequest":{"type":"object","description":"Which feeds a group applies to: one feed, or the global default row.","properties":{"group":{"type":"integer","description":"The pre-filter group being subscribed"},"feed_source":{"type":"integer","nullable":true,"description":"The feed this subscription applies to; null with is_default is the global row"},"opted_out":{"type":"boolean","description":"When true on a feed-scoped row, that feed opts out of the global default group without the default being deleted"},"is_default":{"type":"boolean","description":"True with feed_source null: the global row every feed inherits"}},"required":["group"]},"PsirtFeedSource":{"type":"object","description":"List/detail/create/update serializer for feed sources.\n\nRead-side computed fields drive the Feeds page chips: ``health_state``\n(green/amber/red/gray/off), ``display_label``, ``has_credentials``,\n``has_current_acceptance`` (the re-acceptance banner keys on this), and\n``transport_available`` (a cleared FEAT-374 re-point whose connector has\nnot landed renders as \"coming soon\", not as broken).","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"Stable internal identifier used for vendor-keyed lookups and connector construction; rename the user-facing label via display_name instead","maxLength":255},"display_name":{"type":"string","nullable":true,"description":"User-editable display label; falls back to name when null. name remains the stable internal identifier","maxLength":255},"display_label":{"type":"string","readOnly":true},"source_type":{"enum":["freshrss","cisa_api","euvd_api","nvd_api","direct_rss","csaf_github","ubuntu_security_api","exploitdb_gitlab","git_vulns"],"type":"string","x-spec-enum-id":"81077480c35ed8f5","description":"Connector protocol used to poll this source\n\n* `freshrss` - FreshRSS\n* `cisa_api` - CISA API\n* `euvd_api` - EUVD API\n* `nvd_api` - NVD API\n* `direct_rss` - Direct RSS\n* `csaf_github` - CSAF GitHub\n* `ubuntu_security_api` - Ubuntu Security API\n* `exploitdb_gitlab` - Exploit-DB GitLab\n* `git_vulns` - Kernel vulns.git"},"url":{"type":"string","description":"Endpoint the connector polls; immutable on shipped catalog rows","maxLength":1000},"enabled":{"type":"boolean","readOnly":true,"description":"Whether this source is polled and its corpus processed/displayed"},"poll_interval_minutes":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Polling interval in minutes"},"poll_timeout_seconds":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"Per-feed envelope override for the poll timeout; null falls through to the global defense-in-depth ceiling. Known-slow feeds (e.g. very large RSS bodies) get this knob without further architectural change"},"auto_enrich":{"type":"boolean","description":"Automatically queue new items for enrichment after each poll"},"auto_detail_enhance":{"type":"boolean","description":"Automatically run detail-page enhancement on new items"},"auto_process":{"type":"boolean","description":"Auto relevance funnel: per-feed opt-in to automatic pre-filter and matching of new/changed items on poll. The analyst kill-switch for a noisy or expensive feed"},"prefilter_enabled":{"type":"boolean","description":"Whether pre-filtering is enabled for this feed"},"category":{"type":"integer","nullable":true,"description":"Category folder for sidebar organization"},"source_key":{"type":"string","readOnly":true,"nullable":true,"description":"Write-once canonical identity of a catalog source; null until assigned. User-authored sources use the reserved 'local-' namespace, which shipped keys never take"},"licence":{"readOnly":true,"description":"Per-source licence metadata as shown to the user at acceptance time. Empty dict = unknown; never infer a redistribution grant from absence"},"redistributable":{"type":"boolean","readOnly":true,"description":"Recorded redistribution verdict for this source's content. Fails closed. NOT the same thing as enabled, and not a serving control"},"config":{"description":"Non-secret connector settings as JSON; secrets belong in credentials"},"is_shipped":{"type":"boolean","readOnly":true,"description":"True for rows seeded from the shipped source catalog. Shipped rows are undeletable and their URL/connector identity is immutable — enforced in the service layer"},"clearance_state":{"enum":["cleared","pending_agreement","pending_ruling"],"type":"string","x-spec-enum-id":"b3c1675786afb9b8","readOnly":true,"description":"Legal-clearance gate: enablement refuses any source that is not 'cleared'. 'pending_agreement' means DefectDojo is pursuing a licensing agreement or consent with the publisher; 'pending_ruling' means the source's terms are with counsel. Neither is something a customer can accept their way past\n\n* `cleared` - Cleared\n* `pending_agreement` - Pending Agreement\n* `pending_ruling` - Pending Ruling"},"clearance_note":{"type":"string","readOnly":true,"description":"Honest user-facing sentence shown when enablement is refused for a non-cleared source: what blocks it and what unlocks it"},"last_polled_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last Polled Timestamp","description":"When this source was last polled"},"last_poll_attempted_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last Poll Attempted Timestamp","description":"When a poll was last attempted, successful or not"},"last_poll_succeeded_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last Poll Succeeded Timestamp","description":"When a poll last completed successfully"},"last_poll_error":{"readOnly":true,"nullable":true,"description":"Detail of the most recent poll failure; null when the last poll succeeded"},"recent_poll_outcomes":{"type":"array","items":{"type":"boolean"},"readOnly":true,"description":"Rolling window of recent poll outcomes, newest first; drives health_state"},"health_state":{"type":"string","readOnly":true},"has_credentials":{"type":"boolean","readOnly":true},"has_current_acceptance":{"type":"boolean","readOnly":true},"transport_available":{"type":"boolean","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["clearance_note","clearance_state","created_at","display_label","enabled","has_credentials","has_current_acceptance","health_state","id","is_shipped","last_poll_attempted_at","last_poll_error","last_poll_succeeded_at","last_polled_at","licence","name","recent_poll_outcomes","redistributable","source_key","source_type","transport_available","updated_at","url"]},"PsirtFeedSourceRequest":{"type":"object","description":"List/detail/create/update serializer for feed sources.\n\nRead-side computed fields drive the Feeds page chips: ``health_state``\n(green/amber/red/gray/off), ``display_label``, ``has_credentials``,\n``has_current_acceptance`` (the re-acceptance banner keys on this), and\n``transport_available`` (a cleared FEAT-374 re-point whose connector has\nnot landed renders as \"coming soon\", not as broken).","properties":{"name":{"type":"string","minLength":1,"description":"Stable internal identifier used for vendor-keyed lookups and connector construction; rename the user-facing label via display_name instead","maxLength":255},"display_name":{"type":"string","nullable":true,"description":"User-editable display label; falls back to name when null. name remains the stable internal identifier","maxLength":255},"source_type":{"enum":["freshrss","cisa_api","euvd_api","nvd_api","direct_rss","csaf_github","ubuntu_security_api","exploitdb_gitlab","git_vulns"],"type":"string","x-spec-enum-id":"81077480c35ed8f5","description":"Connector protocol used to poll this source\n\n* `freshrss` - FreshRSS\n* `cisa_api` - CISA API\n* `euvd_api` - EUVD API\n* `nvd_api` - NVD API\n* `direct_rss` - Direct RSS\n* `csaf_github` - CSAF GitHub\n* `ubuntu_security_api` - Ubuntu Security API\n* `exploitdb_gitlab` - Exploit-DB GitLab\n* `git_vulns` - Kernel vulns.git"},"url":{"type":"string","minLength":1,"description":"Endpoint the connector polls; immutable on shipped catalog rows","maxLength":1000},"poll_interval_minutes":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Polling interval in minutes"},"poll_timeout_seconds":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true,"description":"Per-feed envelope override for the poll timeout; null falls through to the global defense-in-depth ceiling. Known-slow feeds (e.g. very large RSS bodies) get this knob without further architectural change"},"auto_enrich":{"type":"boolean","description":"Automatically queue new items for enrichment after each poll"},"auto_detail_enhance":{"type":"boolean","description":"Automatically run detail-page enhancement on new items"},"auto_process":{"type":"boolean","description":"Auto relevance funnel: per-feed opt-in to automatic pre-filter and matching of new/changed items on poll. The analyst kill-switch for a noisy or expensive feed"},"prefilter_enabled":{"type":"boolean","description":"Whether pre-filtering is enabled for this feed"},"category":{"type":"integer","nullable":true,"description":"Category folder for sidebar organization"},"credentials":{"writeOnly":true},"config":{"description":"Non-secret connector settings as JSON; secrets belong in credentials"}},"required":["name","source_type","url"]},"PsirtFeedTerms":{"type":"object","description":"Response body for the terms modal: the exact text + its hash to echo back.","properties":{"text":{"type":"string","readOnly":true},"licence_hash":{"type":"string","readOnly":true},"clearance_state":{"type":"string","readOnly":true},"clearance_note":{"type":"string","readOnly":true}},"required":["clearance_note","clearance_state","licence_hash","text"]},"PsirtIngestRun":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"kind":{"enum":["poll","enrich","match","detail"],"type":"string","x-spec-enum-id":"2ccb29b7973a21fb","readOnly":true,"description":"What kind of pipeline work this run performed\n\n* `poll` - Poll\n* `enrich` - Enrich\n* `match` - Match\n* `detail` - Detail Enhance"},"feed_source":{"type":"integer","readOnly":true,"nullable":true,"description":"The source this run was scoped to; null for drain runs that span sources and for runs whose source was since deleted"},"state":{"enum":["running","succeeded","partial","failed"],"type":"string","x-spec-enum-id":"b2c0c6a6315c0998","readOnly":true,"description":"Where this run sits in its lifecycle\n\n* `running` - Running\n* `succeeded` - Succeeded\n* `partial` - Partial\n* `failed` - Failed"},"processed":{"type":"integer","readOnly":true,"description":"Items processed so far; advances per chunk"},"total":{"type":"integer","readOnly":true,"description":"Projected item count once known; 0 until the fan-out is sized"},"detail":{"readOnly":true,"description":"Machine context for the run: per-source counts, error summaries"},"started_at":{"type":"string","format":"date-time","readOnly":true,"title":"Started Timestamp","description":"When the run started"},"finished_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Finished Timestamp","description":"When the run reached a terminal state; null while running"},"percent_complete":{"type":"integer","readOnly":true},"eta_seconds":{"type":"integer","readOnly":true,"nullable":true}},"required":["detail","eta_seconds","feed_source","finished_at","id","kind","percent_complete","processed","started_at","state","total"]},"PsirtLicenceAcceptance":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"feed_source":{"type":"integer","readOnly":true,"description":"The source whose licence was accepted"},"accepted_at":{"type":"string","format":"date-time","readOnly":true,"title":"Accepted Timestamp","description":"When the licence was accepted"},"accepted_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user that accepted the licence; null once that account is deleted"},"accepted_by_username":{"type":"string","readOnly":true,"description":"Denormalized username captured at acceptance; survives user deletion"},"licence_hash":{"type":"string","readOnly":true,"description":"SHA-256 hex of the rendered licence text that was accepted"},"licence_snapshot":{"readOnly":true,"description":"The licence dict exactly as shown at acceptance time"}},"required":["accepted_at","accepted_by","accepted_by_username","feed_source","id","licence_hash","licence_snapshot"]},"PsirtMatch":{"type":"object","description":"One match, with enough provenance for an analyst to judge it.","properties":{"id":{"type":"integer","readOnly":true},"dependency":{"type":"integer","readOnly":true,"nullable":true,"description":"The inventory row matched, for a dependency-target rule. Null on a product-target match"},"dependency_name":{"type":"string","readOnly":true},"dependency_version":{"type":"string","readOnly":true},"product":{"type":"integer","readOnly":true,"nullable":true,"description":"The product matched directly, for a product-target rule. Null on a dependency-target match"},"product_name":{"type":"string","readOnly":true},"confidence":{"type":"number","format":"double","readOnly":true,"description":"Confidence score from 0.0 to 1.0"},"status":{"enum":["unconfirmed","confirmed","false_positive","exported"],"type":"string","x-spec-enum-id":"c216571c53815beb","description":"Analyst confirmation state of this match\n\n* `unconfirmed` - Unconfirmed\n* `confirmed` - Confirmed\n* `false_positive` - False Positive\n* `exported` - Exported"},"match_source":{"type":"string","readOnly":true,"nullable":true,"description":"Origin of the match: null for legacy/manual, 'cpe_auto' for CPE auto-match"},"match_type":{"type":"string","nullable":true,"description":"Which strategy fired, off the provenance snapshot.","readOnly":true},"rule_name":{"type":"string","readOnly":true,"nullable":true,"description":"Name of the rule or group that produced this match, denormalized for display"},"pcrss_score":{"type":"integer","readOnly":true,"nullable":true,"description":"PCRSS score inherited from the component profile, or overridden here (1-5)"},"version_verified":{"type":"boolean","readOnly":true,"description":"A structured in-range version confirmation exists for this match (oracle CONFIRMED or cpe_auto). Defaults true so a backfill does not mislabel structured and legacy rows; false means a keyword match with no version evidence"},"verification_reason":{"type":"string","readOnly":true,"nullable":true,"description":"Short human reason for the version_verified value, e.g. the oracle verdict"},"analyst_notes":{"type":"string","nullable":true,"description":"Free-form triage notes from the reviewing analyst"},"reviewed_by":{"type":"string","readOnly":true,"nullable":true,"description":"Username of the analyst that reviewed this match"},"reviewed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Reviewed Timestamp","description":"When this match was reviewed; null = not reviewed"},"retracted_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Retracted Timestamp","description":"When this match was retracted (orphaned by a newer rule version that no longer yields it). Null = active; retracted rows are excluded from the active triage surfaces"},"retraction_reason":{"type":"string","readOnly":true,"nullable":true,"description":"Short human reason this match was retracted"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"}},"required":["confidence","created_at","dependency","dependency_name","dependency_version","id","match_source","match_type","pcrss_score","product","product_name","retracted_at","retraction_reason","reviewed_at","reviewed_by","rule_name","verification_reason","version_verified"]},"PsirtMatchRequest":{"type":"object","description":"One match, with enough provenance for an analyst to judge it.","properties":{"status":{"enum":["unconfirmed","confirmed","false_positive","exported"],"type":"string","x-spec-enum-id":"c216571c53815beb","description":"Analyst confirmation state of this match\n\n* `unconfirmed` - Unconfirmed\n* `confirmed` - Confirmed\n* `false_positive` - False Positive\n* `exported` - Exported"},"analyst_notes":{"type":"string","nullable":true,"description":"Free-form triage notes from the reviewing analyst"}}},"PsirtMatchRule":{"type":"object","description":"A rule, its conditions and actions, and the trust verdict on all of it.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"Unique name for the rule","maxLength":255},"description":{"type":"string","nullable":true,"description":"Human-readable description of the rule","maxLength":1000},"group":{"type":"integer","nullable":true,"description":"Optional rule group for composite matching; null leaves the rule standalone"},"group_name":{"type":"string","readOnly":true},"rule_type":{"enum":["keyword","regex","cpe","version_range"],"type":"string","description":"* `keyword` - Keyword\n* `regex` - Regex\n* `cpe` - CPE\n* `version_range` - Version Range","x-spec-enum-id":"1a7920df188b6d4f"},"pattern":{"type":"string","maxLength":1000},"component_field":{"type":"string","description":"Dependency field the single-pattern form matches against (name, version, cpe, purl). PAE's 'vendor' has no Dependency column of its own — the purl namespace carries it","maxLength":50},"condition_logic":{"enum":["and","or"],"type":"string","x-spec-enum-id":"76e361de7090662e","description":"How the conditions within this rule combine\n\n* `and` - And\n* `or` - Or"},"target_mode":{"enum":["component","asset"],"type":"string","x-spec-enum-id":"16482f9f869263aa","description":"Whether the rule produces matches against dependencies ('component') or products ('asset'). Decides which of PsirtMatch.dependency / PsirtMatch.product is set\n\n* `component` - Dependency\n* `asset` - Product"},"priority":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Higher priority rules are applied first"},"enabled":{"type":"boolean","description":"Whether this rule is evaluated"},"version":{"type":"integer","readOnly":true,"description":"Bumped on every edit; denormalized to PsirtMatch.rule_version_int for provenance"},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtRuleCondition"}},"actions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtRuleAction"}},"assessment":{"type":"object","additionalProperties":{},"description":"Served on every read so the badge never has to be computed client-side.","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["assessment","created_at","group_name","id","name","updated_at","version"]},"PsirtMatchRuleRequest":{"type":"object","description":"A rule, its conditions and actions, and the trust verdict on all of it.","properties":{"name":{"type":"string","minLength":1,"description":"Unique name for the rule","maxLength":255},"description":{"type":"string","nullable":true,"description":"Human-readable description of the rule","maxLength":1000},"group":{"type":"integer","nullable":true,"description":"Optional rule group for composite matching; null leaves the rule standalone"},"rule_type":{"enum":["keyword","regex","cpe","version_range"],"type":"string","description":"* `keyword` - Keyword\n* `regex` - Regex\n* `cpe` - CPE\n* `version_range` - Version Range","x-spec-enum-id":"1a7920df188b6d4f"},"pattern":{"type":"string","maxLength":1000},"component_field":{"type":"string","minLength":1,"description":"Dependency field the single-pattern form matches against (name, version, cpe, purl). PAE's 'vendor' has no Dependency column of its own — the purl namespace carries it","maxLength":50},"condition_logic":{"enum":["and","or"],"type":"string","x-spec-enum-id":"76e361de7090662e","description":"How the conditions within this rule combine\n\n* `and` - And\n* `or` - Or"},"target_mode":{"enum":["component","asset"],"type":"string","x-spec-enum-id":"16482f9f869263aa","description":"Whether the rule produces matches against dependencies ('component') or products ('asset'). Decides which of PsirtMatch.dependency / PsirtMatch.product is set\n\n* `component` - Dependency\n* `asset` - Product"},"priority":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Higher priority rules are applied first"},"enabled":{"type":"boolean","description":"Whether this rule is evaluated"},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtRuleConditionRequest"}},"actions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtRuleActionRequest"}}},"required":["name"]},"PsirtMaterialChangePolicy":{"type":"object","properties":{"scope":{"enum":["global"],"type":"string","x-spec-enum-id":"7dc8939e8b32722c","readOnly":true,"description":"Scope of this policy. v1: 'global' only\n\n* `global` - Global"},"severity_tier_changes_enabled":{"type":"boolean","description":"If true, severity moves within medium/high/critical are material, and so is an escalation into that set from below — a feed that supplies tiers but no CVSS score must not escalate to Critical in silence. Downgrades out of the set are not"},"cvss_v3_delta_threshold":{"type":"string","format":"decimal","pattern":"^-?\\d{0,2}(?:\\.\\d{0,1})?$"},"kev_add_enabled":{"type":"boolean","description":"If true, KEV listing add events are material"},"kev_remove_enabled":{"type":"boolean","description":"If true, KEV listing remove events are material. Default off"},"epss_high_boundary":{"type":"string","format":"decimal","pattern":"^-?\\d{0,1}(?:\\.\\d{0,3})?$"},"epss_transition_enabled":{"type":"boolean","description":"If true, EPSS scores crossing epss_high_boundary are material"},"affected_products_changes_enabled":{"type":"boolean","description":"If true, affected-products set add/remove is material"},"cve_changes_enabled":{"type":"boolean","title":"CVE Set Changes Enabled","description":"If true, a CVE joining or leaving an advisory is material. Default on: it is the plainest case of the facts moving under something already published"},"severity_floor":{"enum":["none","low","medium","high","critical"],"type":"string","description":"* `none` - none\n* `low` - low\n* `medium` - medium\n* `high` - high\n* `critical` - critical","x-spec-enum-id":"181ccb29c3e45def"},"updated_by":{"type":"string","readOnly":true,"nullable":true,"description":"User identifier that last updated the policy"},"policy_updated_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Policy Updated Timestamp","description":"When the policy fields (not the row) were last edited"}},"required":["policy_updated_at","scope","updated_by"]},"PsirtPrefilterAction":{"type":"object","description":"What a matched group does. Written nested inside its group.","properties":{"id":{"type":"integer","readOnly":true},"action_type":{"enum":["add_points","add_tag","add_date_tag","mark_favorite","suppress"],"type":"string","x-spec-enum-id":"cd57283d761938f3","description":"Side effect to apply when the group matches\n\n* `add_points` - Add Points\n* `add_tag` - Add Tag\n* `add_date_tag` - Add Date Tag\n* `mark_favorite` - Mark Favorite\n* `suppress` - Suppress"},"value":{"type":"string","default":"","maxLength":500}},"required":["action_type","id"]},"PsirtPrefilterActionRequest":{"type":"object","description":"What a matched group does. Written nested inside its group.","properties":{"action_type":{"enum":["add_points","add_tag","add_date_tag","mark_favorite","suppress"],"type":"string","x-spec-enum-id":"cd57283d761938f3","description":"Side effect to apply when the group matches\n\n* `add_points` - Add Points\n* `add_tag` - Add Tag\n* `add_date_tag` - Add Date Tag\n* `mark_favorite` - Mark Favorite\n* `suppress` - Suppress"},"value":{"type":"string","default":"","maxLength":500}},"required":["action_type"]},"PsirtPrefilterCondition":{"type":"object","description":"One test over the advisory's own text. Written nested inside its group.","properties":{"id":{"type":"integer","readOnly":true},"field":{"enum":["content","title","cves","source_url"],"type":"string","x-spec-enum-id":"c61aebb57afff1c7","description":"Advisory field this condition reads; 'content' is title plus description\n\n* `content` - Content\n* `title` - Title\n* `cves` - CVEs\n* `source_url` - Source URL"},"operator":{"enum":["contains_any","contains_all","matches_regex","not_contains"],"type":"string","x-spec-enum-id":"8bc3023a45475630","description":"Comparison applied to value\n\n* `contains_any` - Contains Any\n* `contains_all` - Contains All\n* `matches_regex` - Matches Regex\n* `not_contains` - Not Contains"},"value":{"type":"string","description":"Comma-separated terms, or a regex pattern for matches_regex","maxLength":2000},"case_sensitive":{"type":"boolean","description":"Whether term comparison is case sensitive"},"anchored":{"type":"boolean","description":"Whole-word matching for the substring operators; inert for matches_regex. Cures over-match such as 'SSL' tagging 'assembly'"},"order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Evaluation order within the group (ascending); also the stable display order"}},"required":["field","id","operator","value"]},"PsirtPrefilterConditionRequest":{"type":"object","description":"One test over the advisory's own text. Written nested inside its group.","properties":{"field":{"enum":["content","title","cves","source_url"],"type":"string","x-spec-enum-id":"c61aebb57afff1c7","description":"Advisory field this condition reads; 'content' is title plus description\n\n* `content` - Content\n* `title` - Title\n* `cves` - CVEs\n* `source_url` - Source URL"},"operator":{"enum":["contains_any","contains_all","matches_regex","not_contains"],"type":"string","x-spec-enum-id":"8bc3023a45475630","description":"Comparison applied to value\n\n* `contains_any` - Contains Any\n* `contains_all` - Contains All\n* `matches_regex` - Matches Regex\n* `not_contains` - Not Contains"},"value":{"type":"string","minLength":1,"description":"Comma-separated terms, or a regex pattern for matches_regex","maxLength":2000},"case_sensitive":{"type":"boolean","description":"Whether term comparison is case sensitive"},"anchored":{"type":"boolean","description":"Whole-word matching for the substring operators; inert for matches_regex. Cures over-match such as 'SSL' tagging 'assembly'"},"order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Evaluation order within the group (ascending); also the stable display order"}},"required":["field","operator","value"]},"PsirtPrefilterGroup":{"type":"object","description":"A feed rule: its conditions, its actions, and where it applies.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"Unique name for the pre-filter group","maxLength":255},"description":{"type":"string","nullable":true,"description":"Human-readable description of the group","maxLength":1000},"enabled":{"type":"boolean","description":"Whether this group is evaluated"},"is_default":{"type":"boolean","readOnly":true,"description":"If true, every feed source subscribes to this group automatically"},"match_logic":{"enum":["any","all"],"type":"string","x-spec-enum-id":"0a55c3153ef51701","description":"'any' (at least one condition matches) or 'all' (every condition matches)\n\n* `any` - Any\n* `all` - All"},"priority":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Evaluation order; lower number is evaluated first"},"fallthrough":{"type":"boolean","description":"Continue evaluating other groups after this one matches"},"weight":{"type":"number","format":"double","description":"Author trust multiplier on this group's score contribution; 1.0 is neutral"},"version":{"type":"integer","readOnly":true,"description":"Bumped on every scoring-affecting edit; stamped into PsirtSourceAdvisory.prefilter_rule_versions at scoring time to expose score staleness"},"feed_source":{"type":"integer","readOnly":true,"nullable":true,"description":"When set, the group is feed-specific; null leaves it in the central library"},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtPrefilterCondition"}},"actions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtPrefilterAction"}},"subscriptions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtFeedPrefilterSubscription"},"readOnly":true},"suppresses":{"type":"boolean","description":"Whether this rule hides advisories, which is the one action worth a warning.","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["created_at","feed_source","id","is_default","name","subscriptions","suppresses","updated_at","version"]},"PsirtPrefilterGroupRequest":{"type":"object","description":"A feed rule: its conditions, its actions, and where it applies.","properties":{"name":{"type":"string","minLength":1,"description":"Unique name for the pre-filter group","maxLength":255},"description":{"type":"string","nullable":true,"description":"Human-readable description of the group","maxLength":1000},"enabled":{"type":"boolean","description":"Whether this group is evaluated"},"match_logic":{"enum":["any","all"],"type":"string","x-spec-enum-id":"0a55c3153ef51701","description":"'any' (at least one condition matches) or 'all' (every condition matches)\n\n* `any` - Any\n* `all` - All"},"priority":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Evaluation order; lower number is evaluated first"},"fallthrough":{"type":"boolean","description":"Continue evaluating other groups after this one matches"},"weight":{"type":"number","format":"double","description":"Author trust multiplier on this group's score contribution; 1.0 is neutral"},"conditions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtPrefilterConditionRequest"}},"actions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtPrefilterActionRequest"}},"feed_scope":{"type":"integer","writeOnly":true,"nullable":true}},"required":["name"]},"PsirtRecencyConfig":{"type":"object","properties":{"window_days":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Persistent default recency window (days) for 'new' item counts"},"allowed_window_days":{"type":"array","items":{"type":"integer"},"readOnly":true},"updated_by":{"type":"string","readOnly":true,"nullable":true,"description":"User identifier that last updated the config"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["allowed_window_days","updated_at","updated_by","window_days"]},"PsirtRuleAction":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"action_type":{"enum":["emit_tag","set_priority","mark_for_review"],"type":"string","x-spec-enum-id":"4b5f4bb9673f7ce6","description":"Side effect to apply when the rule fires\n\n* `emit_tag` - Emit Tag\n* `set_priority` - Set Priority\n* `mark_for_review` - Mark For Review"},"value":{"type":"string","nullable":true,"description":"Tag string for emit_tag, priority value for set_priority, ignored for mark_for_review","maxLength":500}},"required":["action_type","id"]},"PsirtRuleActionRequest":{"type":"object","properties":{"action_type":{"enum":["emit_tag","set_priority","mark_for_review"],"type":"string","x-spec-enum-id":"4b5f4bb9673f7ce6","description":"Side effect to apply when the rule fires\n\n* `emit_tag` - Emit Tag\n* `set_priority` - Set Priority\n* `mark_for_review` - Mark For Review"},"value":{"type":"string","nullable":true,"description":"Tag string for emit_tag, priority value for set_priority, ignored for mark_for_review","maxLength":500}},"required":["action_type"]},"PsirtRuleCondition":{"type":"object","description":"One atomic condition. Written nested inside its rule, never on its own.\n\nA condition has no meaning apart from the rule that combines it — and letting\nit be created independently would let a rule acquire a condition without\nre-running the trust gate, which is the one thing the gate exists to prevent.","properties":{"id":{"type":"integer","readOnly":true},"condition_type":{"enum":["keyword","regex","cpe","version_range","purl","tag","cvss_threshold","epss_threshold","cve","affected_version"],"type":"string","x-spec-enum-id":"cfddc7664e970a00","description":"Which test this condition applies\n\n* `keyword` - Keyword\n* `regex` - Regex\n* `cpe` - CPE\n* `version_range` - Version Range\n* `purl` - Package URL\n* `tag` - Tag\n* `cvss_threshold` - CVSS Threshold\n* `epss_threshold` - EPSS Threshold\n* `cve` - CVE\n* `affected_version` - Affected Version"},"pattern":{"type":"string","description":"The value tested: term, regex, CPE, version range, or numeric threshold"},"field":{"type":"string","description":"For dependency-target rules: name/version/cpe/purl. For product-target or advisory-only conditions: the source-advisory field name","maxLength":50},"case_sensitive":{"type":"boolean","description":"Applies to keyword/regex/tag/cve conditions; inert for the numeric and structured types"},"order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Evaluation order within the rule (ascending); also the stable display order"}},"required":["condition_type","id","pattern"]},"PsirtRuleConditionRequest":{"type":"object","description":"One atomic condition. Written nested inside its rule, never on its own.\n\nA condition has no meaning apart from the rule that combines it — and letting\nit be created independently would let a rule acquire a condition without\nre-running the trust gate, which is the one thing the gate exists to prevent.","properties":{"condition_type":{"enum":["keyword","regex","cpe","version_range","purl","tag","cvss_threshold","epss_threshold","cve","affected_version"],"type":"string","x-spec-enum-id":"cfddc7664e970a00","description":"Which test this condition applies\n\n* `keyword` - Keyword\n* `regex` - Regex\n* `cpe` - CPE\n* `version_range` - Version Range\n* `purl` - Package URL\n* `tag` - Tag\n* `cvss_threshold` - CVSS Threshold\n* `epss_threshold` - EPSS Threshold\n* `cve` - CVE\n* `affected_version` - Affected Version"},"pattern":{"type":"string","minLength":1,"description":"The value tested: term, regex, CPE, version range, or numeric threshold"},"field":{"type":"string","minLength":1,"description":"For dependency-target rules: name/version/cpe/purl. For product-target or advisory-only conditions: the source-advisory field name","maxLength":50},"case_sensitive":{"type":"boolean","description":"Applies to keyword/regex/tag/cve conditions; inert for the numeric and structured types"},"order":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Evaluation order within the rule (ascending); also the stable display order"}},"required":["condition_type","pattern"]},"PsirtRuleGroup":{"type":"object","description":"A group of rules and where it applies.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"Unique name for the group","maxLength":255},"description":{"type":"string","nullable":true,"description":"Human-readable description of the group","maxLength":1000},"operator":{"enum":["and","or"],"type":"string","x-spec-enum-id":"76e361de7090662e","description":"Logical operator: 'and' (all rules must match) or 'or' (any rule can match)\n\n* `and` - And\n* `or` - Or"},"enabled":{"type":"boolean","description":"Whether this group is active"},"priority":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Higher priority groups are evaluated first"},"is_template":{"type":"boolean","description":"Templates are copy-only and never subscribed directly, so editing the shipped library cannot change what an existing subscription evaluates"},"is_default":{"type":"boolean","description":"Auto-applied as the global default subscription when a subscription row names neither a product type nor a product"},"version":{"type":"integer","readOnly":true,"description":"Bumped on every edit so a match can record which revision produced it"},"rule_count":{"type":"integer","readOnly":true},"enabled_rule_count":{"type":"integer","readOnly":true},"subscriptions":{"type":"array","items":{"$ref":"#/components/schemas/PsirtRuleGroupSubscription"},"readOnly":true},"reach":{"type":"string","description":"Where this group applies, in words.\n\nRendered server-side because the precedence is subtle: an opt-out beats\nevery other route, and a list that showed \"global default\" next to an\nopt-out without saying so would be actively misleading.","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["created_at","enabled_rule_count","id","name","reach","rule_count","subscriptions","updated_at","version"]},"PsirtRuleGroupRequest":{"type":"object","description":"A group of rules and where it applies.","properties":{"name":{"type":"string","minLength":1,"description":"Unique name for the group","maxLength":255},"description":{"type":"string","nullable":true,"description":"Human-readable description of the group","maxLength":1000},"operator":{"enum":["and","or"],"type":"string","x-spec-enum-id":"76e361de7090662e","description":"Logical operator: 'and' (all rules must match) or 'or' (any rule can match)\n\n* `and` - And\n* `or` - Or"},"enabled":{"type":"boolean","description":"Whether this group is active"},"priority":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"description":"Higher priority groups are evaluated first"},"is_template":{"type":"boolean","description":"Templates are copy-only and never subscribed directly, so editing the shipped library cannot change what an existing subscription evaluates"},"is_default":{"type":"boolean","description":"Auto-applied as the global default subscription when a subscription row names neither a product type nor a product"}},"required":["name"]},"PsirtRuleGroupSubscription":{"type":"object","description":"Where a group applies. Exactly one of product / product_type, or a global default.","properties":{"id":{"type":"integer","readOnly":true},"group":{"type":"integer","description":"The rule group being subscribed"},"product":{"type":"integer","nullable":true,"description":"When set, the group applies to this product only. Mutually exclusive with product_type"},"product_name":{"type":"string","readOnly":true},"product_type":{"type":"integer","nullable":true,"description":"When set, the group applies to every product of this type. Mutually exclusive with product"},"product_type_name":{"type":"string","readOnly":true},"is_default":{"type":"boolean","description":"True with neither product_type nor product set: the global default applied to every product"},"opted_out":{"type":"boolean","description":"When true on a product-scoped row, that product opts out of an otherwise-applicable default subscription without the default being deleted"},"scope":{"type":"string","description":"One word for what this row does, so a list is readable at a glance.","readOnly":true}},"required":["group","id","product_name","product_type_name","scope"]},"PsirtRuleGroupSubscriptionRequest":{"type":"object","description":"Where a group applies. Exactly one of product / product_type, or a global default.","properties":{"group":{"type":"integer","description":"The rule group being subscribed"},"product":{"type":"integer","nullable":true,"description":"When set, the group applies to this product only. Mutually exclusive with product_type"},"product_type":{"type":"integer","nullable":true,"description":"When set, the group applies to every product of this type. Mutually exclusive with product"},"is_default":{"type":"boolean","description":"True with neither product_type nor product set: the global default applied to every product"},"opted_out":{"type":"boolean","description":"When true on a product-scoped row, that product opts out of an otherwise-applicable default subscription without the default being deleted"}},"required":["group"]},"PsirtSlaClock":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"clock_definition":{"type":"integer","readOnly":true},"clock_code":{"type":"string","readOnly":true},"clock_name":{"type":"string","readOnly":true},"can_pause":{"type":"boolean","readOnly":true},"subject_kind":{"enum":["source_advisory","advisory","regulatory_stage"],"type":"string","description":"* `source_advisory` - Source Advisory\n* `advisory` - Advisory\n* `regulatory_stage` - Regulatory Report Stage","x-spec-enum-id":"658da167dc8550af","readOnly":true},"subject_id":{"type":"integer","readOnly":true},"state":{"enum":["running","paused","stopped_met","stopped_breach"],"type":"string","description":"* `running` - Running\n* `paused` - Paused\n* `stopped_met` - Met\n* `stopped_breach` - Breached","x-spec-enum-id":"f9625e0426009dcc","readOnly":true,"default":"running"},"sla_state":{"type":"string","readOnly":true},"elapsed":{"type":"number","format":"double","description":"Fraction of the budget spent, paused time excluded. Over 1.0 = late.","readOnly":true},"tier_snapshot":{"type":"string","readOnly":true,"description":"The tier resolved when the clock armed. Never recomputed"},"policy":{"type":"integer","readOnly":true,"nullable":true,"description":"The policy whose durations produced the deadline"},"started_at":{"type":"string","format":"date-time","readOnly":true},"deadline_at":{"type":"string","format":"date-time","readOnly":true},"warning_at":{"type":"string","format":"date-time","readOnly":true},"stopped_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"breach_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"When the breach was recorded. Set once and never cleared"},"total_paused_duration":{"type":"string","readOnly":true,"nullable":true,"description":"Accumulated pause time, added to the deadline on resume so paused time is not charged to the team"},"open_pause_reason":{"type":"string","description":"Why this clock is currently paused, if it is.\n\nServed alongside the state because \"paused\" without the reason invites the\nnext person to assume someone forgot to resume it.","readOnly":true},"pauses":{"type":"array","items":{"$ref":"#/components/schemas/PsirtSlaClockPause"},"readOnly":true}},"required":["breach_at","can_pause","clock_code","clock_definition","clock_name","deadline_at","elapsed","id","open_pause_reason","pauses","policy","sla_state","started_at","state","stopped_at","subject_id","subject_kind","tier_snapshot","total_paused_duration","warning_at"]},"PsirtSlaClockDefinition":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"code":{"type":"string","readOnly":true,"description":"Stable identifier, e.g. triage / publication / revision"},"name":{"type":"string","maxLength":255},"description":{"type":"string"},"subject_kind":{"enum":["source_advisory","advisory","regulatory_stage"],"type":"string","x-spec-enum-id":"658da167dc8550af","readOnly":true,"description":"What this clock runs on\n\n* `source_advisory` - Source Advisory\n* `advisory` - Advisory\n* `regulatory_stage` - Regulatory Report Stage"},"arm_predicate_name":{"type":"string","readOnly":true,"description":"Registry key of the predicate that decides when to start the clock"},"stop_predicate_name":{"type":"string","readOnly":true,"description":"Registry key of the predicate that decides when the obligation is met"},"tier_resolver_name":{"type":"string","readOnly":true,"description":"Registry key of the function that picks the tier at arm time"},"can_pause":{"type":"boolean","description":"Whether this clock may be paused. A publication clock generally may not — the date was promised to someone outside"},"allow_tier_upgrade_while_running":{"type":"boolean","description":"Whether a running clock may be re-tiered upward. Off by default: silently moving a deadline is how a breach disappears"},"enabled":{"type":"boolean"},"policy_count":{"type":"integer","readOnly":true,"default":0},"live_clock_count":{"type":"integer","readOnly":true,"default":0},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["arm_predicate_name","code","created_at","id","live_clock_count","name","policy_count","stop_predicate_name","subject_kind","tier_resolver_name","updated_at"]},"PsirtSlaClockDefinitionRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string"},"can_pause":{"type":"boolean","description":"Whether this clock may be paused. A publication clock generally may not — the date was promised to someone outside"},"allow_tier_upgrade_while_running":{"type":"boolean","description":"Whether a running clock may be re-tiered upward. Off by default: silently moving a deadline is how a breach disappears"},"enabled":{"type":"boolean"}},"required":["name"]},"PsirtSlaClockPause":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"category":{"enum":["vendor_wait","engineering_analysis","legal_review","customer_request","other"],"type":"string","description":"* `vendor_wait` - Waiting on Vendor\n* `engineering_analysis` - Engineering Analysis\n* `legal_review` - Legal Review\n* `customer_request` - Customer Request\n* `other` - Other","x-spec-enum-id":"df3c8ae4dab1af74","readOnly":true},"justification":{"type":"string","readOnly":true,"description":"Why the clock was paused. Required, and not blank"},"paused_at":{"type":"string","format":"date-time","readOnly":true},"paused_by":{"type":"integer","readOnly":true,"nullable":true},"paused_by_username":{"type":"string","readOnly":true},"resumed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"resumed_by":{"type":"integer","readOnly":true,"nullable":true},"resumed_by_username":{"type":"string","readOnly":true},"is_open":{"type":"boolean","readOnly":true}},"required":["category","id","is_open","justification","paused_at","paused_by","paused_by_username","resumed_at","resumed_by","resumed_by_username"]},"PsirtSlaPolicy":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255},"clock_definition":{"type":"integer","description":"The clock this policy parameterizes"},"clock_code":{"type":"string","readOnly":true},"tier":{"type":"string","description":"Tier code the resolver returns, e.g. critical_exploited. Its vocabulary depends on the definition's tier resolver, not on the case priority codes","maxLength":50},"deadline_duration":{"type":"string","description":"Time allowed from arm to deadline"},"warning_threshold":{"type":"string","description":"How long before the deadline the clock starts warning"},"enabled":{"type":"boolean"},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["clock_code","clock_definition","created_at","deadline_duration","id","name","tier","updated_at","warning_threshold"]},"PsirtSlaPolicyRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"clock_definition":{"type":"integer","description":"The clock this policy parameterizes"},"tier":{"type":"string","minLength":1,"description":"Tier code the resolver returns, e.g. critical_exploited. Its vocabulary depends on the definition's tier resolver, not on the case priority codes","maxLength":50},"deadline_duration":{"type":"string","description":"Time allowed from arm to deadline"},"warning_threshold":{"type":"string","description":"How long before the deadline the clock starts warning"},"enabled":{"type":"boolean"}},"required":["clock_definition","deadline_duration","name","tier","warning_threshold"]},"PsirtSourceAdvisoryDetail":{"type":"object","description":"Everything the detail drawer shows, led by the exposure answer.","properties":{"id":{"type":"integer","readOnly":true},"external_id":{"type":"string","readOnly":true,"description":"Unique identifier from the source"},"external_id_is_opaque":{"type":"boolean","description":"Whether the raw handle is worth showing beside the label.","readOnly":true},"display_label":{"type":"string","description":"What the row leads with — see ``intake.labels``.\n\nServed rather than derived client-side so the queue, the detail dialog and\nanything that later quotes an advisory (a case title, a notification) all\nname it identically.","readOnly":true},"title":{"type":"string","readOnly":true,"description":"Advisory title as published by the source"},"feed_source":{"type":"integer","readOnly":true,"description":"The source this advisory was ingested from"},"feed_source_name":{"type":"string","readOnly":true},"published_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Published Timestamp","description":"When the source published this advisory"},"severity":{"type":"string","readOnly":true,"nullable":true,"description":"Severity label from enrichment"},"cvss_score":{"type":"number","format":"double","readOnly":true,"nullable":true,"description":"CVSS base score"},"epss_score":{"type":"number","format":"double","readOnly":true,"nullable":true,"description":"Denormalized cache, refreshed from dojo.Vulnerability by the enrichment drain"},"is_exploited":{"type":"boolean","readOnly":true,"description":"Whether this vulnerability is known to be exploited in the wild. Denormalized cache, refreshed from dojo.Vulnerability by the enrichment drain"},"cves":{"type":"array","items":{"type":"string","maxLength":20},"readOnly":true,"nullable":true,"description":"CVE identifiers exactly as the source claimed them (raw fidelity); normalized identity lives on the vulnerabilities relation"},"status":{"enum":["new","matched","unmatched","reviewed","exported","ignored"],"type":"string","x-spec-enum-id":"7bd397f8d90dc143","readOnly":true,"description":"Pipeline status of this advisory\n\n* `new` - New\n* `matched` - Matched\n* `unmatched` - Unmatched\n* `reviewed` - Reviewed\n* `exported` - Exported\n* `ignored` - Ignored"},"enrichment_status":{"enum":["pending","partial","success","failed","skipped"],"type":"string","x-spec-enum-id":"d03d6d2319e3f91b","readOnly":true,"description":"Where this advisory sits in the enrichment queue\n\n* `pending` - Pending\n* `partial` - Partial\n* `success` - Success\n* `failed` - Failed\n* `skipped` - Skipped"},"match_status":{"enum":["pending","skipped","done","failed"],"type":"string","x-spec-enum-id":"96fafbfe17d173e9","readOnly":true,"description":"Where this advisory sits in the background matching queue\n\n* `pending` - Pending\n* `skipped` - Skipped\n* `done` - Done\n* `failed` - Failed"},"match_count":{"type":"integer","readOnly":true},"verified_match_count":{"type":"integer","readOnly":true},"amplitude":{"type":"number","format":"double","readOnly":true},"risk_band":{"type":"string","nullable":true,"description":"The amplitude's band, resolved server-side.\n\nSent alongside the number rather than left to the client, so the chip on\nthe row and any future digest or notification band the same score the same\nway. The thresholds are runtime-configurable, and duplicating them in\nJavaScript is how the two would come to disagree.","readOnly":true},"affected_product_count":{"type":"integer","readOnly":true},"is_suppressed":{"type":"boolean","readOnly":true},"is_reviewed":{"type":"boolean","readOnly":true},"prefilter_score":{"type":"integer","readOnly":true,"description":"Accumulated points from matching pre-filter rules"},"prefilter_matched":{"type":"boolean","readOnly":true,"description":"Whether any pre-filter rule matched this advisory"},"prefilter_favorite":{"type":"boolean","readOnly":true,"description":"Starred by a pre-filter action"},"prefilter_tags":{"type":"array","items":{"type":"string","maxLength":100},"readOnly":true,"nullable":true,"description":"Tags added by pre-filter actions"},"source_url":{"type":"string","readOnly":true,"nullable":true,"description":"Link to the advisory at the source"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"description":{"type":"string","readOnly":true,"nullable":true,"description":"Advisory body text as published by the source"},"cvss_vector":{"type":"string","readOnly":true,"nullable":true,"description":"CVSS vector string"},"cvss_version":{"type":"string","readOnly":true,"nullable":true,"description":"CVSS vector version"},"cvss_source":{"type":"string","readOnly":true,"nullable":true,"description":"Source of CVSS score: NVD, VENDOR, MANUAL"},"cwe_ids":{"type":"array","items":{"type":"string","maxLength":20},"readOnly":true,"nullable":true,"description":"CWE identifiers from enrichment"},"advisory_ids":{"type":"array","items":{"type":"string","maxLength":100},"readOnly":true,"nullable":true,"description":"Vendor advisory identifiers referenced by this advisory"},"source_tags":{"type":"array","items":{"type":"string","maxLength":100},"readOnly":true,"nullable":true,"description":"Vendor-provided tags from detail page enhancement"},"cna":{"type":"string","readOnly":true,"nullable":true,"description":"CVE Numbering Authority that assigned the CVE"},"exploitation_source":{"type":"string","readOnly":true,"nullable":true,"description":"Source of exploitation info: KEV, EUVD, VENDOR, MANUAL. Denormalized cache, refreshed from dojo.Vulnerability by the enrichment drain"},"enriched_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Enriched Timestamp","description":"When enrichment last completed for this advisory"},"matched_run_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Matched Run Timestamp","description":"When the worker last ran matching on this advisory"},"exposure":{"type":"object","additionalProperties":{},"description":"Computed live against the inventory — see the module docstring.","readOnly":true},"matches":{"type":"array","items":{"type":"object","additionalProperties":{}},"description":"Active matches only, verified first — the engine's down-rank order.\n\nRetracted rows are excluded from every read surface by contract; they\nexist for provenance, not for triage.","readOnly":true},"affected_products":{"type":"array","items":{"$ref":"#/components/schemas/PsirtAffectedProduct"},"readOnly":true},"attribution":{"type":"string","nullable":true,"description":"The source's required attribution text, rendered for display.\n\nCarried on the advisory rather than left to the Feeds page, because this\nis where the content is actually read and several licences require the\nnotice to travel with the content. Rendered from the licence snapshot\nstored on the feed source, so a row keeps the terms it was seeded with\nrather than whatever the current catalog says.\n\n``has_cves`` and ``nvd_derived`` are passed because the MITRE CVE\ndesignation and the NIST no-endorsement notice are only owed when the\ncontent actually references those corpora.","readOnly":true}},"required":["advisory_ids","affected_product_count","affected_products","amplitude","attribution","cna","created_at","cves","cvss_score","cvss_source","cvss_vector","cvss_version","cwe_ids","description","display_label","enriched_at","enrichment_status","epss_score","exploitation_source","exposure","external_id","external_id_is_opaque","feed_source","feed_source_name","id","is_exploited","is_reviewed","is_suppressed","match_count","match_status","matched_run_at","matches","prefilter_favorite","prefilter_matched","prefilter_score","prefilter_tags","published_at","risk_band","severity","source_tags","source_url","status","title","verified_match_count"]},"PsirtSourceAdvisoryList":{"type":"object","description":"Triage-queue row. Counts come from annotations; nothing lazy-loads.","properties":{"id":{"type":"integer","readOnly":true},"external_id":{"type":"string","readOnly":true,"description":"Unique identifier from the source"},"external_id_is_opaque":{"type":"boolean","description":"Whether the raw handle is worth showing beside the label.","readOnly":true},"display_label":{"type":"string","description":"What the row leads with — see ``intake.labels``.\n\nServed rather than derived client-side so the queue, the detail dialog and\nanything that later quotes an advisory (a case title, a notification) all\nname it identically.","readOnly":true},"title":{"type":"string","readOnly":true,"description":"Advisory title as published by the source"},"feed_source":{"type":"integer","readOnly":true,"description":"The source this advisory was ingested from"},"feed_source_name":{"type":"string","readOnly":true},"published_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Published Timestamp","description":"When the source published this advisory"},"severity":{"type":"string","readOnly":true,"nullable":true,"description":"Severity label from enrichment"},"cvss_score":{"type":"number","format":"double","readOnly":true,"nullable":true,"description":"CVSS base score"},"epss_score":{"type":"number","format":"double","readOnly":true,"nullable":true,"description":"Denormalized cache, refreshed from dojo.Vulnerability by the enrichment drain"},"is_exploited":{"type":"boolean","readOnly":true,"description":"Whether this vulnerability is known to be exploited in the wild. Denormalized cache, refreshed from dojo.Vulnerability by the enrichment drain"},"cves":{"type":"array","items":{"type":"string","maxLength":20},"readOnly":true,"nullable":true,"description":"CVE identifiers exactly as the source claimed them (raw fidelity); normalized identity lives on the vulnerabilities relation"},"status":{"enum":["new","matched","unmatched","reviewed","exported","ignored"],"type":"string","x-spec-enum-id":"7bd397f8d90dc143","readOnly":true,"description":"Pipeline status of this advisory\n\n* `new` - New\n* `matched` - Matched\n* `unmatched` - Unmatched\n* `reviewed` - Reviewed\n* `exported` - Exported\n* `ignored` - Ignored"},"enrichment_status":{"enum":["pending","partial","success","failed","skipped"],"type":"string","x-spec-enum-id":"d03d6d2319e3f91b","readOnly":true,"description":"Where this advisory sits in the enrichment queue\n\n* `pending` - Pending\n* `partial` - Partial\n* `success` - Success\n* `failed` - Failed\n* `skipped` - Skipped"},"match_status":{"enum":["pending","skipped","done","failed"],"type":"string","x-spec-enum-id":"96fafbfe17d173e9","readOnly":true,"description":"Where this advisory sits in the background matching queue\n\n* `pending` - Pending\n* `skipped` - Skipped\n* `done` - Done\n* `failed` - Failed"},"match_count":{"type":"integer","readOnly":true},"verified_match_count":{"type":"integer","readOnly":true},"amplitude":{"type":"number","format":"double","readOnly":true},"risk_band":{"type":"string","nullable":true,"description":"The amplitude's band, resolved server-side.\n\nSent alongside the number rather than left to the client, so the chip on\nthe row and any future digest or notification band the same score the same\nway. The thresholds are runtime-configurable, and duplicating them in\nJavaScript is how the two would come to disagree.","readOnly":true},"affected_product_count":{"type":"integer","readOnly":true},"is_suppressed":{"type":"boolean","readOnly":true},"is_reviewed":{"type":"boolean","readOnly":true},"prefilter_score":{"type":"integer","readOnly":true,"description":"Accumulated points from matching pre-filter rules"},"prefilter_matched":{"type":"boolean","readOnly":true,"description":"Whether any pre-filter rule matched this advisory"},"prefilter_favorite":{"type":"boolean","readOnly":true,"description":"Starred by a pre-filter action"},"prefilter_tags":{"type":"array","items":{"type":"string","maxLength":100},"readOnly":true,"nullable":true,"description":"Tags added by pre-filter actions"},"source_url":{"type":"string","readOnly":true,"nullable":true,"description":"Link to the advisory at the source"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"}},"required":["affected_product_count","amplitude","created_at","cves","cvss_score","display_label","enrichment_status","epss_score","external_id","external_id_is_opaque","feed_source","feed_source_name","id","is_exploited","is_reviewed","is_suppressed","match_count","match_status","prefilter_favorite","prefilter_matched","prefilter_score","prefilter_tags","published_at","risk_band","severity","source_url","status","title","verified_match_count"]},"PsirtSourceAdvisoryRevision":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"fingerprint_type":{"enum":["source","enrichment"],"type":"string","x-spec-enum-id":"2848602dea7b4343","readOnly":true,"description":"Which material fingerprint (source or enrichment) fired for this event\n\n* `source` - Source\n* `enrichment` - Enrichment"},"fingerprint_hash":{"type":"string","readOnly":true,"description":"SHA-256 hex of the material fingerprint after the change"},"occurred_at":{"type":"string","format":"date-time","readOnly":true,"title":"Occurred Timestamp","description":"When the material change was detected"},"change_delta":{"readOnly":true,"nullable":true,"description":"Per-field {from, to} mapping for material fields that changed. Null for net-new advisory baseline rows"},"triggered_by":{"type":"string","readOnly":true,"description":"Poller or enricher name that detected the change"}},"required":["change_delta","fingerprint_hash","fingerprint_type","id","occurred_at","triggered_by"]},"PsirtTriageSummary":{"type":"object","description":"Shape of ``GET advisories/triage_summary/`` — a handful of counts, never rows.\n\nDocuments the response for the OpenAPI schema; the view builds the dict\ndirectly from aggregate queries. Every count is over advisories created at\nor after ``since`` (and on ``feed_source`` when given), suppressed rows\nincluded — the ``suppressed`` key says how many of ``total`` they are, so a\nclient can subtract rather than guess.","properties":{"since":{"type":"string","format":"date-time","readOnly":true},"feed_source":{"type":"integer","readOnly":true,"nullable":true},"total":{"type":"integer","readOnly":true},"by_status":{"type":"object","additionalProperties":{"type":"integer"},"readOnly":true},"by_severity":{"type":"object","additionalProperties":{"type":"integer"},"readOnly":true},"by_status_severity":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"exposure":{"type":"object","additionalProperties":{"type":"integer"},"readOnly":true},"suppressed":{"type":"integer","readOnly":true},"exploited":{"type":"integer","readOnly":true},"top_prefilter_tags":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["by_severity","by_status","by_status_severity","exploited","exposure","feed_source","since","suppressed","top_prefilter_tags","total"]},"PsirtWorthinessConfig":{"type":"object","properties":{"w_specificity":{"type":"integer","maximum":100,"minimum":0,"title":"Specificity Weight","description":"Specificity weight in points; the four weights must sum to 100"},"w_prefilter":{"type":"integer","maximum":100,"minimum":0,"title":"Prefilter Weight","description":"Pre-filter weight in points; the four weights must sum to 100"},"w_severity":{"type":"integer","maximum":100,"minimum":0,"title":"Severity Weight","description":"Severity weight in points; the four weights must sum to 100"},"w_urgency":{"type":"integer","maximum":100,"minimum":0,"title":"Urgency Weight","description":"Urgency weight in points; the four weights must sum to 100"},"t_critical":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Critical Threshold","description":"Critical band lower bound; thresholds must be strictly ascending"},"t_high":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"High Threshold","description":"High band lower bound; thresholds must be strictly ascending"},"t_med":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Medium Threshold","description":"Medium band lower bound; thresholds must be strictly ascending"},"t_low_med":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"title":"Low-Medium Threshold","description":"Low-medium band lower bound; thresholds must be strictly ascending"},"updated_by":{"type":"string","readOnly":true,"nullable":true,"description":"User identifier that last updated the config"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["t_critical","t_high","t_low_med","t_med","updated_at","updated_by","w_prefilter","w_severity","w_specificity","w_urgency"]},"PublicAssignProduct":{"type":"object","properties":{"product_name":{"type":"string"}},"required":["product_name"]},"PublicAssignProductRequest":{"type":"object","properties":{"product_name":{"type":"string","minLength":1},"remap_findings":{"enum":["move","start_fresh"],"type":"string","x-spec-enum-id":"861cfde7fa198a63","writeOnly":true,"default":"move","description":"What happens to the findings already imported for this record when it is re-mapped to a different asset. 'move' (default) moves the record's connector tests, with their findings, notes, risk acceptances and reimport state, to the new asset so the next sync updates them in place. 'start_fresh' closes those findings on the old asset and the next sync imports a new set under the new asset. Ignored on a first mapping.\n\n* `move` - move\n* `start_fresh` - start_fresh"}},"required":["product_name"]},"PublicMappingSubtypeStatus":{"type":"object","description":"User-facing variant -- restricts to GOOD and IGNORED (users shouldn't set MISSING).","properties":{"test_type_name":{"type":"string","description":"The test_type_name of the subtype to update."},"status":{"enum":["GOOD","IGNORED"],"type":"string","x-spec-enum-id":"8f517a58d3bf4672","description":"The new status for this subtype. Only GOOD and IGNORED are user-settable.\n\n* `GOOD` - GOOD\n* `IGNORED` - IGNORED"}},"required":["status","test_type_name"]},"PushFindingsRequestRequest":{"type":"object","properties":{"requirement_ids":{"type":"array","items":{"type":"integer"}},"close_previous":{"type":"boolean","default":true}}},"PushFindingsResponse":{"type":"object","properties":{"engagement_id":{"type":"integer"},"test_id":{"type":"integer"},"created":{"type":"integer"},"updated":{"type":"integer"},"mitigated":{"type":"integer"}},"required":["created","engagement_id","mitigated","test_id","updated"]},"RawFile":{"type":"object","properties":{"file":{"type":"string","format":"uri"}},"required":["file"]},"ReImportFindings":{"type":"object","properties":{"limit":{"type":"integer"},"created":{"type":"array","items":{"$ref":"#/components/schemas/FindingPreviewItem"}},"reactivated":{"type":"array","items":{"$ref":"#/components/schemas/FindingPreviewItem"}},"closed":{"type":"array","items":{"$ref":"#/components/schemas/FindingPreviewItem"}}},"required":["closed","created","limit","reactivated"]},"ReImportPreviewRequestRequest":{"type":"object","description":"Request serializer for reimport preview.","properties":{"scan_type":{"type":"string","minLength":1},"file":{"type":"string","format":"binary"},"test":{"type":"integer","nullable":true,"description":"Direct test ID. If omitted, engagement + scan_type are used to find the test."},"product":{"type":"integer","nullable":true,"description":"Product ID (required when using engagement criteria)"},"engagement":{"type":"object","description":"Exactly one of: engagement_id, name, branch_tag, or tags. With multipart/form-data, pass this field as a JSON string.","properties":{"engagement_id":{"type":"integer","nullable":true},"name":{"type":"string","nullable":true},"branch_tag":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"string"},"nullable":true}}},"close_old_findings":{"type":"boolean","default":true},"do_not_reactivate":{"type":"boolean","default":false},"service":{"type":"string","nullable":true},"minimum_severity":{"enum":["Info","Low","Medium","High","Critical"],"type":"string","description":"* `Info` - Info\n* `Low` - Low\n* `Medium` - Medium\n* `High` - High\n* `Critical` - Critical","x-spec-enum-id":"fc5d16a20ed06136","default":"Info"},"findings_limit":{"type":"integer","maximum":250,"minimum":1,"default":10}},"required":["file","scan_type"]},"ReImportPreviewResponse":{"type":"object","description":"Response serializer for reimport preview.","properties":{"parsed_findings_count":{"type":"integer"},"statistics":{"$ref":"#/components/schemas/PreviewReImportStatistics"},"findings":{"$ref":"#/components/schemas/ReImportFindings"},"product_id":{"type":"integer"},"product_name":{"type":"string"},"engagement_id":{"type":"integer"},"engagement_name":{"type":"string"},"engagement_branch_tag":{"type":"string","nullable":true},"engagement_version":{"type":"string","nullable":true},"engagement_tags":{"type":"array","items":{"type":"string"}},"test_id":{"type":"integer","nullable":true},"test_title":{"type":"string","nullable":true},"existing_test_found":{"type":"boolean"},"scan_type":{"type":"string"}},"required":["engagement_branch_tag","engagement_id","engagement_name","engagement_tags","engagement_version","existing_test_found","findings","parsed_findings_count","product_id","product_name","scan_type","statistics","test_id","test_title"]},"ReachabilityEvidenceFrameRequest":{"type":"object","properties":{"file":{"type":"string","nullable":true},"line":{"type":"integer","nullable":true},"symbol":{"type":"string","nullable":true}}},"ReachabilityIngestResponse":{"type":"object","description":"Response documentation for the ingest endpoints (contract-pinned).","properties":{"run_id":{"type":"integer"},"received":{"type":"integer"},"matched_items":{"type":"integer"},"matched_findings":{"type":"integer"},"unmatched_items":{"type":"integer"},"unmatched_sample":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["matched_findings","matched_items","received","run_id","unmatched_items","unmatched_sample"]},"ReachabilityVerdictItemRequest":{"type":"object","properties":{"vulnerability_ids":{"type":"array","items":{"type":"string","minLength":1,"maxLength":200},"description":"CVE/GHSA/advisory ids used to match the item onto findings."},"purl":{"type":"string","maxLength":2000},"component_name":{"type":"string","maxLength":500},"component_version":{"type":"string","maxLength":200},"file_path":{"type":"string","maxLength":4000},"line":{"type":"integer","minimum":0,"nullable":true},"verdict":{"enum":["potentially_reachable","reachable_runtime","reachable_static","unreachable"],"type":"string","x-spec-enum-id":"48c57df6296ed705","description":"Normalized verdict; UNKNOWN is never asserted (omit the item instead).\n\n* `potentially_reachable` - potentially_reachable\n* `reachable_runtime` - reachable_runtime\n* `reachable_static` - reachable_static\n* `unreachable` - unreachable"},"confidence":{"type":"number","format":"double","maximum":1.0,"minimum":0.0},"evidence":{"type":"array","items":{"$ref":"#/components/schemas/ReachabilityEvidenceFrameRequest"}},"analyzed_commit":{"type":"string","maxLength":64}},"required":["verdict"]},"RecommendationDetail":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"run":{"type":"integer","readOnly":true,"nullable":true,"description":"The run that produced this recommendation"},"domain":{"enum":["cross_tool_dedupe","dedupe_hygiene","priority_engine","capacity_planning"],"type":"string","x-spec-enum-id":"56739ad3122fdce3","readOnly":true,"description":"Which settings area this recommendation concerns\n\n* `cross_tool_dedupe` - Cross-Tool Deduplication\n* `dedupe_hygiene` - Deduplication Hygiene\n* `priority_engine` - Prioritization Engine\n* `capacity_planning` - Capacity Planning"},"kind":{"enum":["set_cross_tool_config","hygiene_note","remove_dead_config","prune_undeclarable_fields","create_priority_engine","capacity_note"],"type":"string","x-spec-enum-id":"11d8ba8ac1fffb73","readOnly":true,"description":"The specific action this recommendation would take\n\n* `set_cross_tool_config` - Set cross-tool deduplication\n* `hygiene_note` - Deduplication hygiene note\n* `remove_dead_config` - Remove dead deduplication configuration\n* `prune_undeclarable_fields` - Prune undeclarable hash fields\n* `create_priority_engine` - Create prioritization engine\n* `capacity_note` - Capacity and tier projection"},"target_key":{"type":"string","readOnly":true,"description":"Canonical identifier of what this recommendation targets, used to supersede stale ones"},"target":{"readOnly":true,"description":"Structured reference to what the recommendation acts on (e.g. the tool group)"},"title":{"type":"string","readOnly":true,"description":"A short summary of the recommendation"},"confidence":{"enum":["high","medium","low"],"type":"string","x-spec-enum-id":"3cd2babd9a875ec3","readOnly":true,"description":"How well the data supports this recommendation\n\n* `high` - High\n* `medium` - Medium\n* `low` - Low"},"status":{"enum":["PROPOSED","APPLIED","DISMISSED","SUPERSEDED","REVERTED"],"type":"string","x-spec-enum-id":"dd9b37f34bddcee0","readOnly":true,"description":"Lifecycle state of this recommendation\n\n* `PROPOSED` - Proposed\n* `APPLIED` - Applied\n* `DISMISSED` - Dismissed\n* `SUPERSEDED` - Superseded\n* `REVERTED` - Reverted"},"rationale":{"type":"string","readOnly":true,"description":"Why this change is recommended"},"proposal":{"readOnly":true,"description":"The exact settings the apply step would write"},"current_value":{"readOnly":true,"description":"Snapshot of the current configuration when the recommendation was generated, for the diff and staleness check"},"evidence":{"readOnly":true,"description":"The grounding facts cited in support of the recommendation"},"impact":{"readOnly":true,"description":"Simulated effect of applying the recommendation, including estimated rehash cost"},"validation_notes":{"readOnly":true,"description":"Warnings and downgrades recorded during deterministic validation"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"When this recommendation was generated"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"When this recommendation last changed"},"dismissed_reason":{"type":"string","readOnly":true,"description":"Why a reviewer dismissed this recommendation, if given"},"superseded_by":{"type":"integer","readOnly":true,"nullable":true,"description":"A newer recommendation for the same target that replaced this one"},"applied_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who applied this recommendation"},"applied_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Applied Timestamp","description":"When the recommendation was applied"},"previous_value":{"readOnly":true,"description":"The configuration in force immediately before apply, captured for revert"},"apply_result":{"readOnly":true,"description":"What the apply step did (e.g. the rehash tasks it dispatched, the engine it created)"},"reverted_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who reverted this recommendation"},"reverted_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Reverted Timestamp","description":"When the recommendation was reverted"}},"required":["applied_at","applied_by","apply_result","confidence","created_at","current_value","dismissed_reason","domain","evidence","id","impact","kind","previous_value","proposal","rationale","reverted_at","reverted_by","run","status","superseded_by","target","target_key","title","updated_at","validation_notes"]},"RecommendationList":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"run":{"type":"integer","readOnly":true,"nullable":true,"description":"The run that produced this recommendation"},"domain":{"enum":["cross_tool_dedupe","dedupe_hygiene","priority_engine","capacity_planning"],"type":"string","x-spec-enum-id":"56739ad3122fdce3","readOnly":true,"description":"Which settings area this recommendation concerns\n\n* `cross_tool_dedupe` - Cross-Tool Deduplication\n* `dedupe_hygiene` - Deduplication Hygiene\n* `priority_engine` - Prioritization Engine\n* `capacity_planning` - Capacity Planning"},"kind":{"enum":["set_cross_tool_config","hygiene_note","remove_dead_config","prune_undeclarable_fields","create_priority_engine","capacity_note"],"type":"string","x-spec-enum-id":"11d8ba8ac1fffb73","readOnly":true,"description":"The specific action this recommendation would take\n\n* `set_cross_tool_config` - Set cross-tool deduplication\n* `hygiene_note` - Deduplication hygiene note\n* `remove_dead_config` - Remove dead deduplication configuration\n* `prune_undeclarable_fields` - Prune undeclarable hash fields\n* `create_priority_engine` - Create prioritization engine\n* `capacity_note` - Capacity and tier projection"},"target_key":{"type":"string","readOnly":true,"description":"Canonical identifier of what this recommendation targets, used to supersede stale ones"},"target":{"readOnly":true,"description":"Structured reference to what the recommendation acts on (e.g. the tool group)"},"title":{"type":"string","readOnly":true,"description":"A short summary of the recommendation"},"confidence":{"enum":["high","medium","low"],"type":"string","x-spec-enum-id":"3cd2babd9a875ec3","readOnly":true,"description":"How well the data supports this recommendation\n\n* `high` - High\n* `medium` - Medium\n* `low` - Low"},"status":{"enum":["PROPOSED","APPLIED","DISMISSED","SUPERSEDED","REVERTED"],"type":"string","x-spec-enum-id":"dd9b37f34bddcee0","readOnly":true,"description":"Lifecycle state of this recommendation\n\n* `PROPOSED` - Proposed\n* `APPLIED` - Applied\n* `DISMISSED` - Dismissed\n* `SUPERSEDED` - Superseded\n* `REVERTED` - Reverted"},"rationale":{"type":"string","readOnly":true,"description":"Why this change is recommended"},"proposal":{"readOnly":true,"description":"The exact settings the apply step would write"},"current_value":{"readOnly":true,"description":"Snapshot of the current configuration when the recommendation was generated, for the diff and staleness check"},"evidence":{"readOnly":true,"description":"The grounding facts cited in support of the recommendation"},"impact":{"readOnly":true,"description":"Simulated effect of applying the recommendation, including estimated rehash cost"},"validation_notes":{"readOnly":true,"description":"Warnings and downgrades recorded during deterministic validation"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"When this recommendation was generated"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"When this recommendation last changed"}},"required":["confidence","created_at","current_value","domain","evidence","id","impact","kind","proposal","rationale","run","status","target","target_key","title","updated_at","validation_notes"]},"RecommendationRun":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"domains":{"readOnly":true,"description":"Which advisor domains this run was asked to cover"},"status":{"enum":["QUEUED","RUNNING","SUCCEEDED","FAILED","CANCELLED"],"type":"string","x-spec-enum-id":"60560380022a1906","readOnly":true,"description":"Lifecycle state of the run\n\n* `QUEUED` - Queued\n* `RUNNING` - Running\n* `SUCCEEDED` - Succeeded\n* `FAILED` - Failed\n* `CANCELLED` - Cancelled"},"stage":{"enum":["queued","collecting-grounding","generating-recommendations","validating-impact","assembling-results","done"],"type":"string","x-spec-enum-id":"d31c48d45d45ff4c","readOnly":true,"description":"Which step of the pipeline is running\n\n* `queued` - Queued\n* `collecting-grounding` - Collecting configuration and statistics\n* `generating-recommendations` - Generating recommendations\n* `validating-impact` - Validating and simulating impact\n* `assembling-results` - Assembling results\n* `done` - Done"},"stage_history":{"readOnly":true,"description":"Ordered record of stage transitions, for the progress display"},"prompt_version":{"type":"string","readOnly":true,"description":"Version of the prompt set that produced this run, for regression tracking"},"root_cause":{"type":"string","readOnly":true,"nullable":true,"description":"On failure, a scrubbed explanation safe to show the requester"},"dropped_items":{"readOnly":true,"description":"Generated recommendations discarded during validation, with the reason, for transparency"},"attempts":{"type":"integer","readOnly":true,"description":"How many times this run has been dispatched (1 = original, >1 = resumed)"},"llm_calls":{"type":"integer","readOnly":true,"description":"Number of model calls this run made, including schema repairs"},"tokens_in":{"type":"integer","readOnly":true,"title":"Input Tokens","description":"Total prompt tokens across the run"},"tokens_out":{"type":"integer","readOnly":true,"title":"Output Tokens","description":"Total completion tokens across the run"},"cost_usd":{"type":"string","format":"decimal","pattern":"^-?\\d{0,6}(?:\\.\\d{0,6})?$","readOnly":true,"title":"Cost (USD)","description":"Derived LLM cost for the run"},"llm_provider":{"type":"string","readOnly":true,"description":"Which provider generated this run's recommendations"},"llm_model":{"type":"string","readOnly":true,"description":"Which model id generated this run's recommendations"},"recommendation_count":{"type":"integer","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"When the run was requested"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"When the run record last changed"},"finished_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Finished Timestamp","description":"When the run reached a terminal state"}},"required":["attempts","cost_usd","created_at","domains","dropped_items","finished_at","id","llm_calls","llm_model","llm_provider","prompt_version","recommendation_count","root_cause","stage","stage_history","status","tokens_in","tokens_out","updated_at"]},"RecomputeRequestRequest":{"type":"object","properties":{"product":{"type":"integer","nullable":true,"description":"The id of the one product to regroup. Absent regroups everything (administrators only)."}}},"Record":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"connector_name":{"type":"string","readOnly":true},"connector_config_id":{"type":"integer","readOnly":true},"connector_type":{"type":"string","readOnly":true},"scan_type":{"type":"string","readOnly":true},"mapping":{"$ref":"#/components/schemas/Mapping"},"extended_mapping":{"allOf":[{"$ref":"#/components/schemas/ExpandedMapping"}],"readOnly":true},"delta_sync_timestamp":{"type":"string","format":"date-time","readOnly":true},"vendor_equivalent_product_description":{"type":"string","default":""},"vendor_equivalent_product_name":{"type":"string","description":"The name of the Vendor Equivalent Product","maxLength":512},"vendor_equivalent_product_id":{"type":"string","description":"The unique ID of the Vendor Equivalent Product","maxLength":512},"parent_vendor_equivalent_product_id":{"type":"string","description":"The Vendor Equivalent Product ID of this record's parent record within the same connector config, when the connector declares one (e.g. the repository an artifact lives in). Used to materialize the asset hierarchy once both records are mapped.","maxLength":512},"first_seen":{"type":"string","format":"date-time","description":"This is the first time this record has been seen in the security tool"},"last_seen":{"type":"string","format":"date-time","description":"This is the last time this record has been seen in the security tool"},"finalized":{"type":"string","format":"date-time","nullable":true,"description":"This is the time that the object mapping was completed for the first time. This marks the last time that dojo will make any changes to this record"},"sync_checkpoint_key":{"type":"string","nullable":true,"description":"Identifies the sync run that last finished this record. A worker that resumes an interrupted sync skips every record already carrying the current run's key, so a restart resumes where it stopped instead of re-syncing the whole connector.","maxLength":64},"sync_checkpoint_at":{"type":"string","format":"date-time","nullable":true,"description":"When this record's findings last finished importing. Doubles as per-record sync telemetry: a record whose checkpoint is far behind its siblings is one whose vendor is slow or failing."},"state":{"enum":["NEW","GOOD","STALE","MISSING","IGNORED","PARTIAL","",null],"type":"string","x-spec-enum-id":"bd142512a4c8aa6e","nullable":true,"description":"The state of the record as it exists\n\n* `NEW` - NEW\n* `GOOD` - GOOD\n* `STALE` - STALE\n* `MISSING` - MISSING\n* `IGNORED` - IGNORED\n* `PARTIAL` - PARTIAL"},"custom_attributes":{"description":"Key value pairs that represent all that cannot be captured in the standard definition of a record"}},"required":["connector_config_id","connector_name","connector_type","delta_sync_timestamp","extended_mapping","id","scan_type","vendor_equivalent_product_id","vendor_equivalent_product_name"]},"RecordRequest":{"type":"object","properties":{"mapping":{"$ref":"#/components/schemas/MappingRequest"},"vendor_equivalent_product_description":{"type":"string","default":""},"vendor_equivalent_product_name":{"type":"string","minLength":1,"description":"The name of the Vendor Equivalent Product","maxLength":512},"vendor_equivalent_product_id":{"type":"string","minLength":1,"description":"The unique ID of the Vendor Equivalent Product","maxLength":512},"parent_vendor_equivalent_product_id":{"type":"string","description":"The Vendor Equivalent Product ID of this record's parent record within the same connector config, when the connector declares one (e.g. the repository an artifact lives in). Used to materialize the asset hierarchy once both records are mapped.","maxLength":512},"first_seen":{"type":"string","format":"date-time","description":"This is the first time this record has been seen in the security tool"},"last_seen":{"type":"string","format":"date-time","description":"This is the last time this record has been seen in the security tool"},"finalized":{"type":"string","format":"date-time","nullable":true,"description":"This is the time that the object mapping was completed for the first time. This marks the last time that dojo will make any changes to this record"},"sync_checkpoint_key":{"type":"string","nullable":true,"description":"Identifies the sync run that last finished this record. A worker that resumes an interrupted sync skips every record already carrying the current run's key, so a restart resumes where it stopped instead of re-syncing the whole connector.","maxLength":64},"sync_checkpoint_at":{"type":"string","format":"date-time","nullable":true,"description":"When this record's findings last finished importing. Doubles as per-record sync telemetry: a record whose checkpoint is far behind its siblings is one whose vendor is slow or failing."},"state":{"enum":["NEW","GOOD","STALE","MISSING","IGNORED","PARTIAL","",null],"type":"string","x-spec-enum-id":"bd142512a4c8aa6e","nullable":true,"description":"The state of the record as it exists\n\n* `NEW` - NEW\n* `GOOD` - GOOD\n* `STALE` - STALE\n* `MISSING` - MISSING\n* `IGNORED` - IGNORED\n* `PARTIAL` - PARTIAL"},"custom_attributes":{"description":"Key value pairs that represent all that cannot be captured in the standard definition of a record"}},"required":["vendor_equivalent_product_id","vendor_equivalent_product_name"]},"RecordStatus":{"type":"object","properties":{"state":{"enum":["GOOD","IGNORED"],"type":"string","description":"* `GOOD` - GOOD\n* `IGNORED` - IGNORED","x-spec-enum-id":"8f517a58d3bf4672"}},"required":["state"]},"RegisterRunRequest":{"type":"object","description":"``POST register_run`` — start a runtime session.\n\n``product`` resolves only among the products ``user`` may import scan results into, so any other id\nanswers the same \"does not exist\" error as an id that names no product.","properties":{"agent_id":{"type":"string","default":"","maxLength":255},"system_prompt":{"type":"string","default":"","maxLength":50000},"product":{"type":"integer","nullable":true}}},"Regulation":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"The name of the regulation.","maxLength":128},"acronym":{"type":"string","description":"A shortened representation of the name.","maxLength":20},"category":{"enum":["privacy","finance","education","medical","corporate","security","government","other"],"type":"string","x-spec-enum-id":"18b03e6cbd7d3e7d","description":"The subject of the regulation.\n\n* `privacy` - Privacy\n* `finance` - Finance\n* `education` - Education\n* `medical` - Medical\n* `corporate` - Corporate\n* `security` - Security\n* `government` - Government\n* `other` - Other"},"jurisdiction":{"type":"string","description":"The territory over which the regulation applies.","maxLength":64},"description":{"type":"string","description":"Information about the regulation's purpose."},"reference":{"description":"An external URL for more information.","oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]}},"required":["acronym","category","id","jurisdiction","name"]},"RegulationRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"The name of the regulation.","maxLength":128},"acronym":{"type":"string","minLength":1,"description":"A shortened representation of the name.","maxLength":20},"category":{"enum":["privacy","finance","education","medical","corporate","security","government","other"],"type":"string","x-spec-enum-id":"18b03e6cbd7d3e7d","description":"The subject of the regulation.\n\n* `privacy` - Privacy\n* `finance` - Finance\n* `education` - Education\n* `medical` - Medical\n* `corporate` - Corporate\n* `security` - Security\n* `government` - Government\n* `other` - Other"},"jurisdiction":{"type":"string","minLength":1,"description":"The territory over which the regulation applies.","maxLength":64},"description":{"type":"string","description":"Information about the regulation's purpose."},"reference":{"description":"An external URL for more information.","oneOf":[{"type":"string","format":"uri","maxLength":200},{"type":"string","maxLength":0}]}},"required":["acronym","category","jurisdiction","name"]},"RegulatoryAssessment":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","nullable":true,"description":"The product whose evidence is being assessed, for a single-asset scope"},"product_name":{"type":"string","readOnly":true},"catalog":{"type":"integer","title":"Regulatory Catalog","description":"The regulatory obligation catalog used by this assessment"},"catalog_name":{"type":"string","readOnly":true},"period_start":{"type":"string","format":"date","description":"First date included in the evidence period"},"period_end":{"type":"string","format":"date","description":"Last date included in the evidence period"},"status":{"enum":["draft","in_review","final"],"type":"string","x-spec-enum-id":"6a2167955947f373","description":"Assessment workflow status\n\n* `draft` - Draft\n* `in_review` - In review\n* `final` - Final"},"created_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who started the assessment"},"notes":{"type":"string","description":"Assessment-level notes"},"product_release":{"type":"string","title":"Release Assessed","description":"The version or release of the asset this assessment covers, per CRA Annex VII point 1(b)","maxLength":128},"summary":{"type":"object","additionalProperties":{},"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true}},"required":["catalog","catalog_name","created_at","created_by","id","period_end","period_start","product_name","summary","updated_at"]},"RegulatoryAssessmentRequest":{"type":"object","description":"Base serializer for all models.","properties":{"product":{"type":"integer","nullable":true,"description":"The product whose evidence is being assessed, for a single-asset scope"},"catalog":{"type":"integer","title":"Regulatory Catalog","description":"The regulatory obligation catalog used by this assessment"},"period_start":{"type":"string","format":"date","description":"First date included in the evidence period"},"period_end":{"type":"string","format":"date","description":"Last date included in the evidence period"},"status":{"enum":["draft","in_review","final"],"type":"string","x-spec-enum-id":"6a2167955947f373","description":"Assessment workflow status\n\n* `draft` - Draft\n* `in_review` - In review\n* `final` - Final"},"notes":{"type":"string","description":"Assessment-level notes"},"product_release":{"type":"string","title":"Release Assessed","description":"The version or release of the asset this assessment covers, per CRA Annex VII point 1(b)","maxLength":128}},"required":["catalog","period_end","period_start"]},"RegulatoryProfile":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"product_name":{"type":"string","readOnly":true},"pci_scope_confirmed_by_username":{"type":"string","readOnly":true},"effective_public_facing_web_app":{"type":"boolean","readOnly":true},"effective_assessment_anchor":{"type":"string","format":"date","readOnly":true},"pci_scope":{"enum":["not_assessed","cde","connected_or_security_impacting","out_of_scope"],"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},"pci_component_kind":{"enum":["unspecified","bespoke_or_custom_software","third_party_software","system_component","payment_page"],"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},"pci_public_facing_web_app":{"type":"boolean","nullable":true,"title":"Public-facing web application","description":"Whether this product is a public-facing web application, which triggers Requirements 6.4.1 and 6.4.2. Left unset it is derived from the product being internet accessible and having an external audience; set it explicitly to override that derivation."},"pci_scope_confirmed_at":{"type":"string","format":"date","readOnly":true,"nullable":true,"title":"Scope confirmed on","description":"The date the product's PCI DSS scope was last confirmed, per Requirement 12.5.2 (at least every 12 months, or every 6 months for service providers)."},"pci_assessment_anchor":{"type":"string","format":"date","nullable":true,"title":"Assessment anchor date","description":"The date the PCI DSS assessment year is anchored to, which sets the start of the Requirement 11 quarterly scan grid. Left unset it defaults to 1 January of the current year."},"supports_critical_or_important_function":{"type":"boolean","title":"Supports a critical or important function","description":"Whether this product supports a critical or important function, per DORA Article 8(1). Drives the weekly scanning expectation for such assets."},"cra_product_class":{"enum":["not_applicable","default","important_class_1","important_class_2","critical"],"type":"string","x-spec-enum-id":"d4721e87a16da54d","description":"The product's class under the Cyber Resilience Act (Article 7, Annexes III and IV), which sets its conformity assessment route. Recorded here for reporting.\n\n* `not_applicable` - Not applicable\n* `default` - Default\n* `important_class_1` - Important, class I\n* `important_class_2` - Important, class II\n* `critical` - Critical"},"support_period_end":{"type":"string","format":"date","nullable":true,"description":"The end of the product's support period, per CRA Article 13(8). Past this date the product should stop appearing as in support in evidence."},"security_contact":{"type":"string","description":"An email address or URL for reporting vulnerabilities, per CRA Annex I Part II point 6.","maxLength":255},"cvd_policy_url":{"title":"Coordinated vulnerability disclosure policy URL","description":"A link to the product's coordinated vulnerability disclosure policy, per CRA Annex I Part II point 5.","oneOf":[{"type":"string","format":"uri","maxLength":512},{"type":"string","maxLength":0}]},"is_cyber_device":{"type":"boolean","title":"Cyber device","description":"Whether this product is a cyber device whose submission carries the Section 524B elements. Recorded by the sponsor; DefectDojo does not determine the classification."},"device_identifier":{"type":"string","description":"The Unique Device Identifier, or an internal model code where no UDI has been issued.","maxLength":128},"submission_stage":{"enum":["not_applicable","premarket","postmarket"],"type":"string","x-spec-enum-id":"82185feab3391f84","description":"Where the device sits relative to its submission.\n\n* `not_applicable` - Not applicable\n* `premarket` - Premarket\n* `postmarket` - Postmarket"},"patch_cycle_days":{"type":"integer","maximum":2147483647,"minimum":1,"nullable":true,"title":"Patch cycle (days)","description":"The regular interval on which the sponsor ships security updates. Section 524B asks for a cycle that is reasonably justified, so the interval and its rationale are recorded together."},"patch_cycle_rationale":{"type":"string","description":"Why that interval is appropriate for this device."},"sla_locked":{"type":"boolean","description":"When set, this product opts out of criticality-driven SLA assignment and keeps its current SLA configuration."},"notes":{"type":"string","description":"Free-form notes for the assessor."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the profile was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the profile was updated"},"product":{"type":"integer","description":"The product this regulatory profile describes"},"pci_scope_confirmed_by":{"type":"integer","readOnly":true,"nullable":true,"title":"Scope confirmed by","description":"The user who last confirmed the product's PCI DSS scope."}},"required":["created_at","effective_assessment_anchor","effective_public_facing_web_app","id","pci_scope_confirmed_at","pci_scope_confirmed_by","pci_scope_confirmed_by_username","product","product_name","updated_at"]},"RegulatoryProfileRequest":{"type":"object","description":"Base serializer for all models.","properties":{"pci_scope":{"enum":["not_assessed","cde","connected_or_security_impacting","out_of_scope"],"type":"string","x-spec-enum-id":"a29a8cd904c7a37b","title":"PCI DSS scope","description":"Whether this product is in the cardholder data environment, connected to or security-impacting it, or out of scope, per PCI DSS Requirement 12.5.1. The assessor decides the final scope; this records the entity's determination.\n\n* `not_assessed` - Not assessed\n* `cde` - Cardholder data environment\n* `connected_or_security_impacting` - Connected to or security-impacting\n* `out_of_scope` - Out of scope"},"pci_component_kind":{"enum":["unspecified","bespoke_or_custom_software","third_party_software","system_component","payment_page"],"type":"string","x-spec-enum-id":"3db51d1a69062b06","title":"PCI DSS component kind","description":"What kind of component this product is for the Requirement 6.3.2 software inventory: bespoke or custom software, third-party software, a system component, or a payment page.\n\n* `unspecified` - Unspecified\n* `bespoke_or_custom_software` - Bespoke or custom software\n* `third_party_software` - Third-party software\n* `system_component` - System component\n* `payment_page` - Payment page"},"pci_public_facing_web_app":{"type":"boolean","nullable":true,"title":"Public-facing web application","description":"Whether this product is a public-facing web application, which triggers Requirements 6.4.1 and 6.4.2. Left unset it is derived from the product being internet accessible and having an external audience; set it explicitly to override that derivation."},"pci_assessment_anchor":{"type":"string","format":"date","nullable":true,"title":"Assessment anchor date","description":"The date the PCI DSS assessment year is anchored to, which sets the start of the Requirement 11 quarterly scan grid. Left unset it defaults to 1 January of the current year."},"supports_critical_or_important_function":{"type":"boolean","title":"Supports a critical or important function","description":"Whether this product supports a critical or important function, per DORA Article 8(1). Drives the weekly scanning expectation for such assets."},"cra_product_class":{"enum":["not_applicable","default","important_class_1","important_class_2","critical"],"type":"string","x-spec-enum-id":"d4721e87a16da54d","description":"The product's class under the Cyber Resilience Act (Article 7, Annexes III and IV), which sets its conformity assessment route. Recorded here for reporting.\n\n* `not_applicable` - Not applicable\n* `default` - Default\n* `important_class_1` - Important, class I\n* `important_class_2` - Important, class II\n* `critical` - Critical"},"support_period_end":{"type":"string","format":"date","nullable":true,"description":"The end of the product's support period, per CRA Article 13(8). Past this date the product should stop appearing as in support in evidence."},"security_contact":{"type":"string","description":"An email address or URL for reporting vulnerabilities, per CRA Annex I Part II point 6.","maxLength":255},"cvd_policy_url":{"title":"Coordinated vulnerability disclosure policy URL","description":"A link to the product's coordinated vulnerability disclosure policy, per CRA Annex I Part II point 5.","oneOf":[{"type":"string","format":"uri","maxLength":512},{"type":"string","maxLength":0}]},"is_cyber_device":{"type":"boolean","title":"Cyber device","description":"Whether this product is a cyber device whose submission carries the Section 524B elements. Recorded by the sponsor; DefectDojo does not determine the classification."},"device_identifier":{"type":"string","description":"The Unique Device Identifier, or an internal model code where no UDI has been issued.","maxLength":128},"submission_stage":{"enum":["not_applicable","premarket","postmarket"],"type":"string","x-spec-enum-id":"82185feab3391f84","description":"Where the device sits relative to its submission.\n\n* `not_applicable` - Not applicable\n* `premarket` - Premarket\n* `postmarket` - Postmarket"},"patch_cycle_days":{"type":"integer","maximum":2147483647,"minimum":1,"nullable":true,"title":"Patch cycle (days)","description":"The regular interval on which the sponsor ships security updates. Section 524B asks for a cycle that is reasonably justified, so the interval and its rationale are recorded together."},"patch_cycle_rationale":{"type":"string","description":"Why that interval is appropriate for this device."},"sla_locked":{"type":"boolean","description":"When set, this product opts out of criticality-driven SLA assignment and keeps its current SLA configuration."},"notes":{"type":"string","description":"Free-form notes for the assessor."},"product":{"type":"integer","description":"The product this regulatory profile describes"}},"required":["product"]},"RegulatoryReport":{"type":"object","description":"A CRA Article 14 report.\n\nCreation goes through ``pro.regulatory.reporting.create_report`` so the stages, their\nstatutory clocks and the audit ledger are written in one transaction. After creation the\nstatutory anchors (``awareness_at``, ``corrective_measure_available_at``) and the report's\nidentity (``product``, ``regime``) are frozen on this serializer: they move only through the\ndedicated actions, each of which needs a justification and writes an audit event, so a PATCH\ncan never silently rewrite a deadline.","properties":{"id":{"type":"integer","readOnly":true},"stages":{"type":"array","items":{"$ref":"#/components/schemas/RegulatoryReportStage"},"readOnly":true},"next_due_at":{"type":"string","format":"date-time","nullable":true,"readOnly":true},"overdue":{"type":"boolean","readOnly":true},"product_name":{"type":"string","readOnly":true},"regime":{"enum":["exploited_vulnerability","severe_incident"],"type":"string","x-spec-enum-id":"dba0969d08d6cd4a","description":"Which Article 14 reporting regime this report falls under.\n\n* `exploited_vulnerability` - Actively exploited vulnerability\n* `severe_incident` - Severe incident"},"reference_code":{"type":"string","description":"A human-facing reference for this report (e.g. an internal case ref).","maxLength":64},"title":{"type":"string","description":"A short operator label for this report.","maxLength":255},"advisory_reference":{"type":"string","description":"An external reference (CVE, vendor advisory id) for a trigger that is not a PSIRT advisory.","maxLength":255},"awareness_at":{"type":"string","format":"date-time","title":"Awareness timestamp","description":"When the manufacturer became aware. The statutory clock anchor; defaults to now at creation but is editable with a mandatory justification (audited)."},"corrective_measure_available_at":{"type":"string","format":"date-time","nullable":true,"title":"Corrective measure available","description":"Anchor for an exploited-vulnerability final report (available + 14 days)."},"sensitivity":{"enum":["standard","restricted"],"type":"string","x-spec-enum-id":"57fcd6a05eeafea4","description":"Sensitivity classification of this report's contents.\n\n* `standard` - Standard\n* `restricted` - Restricted"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the report was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the report was updated"},"product":{"type":"integer","description":"The affected product with digital elements this report concerns."},"advisory":{"type":"integer","nullable":true,"description":"The PSIRT advisory covering the exploited vulnerability, when it exists in PSIRT. Backs the start-a-report-from-an-advisory flow."},"created_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who opened this report."}},"required":["created_at","created_by","id","next_due_at","overdue","product","product_name","regime","stages","updated_at"]},"RegulatoryReportRequest":{"type":"object","description":"A CRA Article 14 report.\n\nCreation goes through ``pro.regulatory.reporting.create_report`` so the stages, their\nstatutory clocks and the audit ledger are written in one transaction. After creation the\nstatutory anchors (``awareness_at``, ``corrective_measure_available_at``) and the report's\nidentity (``product``, ``regime``) are frozen on this serializer: they move only through the\ndedicated actions, each of which needs a justification and writes an audit event, so a PATCH\ncan never silently rewrite a deadline.","properties":{"awareness_justification":{"type":"string","writeOnly":true,"description":"Required when awareness_at is supplied explicitly instead of defaulting to now."},"regime":{"enum":["exploited_vulnerability","severe_incident"],"type":"string","x-spec-enum-id":"dba0969d08d6cd4a","description":"Which Article 14 reporting regime this report falls under.\n\n* `exploited_vulnerability` - Actively exploited vulnerability\n* `severe_incident` - Severe incident"},"reference_code":{"type":"string","description":"A human-facing reference for this report (e.g. an internal case ref).","maxLength":64},"title":{"type":"string","description":"A short operator label for this report.","maxLength":255},"advisory_reference":{"type":"string","description":"An external reference (CVE, vendor advisory id) for a trigger that is not a PSIRT advisory.","maxLength":255},"awareness_at":{"type":"string","format":"date-time","title":"Awareness timestamp","description":"When the manufacturer became aware. The statutory clock anchor; defaults to now at creation but is editable with a mandatory justification (audited)."},"corrective_measure_available_at":{"type":"string","format":"date-time","nullable":true,"title":"Corrective measure available","description":"Anchor for an exploited-vulnerability final report (available + 14 days)."},"sensitivity":{"enum":["standard","restricted"],"type":"string","x-spec-enum-id":"57fcd6a05eeafea4","description":"Sensitivity classification of this report's contents.\n\n* `standard` - Standard\n* `restricted` - Restricted"},"product":{"type":"integer","description":"The affected product with digital elements this report concerns."},"advisory":{"type":"integer","nullable":true,"description":"The PSIRT advisory covering the exploited vulnerability, when it exists in PSIRT. Backs the start-a-report-from-an-advisory flow."}},"required":["product","regime"]},"RegulatoryReportStage":{"type":"object","description":"Read-only view of a stage. Stages change only through the report's audited actions.","properties":{"id":{"type":"integer","readOnly":true},"stage_label":{"type":"string","readOnly":true},"overdue":{"type":"boolean","readOnly":true},"clock_state":{"type":"string","nullable":true,"readOnly":true},"stage":{"enum":["early_warning","notification","final_report"],"type":"string","x-spec-enum-id":"00c6f9cb0d553df7","readOnly":true,"description":"Which Article 14 submission stage this is.\n\n* `early_warning` - Early warning\n* `notification` - Notification\n* `final_report` - Final report"},"anchor_at":{"type":"string","format":"date-time","readOnly":true,"title":"Anchor timestamp","description":"The anchor this stage's statutory deadline was derived from."},"due_at":{"type":"string","format":"date-time","readOnly":true,"title":"Statutory deadline","description":"The authoritative statutory deadline for this stage (UTC)."},"state":{"enum":["pending","submitted"],"type":"string","x-spec-enum-id":"3e885d3c95117b42","readOnly":true,"description":"Whether this stage is still pending or has been submitted.\n\n* `pending` - Pending\n* `submitted` - Submitted"},"submitted_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"When the human submitted this stage to the reporting platform."},"platform_reference":{"type":"string","readOnly":true,"description":"The reporting-platform receipt/reference recorded by the submitter."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the stage was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the stage was updated"},"report":{"type":"integer","readOnly":true,"description":"The regulatory report this stage belongs to."},"submitted_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who recorded the submission."},"sla_clock":{"type":"integer","readOnly":true,"nullable":true,"description":"The statutory SLA clock mirroring this stage's deadline."}},"required":["anchor_at","clock_state","created_at","due_at","id","overdue","platform_reference","report","sla_clock","stage","stage_label","state","submitted_at","submitted_by","updated_at"]},"RegulatoryScopeRequestRequest":{"type":"object","properties":{"regulations":{"type":"array","items":{"type":"string","minLength":1}},"include_support_period":{"type":"boolean"}}},"Relationship":{"type":"object","properties":{"code":{"type":"string"},"forward":{"type":"string"},"reverse":{"type":"string"},"forward_collective":{"type":"string"},"reverse_collective":{"type":"string"},"description":{"type":"string"}},"required":["code","forward","reverse"]},"RemediationBulkUpdateResponse":{"type":"object","properties":{"updated":{"type":"integer"}},"required":["updated"]},"RemediationCallbackRequest":{"type":"object","description":"Terminal direct-remediation result the engine POSTs to\n``/api/v2/sensei/remediation_callback/`` after it applies or reverts a live cloud\nchange (parsed from the orchestrator's ``cloud-remediation-result=`` marker).\n\n``remediation_id`` / ``fix_record_id`` echo the ids carried on the dispatched job\n(see ``pro.cspm.dispatch.build_direct_remediation_job``). On ``applied`` the engine\nreturns the captured ``prior_state`` and the drift fingerprints, which are stored on\nthe CloudRemediation so a later revert can restore the prior config and detect\ndrift; on ``reverted`` the ledger row is closed out. ``root_cause`` populates on the\nfailure states.","properties":{"remediation_id":{"type":"integer"},"fix_record_id":{"type":"integer","nullable":true},"status":{"enum":["applied","reverted","failed","revert_failed"],"type":"string","description":"* `applied` - applied\n* `reverted` - reverted\n* `failed` - failed\n* `revert_failed` - revert_failed","x-spec-enum-id":"adba761275ee6ea9"},"prior_state":{"nullable":true},"precondition_fingerprint":{"type":"string","default":""},"applied_fingerprint":{"type":"string","default":""},"reversible":{"type":"boolean","default":true},"reversibility_reason":{"type":"string","default":""},"root_cause":{"type":"string","default":""}},"required":["remediation_id","status"]},"RemediationMoveResponse":{"type":"object","properties":{"moved":{"type":"integer"}},"required":["moved"]},"RemediationRecomputeResponse":{"type":"object","properties":{"scheduled":{"type":"string"}},"required":["scheduled"]},"RemediationRegroupResponse":{"type":"object","properties":{"scheduled":{"type":"boolean"}},"required":["scheduled"]},"RemediationSplitResponse":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"]},"RemediationTicketText":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]},"RemoveParentRequest":{"type":"object","description":"Body of ``POST /api/v2/assets/{id}/remove_parent/`` (and the ``products`` alias).\n\n``orphan_child_children`` is deliberately required with no default: the two child-handling\nmodes produce different trees, and a caller who did not think about the asset's children\nshould get a 400, not a silent choice. ``false`` closes the gap (the children move under\nthe asset's former parent); ``true`` scatters them (each child becomes a root). Detaching\nwhile KEEPING the subtree is ``PATCH {\"parent\": null}`` on the asset instead.","properties":{"orphan_child_children":{"type":"boolean"}},"required":["orphan_child_children"]},"ReplaceAssetsRequestRequest":{"type":"object","properties":{"dry_run":{"type":"boolean","default":true,"description":"True (the default) returns the plan and writes nothing; false queues the moves."},"move_children":{"type":"boolean","default":true,"description":"Move each moved asset's descendants along with it (the bulk update's default)."}}},"ReportGenerate":{"type":"object","properties":{"executive_summary":{"allOf":[{"$ref":"#/components/schemas/ExecutiveSummary"}],"nullable":true},"product_type":{"allOf":[{"$ref":"#/components/schemas/ProductType"}],"readOnly":true},"product":{"allOf":[{"$ref":"#/components/schemas/Product"}],"readOnly":true},"engagement":{"allOf":[{"$ref":"#/components/schemas/Engagement"}],"readOnly":true},"report_name":{"type":"string","maxLength":200},"report_info":{"type":"string","maxLength":200},"test":{"allOf":[{"$ref":"#/components/schemas/Test"}],"readOnly":true},"endpoint":{"allOf":[{"$ref":"#/components/schemas/Endpoint"}],"readOnly":true},"findings":{"type":"array","items":{"$ref":"#/components/schemas/Finding"},"readOnly":true},"user":{"allOf":[{"$ref":"#/components/schemas/UserStub"}],"readOnly":true},"team_name":{"type":"string","maxLength":200},"title":{"type":"string","maxLength":200},"user_id":{"type":"integer"},"host":{"type":"string","maxLength":200},"finding_notes":{"type":"array","items":{"$ref":"#/components/schemas/FindingToNotes"},"nullable":true},"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/V3EndpointCompatible"},"readOnly":true}},"required":["endpoint","endpoints","engagement","executive_summary","findings","host","product","product_type","report_info","report_name","team_name","test","title","user","user_id"]},"ReportGenerateOptionRequest":{"type":"object","properties":{"include_finding_notes":{"type":"boolean","default":false},"include_finding_images":{"type":"boolean","default":false},"include_executive_summary":{"type":"boolean","default":false},"include_table_of_contents":{"type":"boolean","default":false},"report_type":{"enum":["JSON","HTML","CSV","Excel"],"type":"string","x-spec-enum-id":"024c1946bfd60e13","default":"JSON","description":"Format for the generated report.\n\n* `JSON` - JSON\n* `HTML` - HTML\n* `CSV` - CSV\n* `Excel` - Excel"}}},"RescoreRequestRequest":{"type":"object","description":"Re-run the feed rules over advisories already in the queue.","properties":{"limit":{"type":"integer","maximum":5000,"minimum":1},"feed_source":{"type":"integer","nullable":true}}},"ResetMfaResponse":{"type":"object","properties":{"removed":{"type":"boolean"}},"required":["removed"]},"ResetRequestRequest":{"type":"object","properties":{"fields":{"type":"array","items":{"enum":["title","action_type","target_version","solution","owner_team"],"type":"string","description":"* `title` - title\n* `action_type` - action_type\n* `target_version` - target_version\n* `solution` - solution\n* `owner_team` - owner_team","x-spec-enum-id":"b9f5a1d120eb3375"},"description":"Fields to hand back to the grouping engine. Empty or absent resets every override.","maxItems":5}}},"ResponseTimeframe":{"type":"object","description":"One cell of a policy's matrix.\n\n``max_days`` is exposed read-only beside the stored hours because the hours are the published\nfigure and the days are what the SLA arithmetic uses. A client that only ever saw days could\nnot render the twelve-hour cell the in-force FedRAMP table actually contains.","properties":{"id":{"type":"integer","readOnly":true},"policy":{"type":"integer","description":"The policy this timeframe belongs to."},"impact_level":{"type":"string","nullable":true,"description":"An impact code from the policy's vocabulary, or empty for any impact level.","maxLength":32},"internet_reachable":{"type":"boolean","nullable":true,"description":"Whether this row applies to internet-reachable findings, or null for either."},"credibly_exploitable":{"type":"boolean","nullable":true,"description":"Whether this row applies to credibly exploitable findings, or null for either."},"authorization_level":{"type":"string","nullable":true,"description":"An authorization or certification level from the policy's vocabulary, or empty for any.","maxLength":32},"max_hours":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Maximum Hours","description":"The maximum hours the standard allows for responding to a finding in this cell."},"max_days":{"type":"integer","readOnly":true},"note":{"type":"string","description":"A short citation locating this cell in the published document.","maxLength":256}},"required":["id","max_days","max_hours","policy"]},"ResponseTimeframeRequest":{"type":"object","description":"One cell of a policy's matrix.\n\n``max_days`` is exposed read-only beside the stored hours because the hours are the published\nfigure and the days are what the SLA arithmetic uses. A client that only ever saw days could\nnot render the twelve-hour cell the in-force FedRAMP table actually contains.","properties":{"policy":{"type":"integer","description":"The policy this timeframe belongs to."},"impact_level":{"type":"string","nullable":true,"description":"An impact code from the policy's vocabulary, or empty for any impact level.","maxLength":32},"internet_reachable":{"type":"boolean","nullable":true,"description":"Whether this row applies to internet-reachable findings, or null for either."},"credibly_exploitable":{"type":"boolean","nullable":true,"description":"Whether this row applies to credibly exploitable findings, or null for either."},"authorization_level":{"type":"string","nullable":true,"description":"An authorization or certification level from the policy's vocabulary, or empty for any.","maxLength":32},"max_hours":{"type":"integer","maximum":2147483647,"minimum":0,"title":"Maximum Hours","description":"The maximum hours the standard allows for responding to a finding in this cell."},"note":{"type":"string","description":"A short citation locating this cell in the published document.","maxLength":256}},"required":["max_hours","policy"]},"RevokeApiTokenRequest":{"type":"object","description":"Input for revoking a single API token by its key value.","properties":{"key":{"type":"string","writeOnly":true,"minLength":1,"maxLength":256}},"required":["key"]},"RiskAcceptance":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"path":{"type":"string","readOnly":true},"name":{"type":"string","description":"Descriptive name which in the future may also be used to group risk acceptances together across engagements and products","maxLength":300},"recommendation":{"enum":["A","V","M","F","T"],"type":"string","x-spec-enum-id":"8690fff015f0d4c3","title":"Security Recommendation","description":"Recommendation from the security team.\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},"recommendation_details":{"type":"string","nullable":true,"title":"Security Recommendation Details","description":"Explanation of security recommendation"},"decision":{"enum":["A","V","M","F","T"],"type":"string","x-spec-enum-id":"8690fff015f0d4c3","description":"Risk treatment decision by risk owner\n\n* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)"},"decision_details":{"type":"string","nullable":true,"description":"If a compensating control exists to mitigate the finding or reduce risk, then list the compensating control(s)."},"accepted_by":{"type":"string","nullable":true,"description":"The person that accepts the risk, can be outside of DefectDojo.","maxLength":200},"expiration_date":{"type":"string","format":"date-time","nullable":true,"description":"When the risk acceptance expires, the findings will be reactivated (unless disabled below)."},"expiration_date_warned":{"type":"string","format":"date-time","nullable":true,"description":"(readonly) Date at which notice about the risk acceptance expiration was sent."},"expiration_date_handled":{"type":"string","format":"date-time","nullable":true,"description":"(readonly) When the risk acceptance expiration was handled (manually or by the daily job)."},"reactivate_expired":{"type":"boolean","title":"Reactivate findings on expiration","description":"Reactivate findings when risk acceptance expires?"},"restart_sla_expired":{"type":"boolean","title":"Restart SLA on expiration","description":"When enabled, the SLA for findings is restarted when the risk acceptance expires."},"restore_verified_expired":{"type":"boolean","title":"Restore Verified on expiration","description":"When enabled, reactivated findings are also marked Verified when the risk acceptance expires. Only applies when 'Reactivate findings on expiration' is enabled."},"created":{"type":"string","format":"date-time","readOnly":true},"updated":{"type":"string","format":"date-time","readOnly":true},"owner":{"type":"integer","description":"User in DefectDojo owning this acceptance. Only the owner and staff users can edit the risk acceptance."},"accepted_findings":{"type":"array","items":{"type":"integer"}},"notes":{"type":"array","items":{"type":"integer"},"readOnly":true}},"required":["accepted_findings","created","id","name","notes","owner","path","updated"]},"RiskAcceptanceDebtRequestRequest":{"type":"object","properties":{"horizon_days":{"enum":[7,30,60,90],"type":"integer","description":"* `7` - 7\n* `30` - 30\n* `60` - 60\n* `90` - 90","x-spec-enum-id":"05b3a9521023ad92"},"limit":{"type":"integer"}}},"RiskAcceptanceExpireRequest":{"type":"object","properties":{"reason":{"type":"string","maxLength":2000}}},"RiskAcceptanceFindingRecord":{"type":"object","description":"One finding's place in one risk acceptance, for the finding's acceptance history.","properties":{"id":{"type":"integer","readOnly":true},"risk_acceptance":{"type":"integer","readOnly":true},"risk_acceptance_name":{"type":"string","readOnly":true},"finding":{"type":"integer","readOnly":true},"status":{"enum":["pending","accepted","removed","expired","superseded"],"type":"string","description":"* `pending` - Pending\n* `accepted` - Accepted\n* `removed` - Removed\n* `expired` - Expired\n* `superseded` - Superseded","x-spec-enum-id":"e5c09136f0aae665","readOnly":true},"justification":{"type":"string","readOnly":true},"reason":{"type":"string","readOnly":true},"source":{"type":"string","readOnly":true},"added_by":{"type":"string","readOnly":true},"removed_by":{"type":"string","readOnly":true},"accepted_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"closed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"created":{"type":"string","format":"date-time","readOnly":true},"updated":{"type":"string","format":"date-time","readOnly":true}},"required":["accepted_at","added_by","closed_at","created","finding","id","justification","reason","removed_by","risk_acceptance","risk_acceptance_name","source","status","updated"]},"RiskAcceptanceProof":{"type":"object","properties":{"path":{"type":"string","format":"uri"}},"required":["path"]},"RiskAcceptanceRequestRequest":{"type":"object","description":"Request body for asking that findings be accepted, without accepting them.","properties":{"findings":{"type":"array","items":{"type":"integer"}},"name":{"type":"string","minLength":1,"maxLength":100},"reason":{"type":"string","minLength":1,"maxLength":2000},"expiration_date":{"type":"string","format":"date-time","nullable":true},"recommendation":{"enum":["A","V","M","F","T"],"type":"string","description":"* `A` - Accept (The risk is acknowledged, yet remains)\n* `V` - Avoid (Do not engage with whatever creates the risk)\n* `M` - Mitigate (The risk still exists, yet compensating controls make it less of a threat)\n* `F` - Fix (The risk is eradicated)\n* `T` - Transfer (The risk is transferred to a 3rd party)","x-spec-enum-id":"8690fff015f0d4c3","default":"A"},"justification":{"type":"string","maxLength":2000}},"required":["findings","name","reason"]},"RiskAcceptanceState":{"type":"object","description":"Read-only view of where a risk acceptance sits, and where it may go next.","properties":{"workflow_state":{"type":"string","readOnly":true},"allowed_next_states":{"type":"array","items":{"type":"string"},"readOnly":true}},"required":["allowed_next_states","workflow_state"]},"RiskAcceptanceStateTransition":{"type":"object","description":"One recorded move, for the review timeline.","properties":{"id":{"type":"integer","readOnly":true},"from_state":{"enum":["proposed","under_review","approved","rejected","active","expired",null],"type":"string","description":"* `proposed` - Proposed\n* `under_review` - Under Review\n* `approved` - Approved\n* `rejected` - Rejected\n* `active` - Active\n* `expired` - Expired","x-spec-enum-id":"ee63c26bea1505cc","readOnly":true,"nullable":true},"to_state":{"enum":["proposed","under_review","approved","rejected","active","expired"],"type":"string","description":"* `proposed` - Proposed\n* `under_review` - Under Review\n* `approved` - Approved\n* `rejected` - Rejected\n* `active` - Active\n* `expired` - Expired","x-spec-enum-id":"ee63c26bea1505cc","readOnly":true},"actor":{"type":"string","readOnly":true},"reason":{"type":"string","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true},"metadata":{"readOnly":true}},"required":["actor","created","from_state","id","metadata","reason","to_state"]},"RiskAcceptanceToNotes":{"type":"object","properties":{"risk_acceptance_id":{"type":"integer","nullable":true},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"}}},"required":["notes","risk_acceptance_id"]},"RiskAcceptanceTransitionRequest":{"type":"object","description":"Request body for moving a risk acceptance through its review.","properties":{"to_state":{"enum":["proposed","under_review","approved","rejected","active","expired"],"type":"string","description":"* `proposed` - Proposed\n* `under_review` - Under Review\n* `approved` - Approved\n* `rejected` - Rejected\n* `active` - Active\n* `expired` - Expired","x-spec-enum-id":"ee63c26bea1505cc"},"reason":{"type":"string","maxLength":2000}},"required":["to_state"]},"Role":{"type":"object","description":"Read/write serializer for custom roles.\n\n``permissions`` is a nested writable list of ``{permission, scope}`` grants;\nwriting it replaces the role's grant set atomically. ``is_system`` and\n``cloned_from`` are read-only (set only by the seed / the clone action); the\nviewset additionally blocks any write to a built-in (``is_system``) role.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000},"is_owner":{"type":"boolean","readOnly":true},"is_owner_tier":{"type":"boolean","readOnly":true},"is_system":{"type":"boolean","readOnly":true,"description":"Built-in system role. System roles cannot be edited or deleted and define the backport baseline (pk 1-5: Reader/Writer/Maintainer/Owner/API_Importer)."},"cloned_from":{"type":"integer","readOnly":true,"nullable":true,"description":"The role this role was cloned from, if any (clone provenance)."},"permissions":{"type":"array","items":{"$ref":"#/components/schemas/RolePermission"}},"global_user_count":{"type":"integer","nullable":true,"readOnly":true}},"required":["cloned_from","global_user_count","id","is_owner","is_owner_tier","is_system","name"]},"RolePermission":{"type":"object","description":"A single grant on a role: a Permissions enum value at a given scope.","properties":{"permission":{"type":"integer"},"scope":{"type":"integer","default":1}},"required":["permission"]},"RolePermissionRequest":{"type":"object","description":"A single grant on a role: a Permissions enum value at a given scope.","properties":{"permission":{"type":"integer"},"scope":{"type":"integer","default":1}},"required":["permission"]},"RoleRequest":{"type":"object","description":"Read/write serializer for custom roles.\n\n``permissions`` is a nested writable list of ``{permission, scope}`` grants;\nwriting it replaces the role's grant set atomically. ``is_system`` and\n``cloned_from`` are read-only (set only by the seed / the clone action); the\nviewset additionally blocks any write to a built-in (``is_system``) role.","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"maxLength":4000},"permissions":{"type":"array","items":{"$ref":"#/components/schemas/RolePermissionRequest"}}},"required":["name"]},"RootCause":{"type":"object","description":"A root cause with counts scoped to the requesting token's authorization.","properties":{"id":{"type":"integer","readOnly":true},"cause_type":{"enum":["component","cve","resource","endpoint","image"],"type":"string","x-spec-enum-id":"920ce49358619366","readOnly":true,"description":"What kind of root cause this is: a software component, a CVE, an infrastructure resource, a container image, or a weakness class at a web endpoint.\n\n* `component` - Component\n* `cve` - CVE\n* `resource` - Resource\n* `endpoint` - Endpoint\n* `image` - Container Image"},"identity_key":{"type":"string","readOnly":true,"description":"Normalized, globally-unique key for this root cause, e.g. 'component:pkg:maven/org.apache.logging.log4j/log4j-core@2.14.1' or 'cve:CVE-2021-44228'."},"display_name":{"type":"string","readOnly":true,"description":"Human-readable label shown in the UI."},"canonical_purl":{"type":"string","readOnly":true,"nullable":true,"description":"For component causes, the canonical package URL (qualifiers/subpath stripped)."},"fixed_version":{"type":"string","readOnly":true,"nullable":true,"description":"For component causes, the recommended fixed version if known."},"cve_list":{"readOnly":true,"description":"CVEs aggregated across this cluster's member findings (for display)."},"muted":{"type":"boolean","readOnly":true,"description":"Whether a user has muted this root cause (durable, cluster-level feedback)."},"mute_reason":{"type":"string","readOnly":true,"nullable":true,"description":"Optional reason recorded when the root cause was muted."},"active_member_count":{"type":"integer","readOnly":true,"default":0},"product_count":{"type":"integer","readOnly":true,"default":0},"organization_count":{"type":"integer","readOnly":true,"default":0},"max_priority":{"type":"number","format":"double","readOnly":true,"nullable":true},"risk":{"type":"string","nullable":true,"readOnly":true},"severity_score":{"type":"number","format":"double","readOnly":true,"default":0.0},"score_basis":{"type":"string","readOnly":true},"subsumed_by_id":{"type":"integer","readOnly":true},"subsumed_by_name":{"type":"string","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the root cause was first identified."},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the root cause was updated."}},"required":["active_member_count","canonical_purl","cause_type","created_at","cve_list","display_name","fixed_version","id","identity_key","max_priority","mute_reason","muted","organization_count","product_count","risk","score_basis","severity_score","subsumed_by_id","subsumed_by_name","updated_at"]},"RootCauseDetail":{"type":"object","description":"Retrieve payload.\n\nCarries no member list. Members were previously embedded here in full, which made the\nresponse size proportional to the cluster -- and the clusters worth retrieving are precisely\nthe large ones, so the most valuable cause produced the largest payload. Members and the\nper-product rollup are paginated sub-resources (``/findings/`` and ``/products/``) instead.","properties":{"id":{"type":"integer","readOnly":true},"cause_type":{"enum":["component","cve","resource","endpoint","image"],"type":"string","x-spec-enum-id":"920ce49358619366","readOnly":true,"description":"What kind of root cause this is: a software component, a CVE, an infrastructure resource, a container image, or a weakness class at a web endpoint.\n\n* `component` - Component\n* `cve` - CVE\n* `resource` - Resource\n* `endpoint` - Endpoint\n* `image` - Container Image"},"identity_key":{"type":"string","readOnly":true,"description":"Normalized, globally-unique key for this root cause, e.g. 'component:pkg:maven/org.apache.logging.log4j/log4j-core@2.14.1' or 'cve:CVE-2021-44228'."},"display_name":{"type":"string","readOnly":true,"description":"Human-readable label shown in the UI."},"canonical_purl":{"type":"string","readOnly":true,"nullable":true,"description":"For component causes, the canonical package URL (qualifiers/subpath stripped)."},"fixed_version":{"type":"string","readOnly":true,"nullable":true,"description":"For component causes, the recommended fixed version if known."},"cve_list":{"readOnly":true,"description":"CVEs aggregated across this cluster's member findings (for display)."},"muted":{"type":"boolean","readOnly":true,"description":"Whether a user has muted this root cause (durable, cluster-level feedback)."},"mute_reason":{"type":"string","readOnly":true,"nullable":true,"description":"Optional reason recorded when the root cause was muted."},"active_member_count":{"type":"integer","readOnly":true,"default":0},"product_count":{"type":"integer","readOnly":true,"default":0},"organization_count":{"type":"integer","readOnly":true,"default":0},"max_priority":{"type":"number","format":"double","readOnly":true,"nullable":true},"risk":{"type":"string","nullable":true,"readOnly":true},"severity_score":{"type":"number","format":"double","readOnly":true,"default":0.0},"score_basis":{"type":"string","readOnly":true},"subsumed_by_id":{"type":"integer","readOnly":true},"subsumed_by_name":{"type":"string","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the root cause was first identified."},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the root cause was updated."}},"required":["active_member_count","canonical_purl","cause_type","created_at","cve_list","display_name","fixed_version","id","identity_key","max_priority","mute_reason","muted","organization_count","product_count","risk","score_basis","severity_score","subsumed_by_id","subsumed_by_name","updated_at"]},"RootCauseMember":{"type":"object","description":"One member finding of a root cause, with the evidence that links it.\n\nSerializes ``FindingCorrelation`` edges straight from ``get_authorized_members`` -- the same\nqueryset the SPA reads -- rather than hand-built dicts, so the two surfaces cannot drift on\nwhich fields a member has.","properties":{"edge_id":{"type":"integer","readOnly":true},"finding_id":{"type":"integer","readOnly":true},"title":{"type":"string","readOnly":true},"severity":{"type":"string","readOnly":true},"priority":{"type":"number","format":"double","readOnly":true,"nullable":true},"product_id":{"type":"integer","readOnly":true},"product_name":{"type":"string","readOnly":true},"domain":{"type":"string","nullable":true,"readOnly":true},"status":{"enum":["active","confirmed","rejected"],"type":"string","x-spec-enum-id":"64249d1299570e91","readOnly":true,"description":"System state (active) or user feedback (confirmed/rejected).\n\n* `active` - Active\n* `confirmed` - Confirmed\n* `rejected` - Rejected"},"confidence":{"enum":["exact","heuristic"],"type":"string","x-spec-enum-id":"383589cbf8f37881","readOnly":true,"description":"How the link was derived (exact join vs heuristic).\n\n* `exact` - Exact\n* `heuristic` - Heuristic"},"evidence":{"readOnly":true,"description":"The signal that produced this link (why the finding is linked), for explainability."}},"required":["confidence","domain","edge_id","evidence","finding_id","priority","product_id","product_name","severity","status","title"]},"RootCauseOrganization":{"type":"object","description":"One organization (Product Type) a root cause reaches, with its own counts and worst scores.\n\nThe organization sibling of ``RootCauseProductSerializer``. ``product_count`` is how many of\nthe organization's assets the cause reaches.","properties":{"organization_id":{"type":"integer","readOnly":true},"organization_name":{"type":"string","readOnly":true},"finding_count":{"type":"integer","readOnly":true},"product_count":{"type":"integer","readOnly":true},"max_priority":{"type":"number","format":"double","readOnly":true,"nullable":true},"risk":{"type":"string","nullable":true,"readOnly":true}},"required":["finding_count","max_priority","organization_id","organization_name","product_count","risk"]},"RootCauseProduct":{"type":"object","description":"One product a root cause reaches, with its own finding count and worst scores.","properties":{"product_id":{"type":"integer","readOnly":true},"product_name":{"type":"string","readOnly":true},"finding_count":{"type":"integer","readOnly":true},"max_priority":{"type":"number","format":"double","readOnly":true,"nullable":true},"risk":{"type":"string","nullable":true,"readOnly":true}},"required":["finding_count","max_priority","product_id","product_name","risk"]},"RuleDeleteConflict":{"type":"object","description":"The 409 body of ``DELETE rules/{id}/``: the same detail, plus what is standing in the way.","properties":{"detail":{"type":"string"},"run_count":{"type":"integer"}},"required":["detail","run_count"]},"RuleImportRequestRequest":{"type":"object","description":"The body of ``POST rules/import/``.","properties":{"bundle":{"description":"The parsed contents of a rule export file"},"dry_run":{"type":"boolean","default":true,"description":"Report what would happen and write nothing"},"conflict":{"enum":["rename","skip","overwrite"],"type":"string","x-spec-enum-id":"646285834a314aa5","default":"rename","description":"What to do with a rule whose name is taken: import it under a new name, skip it, or replace the existing rule's graph (only a rule you own)\n\n* `rename` - rename\n* `skip` - skip\n* `overwrite` - overwrite"}},"required":["bundle"]},"RuleImportResponse":{"type":"object","description":"The response of ``POST rules/import/``.","properties":{"dry_run":{"type":"boolean"},"imported":{"type":"integer","description":"How many rules were created or overwritten"},"rows":{"type":"array","items":{"$ref":"#/components/schemas/RuleImportRow"}}},"required":["dry_run","imported","rows"]},"RuleImportRow":{"type":"object","description":"One row of the ``POST rules/import/`` report.","properties":{"index":{"type":"integer","description":"The rule's position in the file"},"source_name":{"type":"string","description":"The rule's name in the file"},"name":{"type":"string","description":"The name the rule has here, or would be given"},"action":{"type":"string","description":"create, rename, skip, or overwrite"},"rule_id":{"type":"integer","nullable":true,"description":"The rule here, once one exists"},"written":{"type":"boolean","description":"Whether this rule was written"},"warnings":{"type":"array","items":{"type":"string"}},"problems":{"type":"array","items":{"type":"string"},"description":"Any problem on any row means nothing was imported"}},"required":["action","index","name","problems","rule_id","source_name","warnings"]},"RuleRestoreRequestRequest":{"type":"object","description":"The body of ``POST rules/{id}/restore/``.","properties":{"event_id":{"type":"integer","description":"The version to restore"},"expected_version":{"type":"integer","description":"The rule's current version as you last saw it. A newer one answers 409 instead of restoring"}},"required":["event_id"]},"RuleRunQueued":{"type":"object","description":"The response of ``POST rules/{id}/run/``.","properties":{"run_id":{"type":"integer","nullable":true,"description":"Null: the run is created on a worker"},"status":{"type":"string","description":"Always \"queued\""}},"required":["run_id","status"]},"RuleTestRequest":{"type":"object","description":"A rule definition and a sample text, to try the rule before saving it.","properties":{"kind":{"enum":["detectors","pattern"],"type":"string","description":"* `detectors` - Built-in detectors\n* `pattern` - Custom pattern","x-spec-enum-id":"76b4c41a51e7c53c"},"detectors":{"type":"array","items":{"type":"string","minLength":1,"maxLength":64}},"pattern":{"type":"string","maxLength":1000},"case_sensitive":{"type":"boolean","default":false},"text":{"type":"string","maxLength":100000}},"required":["kind","text"]},"RuleVersion":{"type":"object","description":"One version of a rule, as ``GET rules/{id}/versions/`` lists it.","properties":{"event_id":{"type":"integer","description":"The history event: what a version is addressed by"},"version":{"type":"integer","description":"The rule's version counter at the time. Not unique"},"label":{"type":"string","description":"insert or update"},"created_at":{"type":"string","format":"date-time"},"user":{"allOf":[{"$ref":"#/components/schemas/RuleVersionUser"}],"nullable":true},"name":{"type":"string"},"mode":{"type":"string"},"enabled":{"type":"boolean"},"node_count":{"type":"integer"},"is_current":{"type":"boolean"},"changed":{"type":"array","items":{"type":"string"},"description":"Fields changed by this version"},"graph_diff":{"$ref":"#/components/schemas/RuleVersionGraphDiff"}},"required":["changed","created_at","enabled","event_id","graph_diff","is_current","label","mode","name","node_count","user","version"]},"RuleVersionDetail":{"type":"object","description":"One version of a rule with its graph, credentials masked.","properties":{"event_id":{"type":"integer","description":"The history event: what a version is addressed by"},"version":{"type":"integer","description":"The rule's version counter at the time. Not unique"},"label":{"type":"string","description":"insert or update"},"created_at":{"type":"string","format":"date-time"},"user":{"allOf":[{"$ref":"#/components/schemas/RuleVersionUser"}],"nullable":true},"name":{"type":"string"},"mode":{"type":"string"},"enabled":{"type":"boolean"},"node_count":{"type":"integer"},"is_current":{"type":"boolean"},"changed":{"type":"array","items":{"type":"string"},"description":"Fields changed by this version"},"graph_diff":{"$ref":"#/components/schemas/RuleVersionGraphDiff"},"description":{"type":"string"},"graph":{}},"required":["changed","created_at","description","enabled","event_id","graph","graph_diff","is_current","label","mode","name","node_count","user","version"]},"RuleVersionGraphDiff":{"type":"object","properties":{"nodes_added":{"type":"integer"},"nodes_removed":{"type":"integer"},"nodes_changed":{"type":"integer"}},"required":["nodes_added","nodes_changed","nodes_removed"]},"RuleVersionPage":{"type":"object","properties":{"count":{"type":"integer"},"history_enabled":{"type":"boolean","description":"False while the audit log is off: no versions are kept"},"results":{"type":"array","items":{"$ref":"#/components/schemas/RuleVersion"}}},"required":["count","history_enabled","results"]},"RuleVersionUser":{"type":"object","properties":{"id":{"type":"integer"},"username":{"type":"string"}},"required":["id","username"]},"SLAConfiguration":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"configuration_type":{"enum":["Severity","Risk"],"type":"string","x-spec-enum-id":"a4582373721827bc","title":"SLA Configuration Type","description":"Indicates what basis the SLA will be calculated on for findings associated with this SLA configuration.\n\n* `Severity` - Measure SLA based on Finding Severity\n* `Risk` - Measure SLA based on Finding Risk"},"sla_start_policy":{"enum":["detection_date","publish_date","fix_available_date","earliest_known"],"type":"string","x-spec-enum-id":"9833b70ca10af085","description":"Which date the SLA clock starts from. The default keeps the clock on the detection date. Other policies start it from the vulnerability publish date, the date a fix became available, or the earliest of those, so the clock reflects how long a fix was possible. A computed start after the detection date is clamped to the detection date, so a policy can only tighten the clock, never lengthen it. Required for PCI DSS Requirement 6.3.3, where the one-month clock runs from patch release.\n\n* `detection_date` - When the finding was detected (default)\n* `publish_date` - When the vulnerability was published\n* `fix_available_date` - When a fix became available\n* `earliest_known` - The earliest known of the above"},"name":{"type":"string","title":"Custom SLA Name","description":"A unique name for the set of SLAs."},"description":{"type":"string","nullable":true},"restart_sla_on_reactivation":{"type":"boolean","title":"Restart SLA when findings are reactivated","description":"When enabled, findings that were previously mitigated but are reactivated durign reimport will have their SLA period restarted."},"async_updating":{"type":"boolean","readOnly":true,"description":"Findings under this SLA configuration are asynchronously being updated"},"critical":{"type":"integer","default":7,"title":"Critical Finding SLA Days","description":"The number of days to remediate a critical finding."},"enforce_critical":{"type":"boolean","default":true,"title":"Enforce Critical Finding SLA Days","description":"When enabled, critical findings will be assigned an SLA expiration date based on the critical finding SLA days within this SLA configuration."},"high":{"type":"integer","default":30,"title":"High Finding SLA Days","description":"The number of days to remediate a high finding."},"enforce_high":{"type":"boolean","default":true,"title":"Enforce High Finding SLA Days","description":"When enabled, high findings will be assigned an SLA expiration date based on the high finding SLA days within this SLA configuration."},"medium":{"type":"integer","default":90,"title":"Medium Finding SLA Days","description":"The number of days to remediate a medium finding."},"enforce_medium":{"type":"boolean","default":true,"title":"Enforce Medium Finding SLA Days","description":"When enabled, medium findings will be assigned an SLA expiration date based on the medium finding SLA days within this SLA configuration."},"low":{"type":"integer","default":120,"title":"Low Finding SLA Days","description":"The number of days to remediate a low finding."},"enforce_low":{"type":"boolean","default":true,"title":"Enforce Low Finding SLA Days","description":"When enabled, low findings will be assigned an SLA expiration date based on the low finding SLA days within this SLA configuration."},"urgent_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":7,"title":"Urgent Risk Finding SLA Days","description":"The number of days to remediate an urgent risk finding."},"enforce_urgent_risk":{"type":"boolean","title":"Enforce Urgent Risk Finding SLA Days","description":"When enabled, urgent risk findings will be assigned an SLA expiration date based on the urgent risk finding SLA days within this SLA configuration."},"needs_action_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":30,"title":"Needs Action Risk Finding SLA Days","description":"The number of days to remediate a needs action risk finding."},"enforce_needs_action_risk":{"type":"boolean","title":"Enforce Needs Action Risk Finding SLA Days","description":"When enabled, needs action risk findings will be assigned an SLA expiration date based on the needs action risk finding SLA days within this SLA configuration."},"medium_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":90,"title":"Medium Risk Finding SLA Days","description":"The number of days to remediate a medium risk finding."},"enforce_medium_risk":{"type":"boolean","title":"Enforce Medium Risk Finding SLA Days","description":"When enabled, medium risk findings will be assigned an SLA expiration date based on the medium risk finding SLA days within this SLA configuration."},"low_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":120,"title":"Low Risk Finding SLA Days","description":"The number of days to remediate a low risk finding."},"enforce_low_risk":{"type":"boolean","title":"Enforce Low Risk Finding SLA Days","description":"When enabled, low risk findings will be assigned an SLA expiration date based on the low risk finding SLA days within this SLA configuration."},"cap_by_kev_due_date":{"type":"boolean","title":"Cap SLA by CISA KEV Due Date","description":"When enabled, enforced SLA expiration dates are capped at the CISA Known Exploited Vulnerabilities catalog due date for findings listed in that catalog (as FedRAMP-style remediation timelines require)."},"vdr_enabled":{"type":"boolean","title":"Enable VDR Deadlines","description":"When enabled, findings that are internet-reachable and/or credibly exploitable get tightened remediation deadlines per the FedRAMP Vulnerability Detection and Response standard."},"vdr_urgent_days":{"type":"integer","maximum":2147483647,"minimum":0,"description":"Deadline (days from discovery) for internet-reachable AND credibly exploitable findings."},"vdr_exploitable_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"VDR Credibly-Exploitable Days","description":"Deadline (days from discovery) for credibly exploitable findings that are not internet-reachable."},"vdr_reachable_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"VDR Internet-Reachable Days","description":"Deadline (days from discovery) for internet-reachable findings that are not credibly exploitable."},"vdr_epss_threshold":{"type":"number","format":"double","description":"A finding is treated as credibly exploitable when its EPSS score meets this threshold."},"vdr_reachability_tag":{"type":"string","description":"Findings carrying this tag are treated as internet-reachable for VDR tiering.","maxLength":64},"vdr_use_exposure_verdicts":{"type":"boolean","title":"Use Asset Exposure for VDR Tiering","description":"Also treat a finding as internet-reachable when its asset's computed exposure says so, in addition to the tag above. Off by default: a compliance deadline should tighten only when the compliance owner decides it should, never as a side effect of enabling a feature."},"vdr_pain_enabled":{"type":"boolean","title":"Use PAIN Ratings for VDR Deadlines","description":"When enabled, VDR deadlines come from the twelve-cell FedRAMP matrix below, keyed on each finding's Potential Agency Impact rating, instead of the three tiers above. Findings with no PAIN rating keep their base SLA."},"vdr_pain5_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-5, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-5 finding that is credibly exploitable AND internet-reachable."},"vdr_pain5_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-5, Exploitable Only","description":"Deadline in days for a PAIN-5 finding that is credibly exploitable but not internet-reachable."},"vdr_pain5_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-5, Not Likely Exploitable","description":"Deadline in days for a PAIN-5 finding that is not credibly exploitable."},"vdr_pain4_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-4, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-4 finding that is credibly exploitable AND internet-reachable."},"vdr_pain4_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-4, Exploitable Only","description":"Deadline in days for a PAIN-4 finding that is credibly exploitable but not internet-reachable."},"vdr_pain4_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-4, Not Likely Exploitable","description":"Deadline in days for a PAIN-4 finding that is not credibly exploitable."},"vdr_pain3_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-3, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-3 finding that is credibly exploitable AND internet-reachable."},"vdr_pain3_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-3, Exploitable Only","description":"Deadline in days for a PAIN-3 finding that is credibly exploitable but not internet-reachable."},"vdr_pain3_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-3, Not Likely Exploitable","description":"Deadline in days for a PAIN-3 finding that is not credibly exploitable."},"vdr_pain2_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-2, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-2 finding that is credibly exploitable AND internet-reachable."},"vdr_pain2_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-2, Exploitable Only","description":"Deadline in days for a PAIN-2 finding that is credibly exploitable but not internet-reachable."},"vdr_pain2_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-2, Not Likely Exploitable","description":"Deadline in days for a PAIN-2 finding that is not credibly exploitable."},"response_policy":{"type":"integer","nullable":true,"title":"Vulnerability Response Policy","description":"The published response standard that sets deadlines for findings under this SLA configuration. When set, it replaces the VDR tiers and the PAIN matrix above. When null, those settings continue to apply exactly as before."},"authorization_level":{"type":"string","description":"This service's authorization or certification level under the response policy, for example a FedRAMP certification class. Free text validated against the policy's own vocabulary, because the level names are the standard's and change when it does.","maxLength":32}},"required":["async_updating","id","restart_sla_on_reactivation"]},"SLAConfigurationRequest":{"type":"object","description":"Base serializer for all models.","properties":{"configuration_type":{"enum":["Severity","Risk"],"type":"string","x-spec-enum-id":"a4582373721827bc","title":"SLA Configuration Type","description":"Indicates what basis the SLA will be calculated on for findings associated with this SLA configuration.\n\n* `Severity` - Measure SLA based on Finding Severity\n* `Risk` - Measure SLA based on Finding Risk"},"sla_start_policy":{"enum":["detection_date","publish_date","fix_available_date","earliest_known"],"type":"string","x-spec-enum-id":"9833b70ca10af085","description":"Which date the SLA clock starts from. The default keeps the clock on the detection date. Other policies start it from the vulnerability publish date, the date a fix became available, or the earliest of those, so the clock reflects how long a fix was possible. A computed start after the detection date is clamped to the detection date, so a policy can only tighten the clock, never lengthen it. Required for PCI DSS Requirement 6.3.3, where the one-month clock runs from patch release.\n\n* `detection_date` - When the finding was detected (default)\n* `publish_date` - When the vulnerability was published\n* `fix_available_date` - When a fix became available\n* `earliest_known` - The earliest known of the above"},"name":{"type":"string","minLength":1,"title":"Custom SLA Name","description":"A unique name for the set of SLAs."},"description":{"type":"string","nullable":true,"minLength":1},"restart_sla_on_reactivation":{"type":"boolean","title":"Restart SLA when findings are reactivated","description":"When enabled, findings that were previously mitigated but are reactivated durign reimport will have their SLA period restarted."},"critical":{"type":"integer","default":7,"title":"Critical Finding SLA Days","description":"The number of days to remediate a critical finding."},"enforce_critical":{"type":"boolean","default":true,"title":"Enforce Critical Finding SLA Days","description":"When enabled, critical findings will be assigned an SLA expiration date based on the critical finding SLA days within this SLA configuration."},"high":{"type":"integer","default":30,"title":"High Finding SLA Days","description":"The number of days to remediate a high finding."},"enforce_high":{"type":"boolean","default":true,"title":"Enforce High Finding SLA Days","description":"When enabled, high findings will be assigned an SLA expiration date based on the high finding SLA days within this SLA configuration."},"medium":{"type":"integer","default":90,"title":"Medium Finding SLA Days","description":"The number of days to remediate a medium finding."},"enforce_medium":{"type":"boolean","default":true,"title":"Enforce Medium Finding SLA Days","description":"When enabled, medium findings will be assigned an SLA expiration date based on the medium finding SLA days within this SLA configuration."},"low":{"type":"integer","default":120,"title":"Low Finding SLA Days","description":"The number of days to remediate a low finding."},"enforce_low":{"type":"boolean","default":true,"title":"Enforce Low Finding SLA Days","description":"When enabled, low findings will be assigned an SLA expiration date based on the low finding SLA days within this SLA configuration."},"urgent_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":7,"title":"Urgent Risk Finding SLA Days","description":"The number of days to remediate an urgent risk finding."},"enforce_urgent_risk":{"type":"boolean","title":"Enforce Urgent Risk Finding SLA Days","description":"When enabled, urgent risk findings will be assigned an SLA expiration date based on the urgent risk finding SLA days within this SLA configuration."},"needs_action_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":30,"title":"Needs Action Risk Finding SLA Days","description":"The number of days to remediate a needs action risk finding."},"enforce_needs_action_risk":{"type":"boolean","title":"Enforce Needs Action Risk Finding SLA Days","description":"When enabled, needs action risk findings will be assigned an SLA expiration date based on the needs action risk finding SLA days within this SLA configuration."},"medium_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":90,"title":"Medium Risk Finding SLA Days","description":"The number of days to remediate a medium risk finding."},"enforce_medium_risk":{"type":"boolean","title":"Enforce Medium Risk Finding SLA Days","description":"When enabled, medium risk findings will be assigned an SLA expiration date based on the medium risk finding SLA days within this SLA configuration."},"low_risk":{"type":"integer","maximum":2147483647,"minimum":1,"default":120,"title":"Low Risk Finding SLA Days","description":"The number of days to remediate a low risk finding."},"enforce_low_risk":{"type":"boolean","title":"Enforce Low Risk Finding SLA Days","description":"When enabled, low risk findings will be assigned an SLA expiration date based on the low risk finding SLA days within this SLA configuration."},"cap_by_kev_due_date":{"type":"boolean","title":"Cap SLA by CISA KEV Due Date","description":"When enabled, enforced SLA expiration dates are capped at the CISA Known Exploited Vulnerabilities catalog due date for findings listed in that catalog (as FedRAMP-style remediation timelines require)."},"vdr_enabled":{"type":"boolean","title":"Enable VDR Deadlines","description":"When enabled, findings that are internet-reachable and/or credibly exploitable get tightened remediation deadlines per the FedRAMP Vulnerability Detection and Response standard."},"vdr_urgent_days":{"type":"integer","maximum":2147483647,"minimum":0,"description":"Deadline (days from discovery) for internet-reachable AND credibly exploitable findings."},"vdr_exploitable_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"VDR Credibly-Exploitable Days","description":"Deadline (days from discovery) for credibly exploitable findings that are not internet-reachable."},"vdr_reachable_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"VDR Internet-Reachable Days","description":"Deadline (days from discovery) for internet-reachable findings that are not credibly exploitable."},"vdr_epss_threshold":{"type":"number","format":"double","description":"A finding is treated as credibly exploitable when its EPSS score meets this threshold."},"vdr_reachability_tag":{"type":"string","description":"Findings carrying this tag are treated as internet-reachable for VDR tiering.","maxLength":64},"vdr_use_exposure_verdicts":{"type":"boolean","title":"Use Asset Exposure for VDR Tiering","description":"Also treat a finding as internet-reachable when its asset's computed exposure says so, in addition to the tag above. Off by default: a compliance deadline should tighten only when the compliance owner decides it should, never as a side effect of enabling a feature."},"vdr_pain_enabled":{"type":"boolean","title":"Use PAIN Ratings for VDR Deadlines","description":"When enabled, VDR deadlines come from the twelve-cell FedRAMP matrix below, keyed on each finding's Potential Agency Impact rating, instead of the three tiers above. Findings with no PAIN rating keep their base SLA."},"vdr_pain5_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-5, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-5 finding that is credibly exploitable AND internet-reachable."},"vdr_pain5_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-5, Exploitable Only","description":"Deadline in days for a PAIN-5 finding that is credibly exploitable but not internet-reachable."},"vdr_pain5_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-5, Not Likely Exploitable","description":"Deadline in days for a PAIN-5 finding that is not credibly exploitable."},"vdr_pain4_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-4, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-4 finding that is credibly exploitable AND internet-reachable."},"vdr_pain4_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-4, Exploitable Only","description":"Deadline in days for a PAIN-4 finding that is credibly exploitable but not internet-reachable."},"vdr_pain4_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-4, Not Likely Exploitable","description":"Deadline in days for a PAIN-4 finding that is not credibly exploitable."},"vdr_pain3_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-3, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-3 finding that is credibly exploitable AND internet-reachable."},"vdr_pain3_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-3, Exploitable Only","description":"Deadline in days for a PAIN-3 finding that is credibly exploitable but not internet-reachable."},"vdr_pain3_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-3, Not Likely Exploitable","description":"Deadline in days for a PAIN-3 finding that is not credibly exploitable."},"vdr_pain2_lev_irv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-2, Exploitable and Internet-Reachable","description":"Deadline in days for a PAIN-2 finding that is credibly exploitable AND internet-reachable."},"vdr_pain2_lev_nirv_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-2, Exploitable Only","description":"Deadline in days for a PAIN-2 finding that is credibly exploitable but not internet-reachable."},"vdr_pain2_nlev_days":{"type":"integer","maximum":2147483647,"minimum":0,"title":"PAIN-2, Not Likely Exploitable","description":"Deadline in days for a PAIN-2 finding that is not credibly exploitable."},"response_policy":{"type":"integer","nullable":true,"title":"Vulnerability Response Policy","description":"The published response standard that sets deadlines for findings under this SLA configuration. When set, it replaces the VDR tiers and the PAIN matrix above. When null, those settings continue to apply exactly as before."},"authorization_level":{"type":"string","description":"This service's authorization or certification level under the response policy, for example a FedRAMP certification class. Free text validated against the policy's own vocabulary, because the level names are the standard's and change when it does.","maxLength":32}},"required":["restart_sla_on_reactivation"]},"SbomImport":{"type":"object","properties":{"file":{"type":"string","format":"uri","description":"SBOM or dependency manifest file","pattern":"(?:json|xml|spdx)$"},"scan_type":{"enum":["CycloneDX","SPDX"],"type":"string","x-spec-enum-id":"1f30ffe9db66798d","description":"SBOM format: 'CycloneDX' or 'SPDX'\n\n* `CycloneDX` - CycloneDX\n* `SPDX` - SPDX"},"product":{"type":"integer","description":"Product ID to associate dependencies with"},"product_name":{"type":"string","description":"Product name to look up or auto-create and associate dependencies with","maxLength":255},"product_type_name":{"type":"string","description":"Product type name used when auto-creating products","maxLength":255},"auto_create_context":{"type":"boolean","default":false,"description":"If true, products and product types will be created if they do not exist"},"replace_dependencies":{"type":"boolean","default":false,"description":"When true, product-dependency associations not present in this import are removed (unless anchored by finding references). When false (default), dependencies are merged with existing ones."},"version":{"type":"string","description":"The version of the asset this SBOM describes (e.g. '5.2.0'). The recorded BOM snapshot binds to that version, which is created on first sight. Requires DD_V3_ASSET_VERSIONS. When omitted and the flag is on, the document's own subject version (metadata.component) is used.","maxLength":200},"source_ref":{"type":"string","description":"Where the document was taken from, as branch@sha (e.g. 'main@3f2a9c1'). Recorded on the AI inventory facts the import writes. Always accepted, independent of DD_V3_ASSET_VERSIONS; use version to bind an asset version.","maxLength":300},"background_import":{"type":"boolean","nullable":true,"description":"Selecting to import in the background will modify the import process to first parse the file for any errors, return the response, and then create dependencies in the background"},"dependencies_processed":{"type":"integer","readOnly":true},"ai_inventory":{"type":"boolean","readOnly":true},"ai_components_written":{"type":"integer","readOnly":true},"ai_components_removed":{"type":"integer","readOnly":true},"ai_catalogue_tagged":{"type":"integer","readOnly":true},"task_id":{"type":"string","readOnly":true},"status":{"type":"string","readOnly":true},"name_resolution":{"allOf":[{"$ref":"#/components/schemas/ImportNameResolution"}],"readOnly":true,"description":"Present only when product_name was a former name of the target, or product_type_name named where it was before a move (or a former name of where it is now), and the import used the current names instead of being refused or creating a duplicate. Says what was sent, the current names used, and in 'message' what to change in the pipeline. Only a caller who can view the target gets this: anyone else gets the answer the import gives without it."}},"required":["ai_catalogue_tagged","ai_components_removed","ai_components_written","ai_inventory","dependencies_processed","file","name_resolution","scan_type","status","task_id"]},"SbomImportRequest":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"SBOM or dependency manifest file","pattern":"(?:json|xml|spdx)$"},"scan_type":{"enum":["CycloneDX","SPDX"],"type":"string","x-spec-enum-id":"1f30ffe9db66798d","description":"SBOM format: 'CycloneDX' or 'SPDX'\n\n* `CycloneDX` - CycloneDX\n* `SPDX` - SPDX"},"product":{"type":"integer","description":"Product ID to associate dependencies with"},"product_name":{"type":"string","minLength":1,"description":"Product name to look up or auto-create and associate dependencies with","maxLength":255},"product_type_name":{"type":"string","minLength":1,"description":"Product type name used when auto-creating products","maxLength":255},"auto_create_context":{"type":"boolean","default":false,"description":"If true, products and product types will be created if they do not exist"},"replace_dependencies":{"type":"boolean","default":false,"description":"When true, product-dependency associations not present in this import are removed (unless anchored by finding references). When false (default), dependencies are merged with existing ones."},"version":{"type":"string","description":"The version of the asset this SBOM describes (e.g. '5.2.0'). The recorded BOM snapshot binds to that version, which is created on first sight. Requires DD_V3_ASSET_VERSIONS. When omitted and the flag is on, the document's own subject version (metadata.component) is used.","maxLength":200},"source_ref":{"type":"string","description":"Where the document was taken from, as branch@sha (e.g. 'main@3f2a9c1'). Recorded on the AI inventory facts the import writes. Always accepted, independent of DD_V3_ASSET_VERSIONS; use version to bind an asset version.","maxLength":300},"background_import":{"type":"boolean","nullable":true,"description":"Selecting to import in the background will modify the import process to first parse the file for any errors, return the response, and then create dependencies in the background"}},"required":["file","scan_type"]},"ScanCadencePolicy":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":200},"enabled":{"type":"boolean"},"scope_type":{"enum":["all","product_type","regulation","criticality","product"],"type":"string","description":"* `all` - All products\n* `product_type` - Product type\n* `regulation` - Regulation\n* `criticality` - Business criticality\n* `product` - Product","x-spec-enum-id":"080987e46d51879f","title":"Scope"},"product_type":{"type":"integer","nullable":true},"regulation":{"type":"integer","nullable":true},"product":{"type":"integer","nullable":true},"business_criticality":{"enum":["very high","high","medium","low","very low","none","",null],"type":"string","description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","x-spec-enum-id":"ef412461eb271471","nullable":true},"critical_functions_only":{"type":"boolean"},"required_test_types":{"type":"array","items":{"type":"integer"},"description":"Empty means any test type qualifies."},"interval_days":{"type":"integer","maximum":36500,"minimum":1,"title":"Interval in days"},"grace_days":{"type":"integer","maximum":36500,"minimum":0,"title":"Grace in days"},"notify":{"type":"boolean","title":"Notify on overdue transition"},"created_by":{"type":"integer","readOnly":true,"nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"product_name":{"type":"string","readOnly":true},"product_type_name":{"type":"string","readOnly":true},"regulation_name":{"type":"string","readOnly":true},"test_type_details":{"type":"array","items":{"$ref":"#/components/schemas/TestTypeDetail"},"readOnly":true}},"required":["created_at","created_by","id","name","product_name","product_type_name","regulation_name","test_type_details","updated_at"]},"ScanCadencePolicyRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"enabled":{"type":"boolean"},"scope_type":{"enum":["all","product_type","regulation","criticality","product"],"type":"string","description":"* `all` - All products\n* `product_type` - Product type\n* `regulation` - Regulation\n* `criticality` - Business criticality\n* `product` - Product","x-spec-enum-id":"080987e46d51879f","title":"Scope"},"product_type":{"type":"integer","nullable":true},"regulation":{"type":"integer","nullable":true},"product":{"type":"integer","nullable":true},"business_criticality":{"enum":["very high","high","medium","low","very low","none","",null],"type":"string","description":"* `very high` - Very High\n* `high` - High\n* `medium` - Medium\n* `low` - Low\n* `very low` - Very Low\n* `none` - None","x-spec-enum-id":"ef412461eb271471","nullable":true},"critical_functions_only":{"type":"boolean"},"required_test_types":{"type":"array","items":{"type":"integer"},"description":"Empty means any test type qualifies."},"interval_days":{"type":"integer","maximum":36500,"minimum":1,"title":"Interval in days"},"grace_days":{"type":"integer","maximum":36500,"minimum":0,"title":"Grace in days"},"notify":{"type":"boolean","title":"Notify on overdue transition"}},"required":["name"]},"ScanFreshnessRequestRequest":{"type":"object","properties":{"filters":{},"boundaries":{"type":"array","items":{"type":"integer"}},"by_scan_type":{"type":"boolean"}}},"ScanStatusReportRequest":{"type":"object","description":"Terminal scan status the engine POSTs to ``/api/v2/sensei/scan_status/``\nwhen a server-side job finishes.\n\n``scan_run_id`` echoes the id carried on the dispatched job (see\n``dispatch._record_scan_run``). ``root_cause``/``exit_code`` populate on\nfailure; ``engine_job_id`` is recorded for cross-referencing engine logs.","properties":{"scan_run_id":{"type":"integer"},"status":{"enum":["succeeded","failed","interrupted"],"type":"string","description":"* `succeeded` - succeeded\n* `failed` - failed\n* `interrupted` - interrupted","x-spec-enum-id":"84e918b9b50bbd98"},"exit_code":{"type":"integer","nullable":true},"root_cause":{"type":"string","default":""},"engine_job_id":{"type":"string","default":""},"engagement_id":{"type":"integer","nullable":true},"llm_kind":{"type":"string","default":""},"tokens_in":{"type":"integer","nullable":true,"default":0},"tokens_out":{"type":"integer","nullable":true,"default":0},"llm_model":{"type":"string","default":""},"llm_provider":{"type":"string","default":""},"finding_count":{"type":"integer","nullable":true,"default":0},"path_resolution":{"type":"array","items":{"type":"object","additionalProperties":{}},"nullable":true},"fix_apply_failure":{"type":"array","items":{"type":"object","additionalProperties":{}},"nullable":true},"skipped_scanners":{"nullable":true}},"required":["scan_run_id","status"]},"ScheduleRequestRequest":{"type":"object","properties":{"scheduled_publish_at":{"type":"string","format":"date-time","nullable":true}},"required":["scheduled_publish_at"]},"SecretOnly":{"type":"object","properties":{"secret":{"type":"string"}},"required":["secret"]},"SecurityControl":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"catalog":{"type":"integer","description":"The catalog this control belongs to"},"catalog_name":{"type":"string","readOnly":true},"catalog_version":{"type":"string","readOnly":true},"control_id":{"type":"string","description":"Canonical lowercase OSCAL control identifier, e.g. 'ra-5' or 'ac-2.1'","maxLength":64},"label":{"type":"string","description":"Human-readable control label, e.g. 'RA-5' or 'AC-2(1)'","maxLength":64},"sort_key":{"type":"string","description":"Zero-padded key giving controls their natural catalog ordering","maxLength":64},"title":{"type":"string","description":"The control's title","maxLength":500},"family":{"type":"string","description":"The control family / group title, e.g. 'Risk Assessment'","maxLength":200},"text":{"type":"string","title":"Statement Text","description":"The control's statement prose from the source catalog"},"params":{"title":"Parameters","description":"The control's OSCAL parameter definitions, verbatim"},"metadata":{"description":"Framework-specific attributes (baseline membership, assessment weights, ...)"},"enabled":{"type":"boolean","description":"False when the control disappeared from the source catalog on re-import"}},"required":["catalog","catalog_name","catalog_version","control_id","id","title"]},"ServiceUser":{"type":"object","description":"One service user. ``token`` appears only in the response to a create or a regenerate.","properties":{"id":{"type":"integer","readOnly":true},"user_id":{"type":"integer","description":"The user this service user authenticates as","readOnly":true},"username":{"type":"string","readOnly":true},"label":{"type":"string","readOnly":true},"display_name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true,"description":"What this service user is for, e.g. the pipeline or scanner that uses it"},"is_active":{"type":"boolean","readOnly":true},"status":{"type":"string","readOnly":true},"global_role":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"token_prefix":{"type":"string","readOnly":true,"description":"The leading characters of the token, shown so admins can recognize it"},"token_issued_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Token Issued","description":"When the current token was generated"},"token_issued_by":{"type":"string","nullable":true,"readOnly":true},"expires_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Token Expires","description":"When the token stops working; empty means it does not expire"},"last_used_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last Used","description":"The last time the token authenticated a request"},"last_used_ip":{"type":"string","readOnly":true,"nullable":true,"title":"Last Used From","description":"The address the token last authenticated from"},"created_by":{"type":"string","nullable":true,"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The time that the record was last updated"}},"required":["created_at","created_by","description","display_name","expires_at","global_role","id","is_active","label","last_used_at","last_used_ip","status","token_issued_at","token_issued_by","token_prefix","updated_at","user_id","username"]},"ServiceUserCreateRequest":{"type":"object","properties":{"label":{"type":"string","minLength":1,"maxLength":150},"username":{"type":"string","minLength":1,"maxLength":150},"description":{"type":"string","default":""},"expires_in_days":{"enum":[30,60,90,180,null],"x-spec-enum-id":"24300396586ae48a","nullable":true,"default":90,"description":"Token lifetime in days: 30, 60, 90 or 180, or null for No Expiration.\n\n* `30` - 30\n* `60` - 60\n* `90` - 90\n* `180` - 180\n* `None` - None"},"global_role_id":{"type":"integer","nullable":true}},"required":["label","username"]},"ServiceUserOAuthTokenRequestRequest":{"type":"object","properties":{"grant_type":{"enum":["client_credentials"],"type":"string","description":"* `client_credentials` - client_credentials","x-spec-enum-id":"524e932a3a75412a"},"client_id":{"type":"string","minLength":1,"description":"The service user's username."},"client_secret":{"type":"string","minLength":1,"description":"The service user's ddsu_ token."}},"required":["client_id","client_secret","grant_type"]},"ServiceUserOAuthTokenResponse":{"type":"object","properties":{"access_token":{"type":"string"},"token_type":{"type":"string"},"expires_in":{"type":"integer"}},"required":["access_token","expires_in","token_type"]},"ServiceUserTokenResponse":{"type":"object","description":"One service user. ``token`` appears only in the response to a create or a regenerate.","properties":{"id":{"type":"integer","readOnly":true},"user_id":{"type":"integer","description":"The user this service user authenticates as","readOnly":true},"username":{"type":"string","readOnly":true},"label":{"type":"string","readOnly":true},"display_name":{"type":"string","readOnly":true},"description":{"type":"string","readOnly":true,"description":"What this service user is for, e.g. the pipeline or scanner that uses it"},"is_active":{"type":"boolean","readOnly":true},"status":{"type":"string","readOnly":true},"global_role":{"type":"object","additionalProperties":{},"nullable":true,"readOnly":true},"token_prefix":{"type":"string","readOnly":true,"description":"The leading characters of the token, shown so admins can recognize it"},"token_issued_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Token Issued","description":"When the current token was generated"},"token_issued_by":{"type":"string","nullable":true,"readOnly":true},"expires_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Token Expires","description":"When the token stops working; empty means it does not expire"},"last_used_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Last Used","description":"The last time the token authenticated a request"},"last_used_ip":{"type":"string","readOnly":true,"nullable":true,"title":"Last Used From","description":"The address the token last authenticated from"},"created_by":{"type":"string","nullable":true,"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The time that the record was last updated"},"token":{"type":"string","readOnly":true,"description":"The token, returned once. It is not stored."}},"required":["created_at","created_by","description","display_name","expires_at","global_role","id","is_active","label","last_used_at","last_used_ip","status","token","token_issued_at","token_issued_by","token_prefix","updated_at","user_id","username"]},"Settings":{"type":"object","properties":{"alerts_enabled":{"type":"boolean","title":"Due Date Alerts","description":"Notify assignees and owning teams as action due dates approach."},"alert_days":{"type":"array","items":{"type":"integer","maximum":365,"minimum":0},"maxItems":10},"at_risk_days":{"type":"integer","maximum":32767,"minimum":0,"description":"An action due within this many days is At risk."},"due_soon_days":{"type":"integer","maximum":32767,"minimum":0,"description":"An action due within this many days is Due soon."}},"required":["alert_days"]},"SeverityStatusStatistics":{"type":"object","properties":{"info":{"$ref":"#/components/schemas/StatusStatistics"},"low":{"$ref":"#/components/schemas/StatusStatistics"},"medium":{"$ref":"#/components/schemas/StatusStatistics"},"high":{"$ref":"#/components/schemas/StatusStatistics"},"critical":{"$ref":"#/components/schemas/StatusStatistics"},"total":{"$ref":"#/components/schemas/StatusStatistics"}},"required":["critical","high","info","low","medium","total"]},"SeverityStatusStatisticsRequest":{"type":"object","properties":{"info":{"$ref":"#/components/schemas/StatusStatisticsRequest"},"low":{"$ref":"#/components/schemas/StatusStatisticsRequest"},"medium":{"$ref":"#/components/schemas/StatusStatisticsRequest"},"high":{"$ref":"#/components/schemas/StatusStatisticsRequest"},"critical":{"$ref":"#/components/schemas/StatusStatisticsRequest"},"total":{"$ref":"#/components/schemas/StatusStatisticsRequest"}},"required":["critical","high","info","low","medium","total"]},"ShadowAiRequestRequest":{"type":"object","properties":{"limit":{"type":"integer","maximum":25,"minimum":1}}},"SignificantChange":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"product_name":{"type":"string","readOnly":true},"recorded_by_username":{"type":"string","readOnly":true},"required_roles":{"type":"array","items":{"type":"string"},"readOnly":true},"title":{"type":"string","description":"A short name for the change, as an assessor would recognize it","maxLength":255},"description":{"type":"string","description":"What changed, and why the entity judged it significant"},"change_date":{"type":"string","format":"date","description":"The date the change took effect, which is when the scan clock starts"},"requires_internal_scan":{"type":"boolean","title":"Requires an internal scan","description":"Whether Requirement 11.3.1.3 calls for an internal scan after this change"},"requires_asv_scan":{"type":"boolean","title":"Requires an external ASV scan","description":"Whether Requirement 11.3.2.1 calls for an external scan after this change"},"requires_pentest":{"type":"boolean","title":"Requires a penetration test","description":"Whether Requirement 11.4 calls for a penetration test after this change"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the change was recorded"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"},"product":{"type":"integer","description":"The product the change was made to"},"recorded_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who recorded the change"}},"required":["change_date","created_at","id","product","product_name","recorded_by","recorded_by_username","required_roles","title","updated_at"]},"SignificantChangeRequest":{"type":"object","description":"Base serializer for all models.","properties":{"title":{"type":"string","minLength":1,"description":"A short name for the change, as an assessor would recognize it","maxLength":255},"description":{"type":"string","description":"What changed, and why the entity judged it significant"},"change_date":{"type":"string","format":"date","description":"The date the change took effect, which is when the scan clock starts"},"requires_internal_scan":{"type":"boolean","title":"Requires an internal scan","description":"Whether Requirement 11.3.1.3 calls for an internal scan after this change"},"requires_asv_scan":{"type":"boolean","title":"Requires an external ASV scan","description":"Whether Requirement 11.3.2.1 calls for an external scan after this change"},"requires_pentest":{"type":"boolean","title":"Requires a penetration test","description":"Whether Requirement 11.4 calls for a penetration test after this change"},"product":{"type":"integer","description":"The product the change was made to"}},"required":["change_date","product","title"]},"SignoffVerdictRequestRequest":{"type":"object","properties":{"comment":{"type":"string","default":""}}},"SlaFiveStateRequestRequest":{"type":"object","properties":{"filters":{},"window_days":{"type":"integer"}}},"SmartUpload":{"type":"object","properties":{"scan_date":{"type":"string","format":"date-time","default":"2026-10-28T17:13:30.753578Z"},"scan_type":{"enum":["","Nexpose Scan","Nuclei Scan","Nmap Scan","OpenVAS Parser","OpenVAS Parser v2","Qualys Scan","Qualys Infrastructure Scan (WebGUI XML)","Tenable Scan"],"type":"string","description":"* `` - Please Select a Scan Type\n* `Nexpose Scan` - Nexpose Scan - XML Format\n* `Nuclei Scan` - Nuclei Scan - JSON Format\n* `Nmap Scan` - Nmap Scan - XML output (use -oX)\n* `OpenVAS Parser` - OpenVAS Parser - CSV or XML Format\n* `OpenVAS Parser v2` - OpenVAS Parser v2 - CSV or XML Format\n* `Qualys Scan` - Qualys Scan - CSV or XML format of Asset Data Report\n* `Qualys Infrastructure Scan (WebGUI XML)` - Qualys Infrastructure Scan (WebGUI XML) - XML Format\n* `Tenable Scan` - Tenable Scan - CSV, XML, or .nessus Format","x-spec-enum-id":"97cbd06137d7743c"},"minimum_severity":{"enum":["Info","Low","Medium","High","Critical"],"type":"string","description":"* `Info` - Info\n* `Low` - Low\n* `Medium` - Medium\n* `High` - High\n* `Critical` - Critical","x-spec-enum-id":"fc5d16a20ed06136","default":"Info"},"files":{"type":"string","format":"uri","nullable":true,"pattern":"(?:xml|csv|nessus|json|jsonl|html|js|zip|xlsx|txt|sarif)$"},"tags":{"type":"array","items":{"type":"string"}},"version":{"type":"string"},"branch_tag":{"type":"string"},"commit_hash":{"type":"string"},"build_id":{"type":"string"},"active":{"type":"boolean","default":true},"verified":{"type":"boolean","default":false},"close_old_findings":{"type":"boolean","default":false},"group_by":{"enum":["component_name","component_name+component_version","file_path","finding_title","vuln_id_from_tool",""],"type":"string","x-spec-enum-id":"a9b19a914dcfbd21","description":"Choose an option to automatically group new findings by the chosen option.\n\n* `component_name` - Component Name\n* `component_name+component_version` - Component Name + Version\n* `file_path` - File path\n* `finding_title` - Finding Title\n* `vuln_id_from_tool` - Vulnerability ID from Tool"},"stats":{"allOf":[{"$ref":"#/components/schemas/Statistics"}],"readOnly":true}},"required":["scan_type","stats"]},"SmartUploadRequest":{"type":"object","properties":{"scan_date":{"type":"string","format":"date-time","default":"2026-10-28T17:13:30.753578Z"},"scan_type":{"enum":["","Nexpose Scan","Nuclei Scan","Nmap Scan","OpenVAS Parser","OpenVAS Parser v2","Qualys Scan","Qualys Infrastructure Scan (WebGUI XML)","Tenable Scan"],"type":"string","description":"* `` - Please Select a Scan Type\n* `Nexpose Scan` - Nexpose Scan - XML Format\n* `Nuclei Scan` - Nuclei Scan - JSON Format\n* `Nmap Scan` - Nmap Scan - XML output (use -oX)\n* `OpenVAS Parser` - OpenVAS Parser - CSV or XML Format\n* `OpenVAS Parser v2` - OpenVAS Parser v2 - CSV or XML Format\n* `Qualys Scan` - Qualys Scan - CSV or XML format of Asset Data Report\n* `Qualys Infrastructure Scan (WebGUI XML)` - Qualys Infrastructure Scan (WebGUI XML) - XML Format\n* `Tenable Scan` - Tenable Scan - CSV, XML, or .nessus Format","x-spec-enum-id":"97cbd06137d7743c"},"minimum_severity":{"enum":["Info","Low","Medium","High","Critical"],"type":"string","description":"* `Info` - Info\n* `Low` - Low\n* `Medium` - Medium\n* `High` - High\n* `Critical` - Critical","x-spec-enum-id":"fc5d16a20ed06136","default":"Info"},"files":{"type":"string","format":"binary","pattern":"(?:xml|csv|nessus|json|jsonl|html|js|zip|xlsx|txt|sarif)$"},"tags":{"type":"array","items":{"type":"string","minLength":1}},"version":{"type":"string"},"branch_tag":{"type":"string"},"commit_hash":{"type":"string"},"build_id":{"type":"string"},"active":{"type":"boolean","default":true},"verified":{"type":"boolean","default":false},"close_old_findings":{"type":"boolean","default":false},"group_by":{"enum":["component_name","component_name+component_version","file_path","finding_title","vuln_id_from_tool",""],"type":"string","x-spec-enum-id":"a9b19a914dcfbd21","description":"Choose an option to automatically group new findings by the chosen option.\n\n* `component_name` - Component Name\n* `component_name+component_version` - Component Name + Version\n* `file_path` - File path\n* `finding_title` - Finding Title\n* `vuln_id_from_tool` - Vulnerability ID from Tool"}},"required":["scan_type"]},"SnapshotTrendRequestRequest":{"type":"object","properties":{"start":{"type":"string","format":"date"},"end":{"type":"string","format":"date"},"granularity":{"enum":["day","week","month"],"type":"string","description":"* `day` - day\n* `week` - week\n* `month` - month","x-spec-enum-id":"273287207128dc4a"},"scope":{"enum":["authorized","global"],"type":"string","description":"* `authorized` - authorized\n* `global` - global","x-spec-enum-id":"277897e33919e7cc"}}},"SonarqubeIssue":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"key":{"type":"string","description":"SonarQube issue key","maxLength":60},"status":{"type":"string","description":"SonarQube issue status","maxLength":20},"type":{"type":"string","description":"SonarQube issue type","maxLength":20}},"required":["id","key","status","type"]},"SonarqubeIssueRequest":{"type":"object","properties":{"key":{"type":"string","minLength":1,"description":"SonarQube issue key","maxLength":60},"status":{"type":"string","minLength":1,"description":"SonarQube issue status","maxLength":20},"type":{"type":"string","minLength":1,"description":"SonarQube issue type","maxLength":20}},"required":["key","status","type"]},"SonarqubeIssueTransition":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true},"finding_status":{"type":"string","maxLength":100},"sonarqube_status":{"type":"string","maxLength":50},"transitions":{"type":"string","maxLength":100},"sonarqube_issue":{"type":"integer"}},"required":["created","finding_status","id","sonarqube_issue","sonarqube_status","transitions"]},"SonarqubeIssueTransitionRequest":{"type":"object","properties":{"finding_status":{"type":"string","minLength":1,"maxLength":100},"sonarqube_status":{"type":"string","minLength":1,"maxLength":50},"transitions":{"type":"string","minLength":1,"maxLength":100},"sonarqube_issue":{"type":"integer"}},"required":["finding_status","sonarqube_issue","sonarqube_status","transitions"]},"StartRunRequestRequest":{"type":"object","properties":{"domains":{"type":"array","items":{"type":"string","minLength":1}}}},"Statistics":{"type":"object","properties":{"initial_findings_discovered":{"type":"integer"},"findings_found_after_host_identification":{"type":"integer"},"findings_without_a_matching_Product":{"type":"integer"},"unassigned_findings_created":{"type":"integer"},"findings_created_in_a_matched_Product":{"type":"integer"},"findings_closed_in_a_matched_Product":{"type":"integer"},"findings_reopened_in_a_matched_Product":{"type":"integer"},"findings_that_have_not_changed_in_a_matched_Products":{"type":"integer"}},"required":["findings_closed_in_a_matched_Product","findings_created_in_a_matched_Product","findings_found_after_host_identification","findings_reopened_in_a_matched_Product","findings_that_have_not_changed_in_a_matched_Products","findings_without_a_matching_Product","initial_findings_discovered","unassigned_findings_created"]},"StatisticsRequest":{"type":"object","properties":{"initial_findings_discovered":{"type":"integer"},"findings_found_after_host_identification":{"type":"integer"},"findings_without_a_matching_Product":{"type":"integer"},"unassigned_findings_created":{"type":"integer"},"findings_created_in_a_matched_Product":{"type":"integer"},"findings_closed_in_a_matched_Product":{"type":"integer"},"findings_reopened_in_a_matched_Product":{"type":"integer"},"findings_that_have_not_changed_in_a_matched_Products":{"type":"integer"}},"required":["findings_closed_in_a_matched_Product","findings_created_in_a_matched_Product","findings_found_after_host_identification","findings_reopened_in_a_matched_Product","findings_that_have_not_changed_in_a_matched_Products","findings_without_a_matching_Product","initial_findings_discovered","unassigned_findings_created"]},"StatusRequestRequest":{"type":"object","properties":{"status":{"enum":["new","planned","in_progress","blocked","change_scheduled","awaiting_validation","complete","exception_requested"],"type":"string","description":"* `new` - New\n* `planned` - Planned\n* `in_progress` - In Progress\n* `blocked` - Blocked\n* `change_scheduled` - Change Scheduled\n* `awaiting_validation` - Awaiting Validation\n* `complete` - Complete\n* `exception_requested` - Exception Requested","x-spec-enum-id":"57f29bf3b8cd4fef"},"note":{"type":"string","maxLength":10000},"blocked_reason":{"type":"string","maxLength":2000},"scheduled_for":{"type":"string","format":"date","nullable":true}},"required":["status"]},"StatusStatistics":{"type":"object","properties":{"active":{"type":"integer"},"verified":{"type":"integer"},"duplicate":{"type":"integer"},"false_p":{"type":"integer"},"out_of_scope":{"type":"integer"},"is_mitigated":{"type":"integer"},"risk_accepted":{"type":"integer"},"total":{"type":"integer"}},"required":["active","duplicate","false_p","is_mitigated","out_of_scope","risk_accepted","total","verified"]},"StatusStatisticsRequest":{"type":"object","properties":{"active":{"type":"integer"},"verified":{"type":"integer"},"duplicate":{"type":"integer"},"false_p":{"type":"integer"},"out_of_scope":{"type":"integer"},"is_mitigated":{"type":"integer"},"risk_accepted":{"type":"integer"},"total":{"type":"integer"}},"required":["active","duplicate","false_p","is_mitigated","out_of_scope","risk_accepted","total","verified"]},"StructureSummaryDuplicateNames":{"type":"object","properties":{"count":{"type":"integer","minimum":0},"examples":{"type":"array","items":{"$ref":"#/components/schemas/DuplicateName"}}},"required":["count","examples"]},"StructureSummaryEmptyOrganizations":{"type":"object","properties":{"count":{"type":"integer","minimum":0},"examples":{"type":"array","items":{"$ref":"#/components/schemas/OrganizationReference"}}},"required":["count","examples"]},"StructureSummaryOrphans":{"type":"object","properties":{"count":{"type":"integer","minimum":0},"examples":{"type":"array","items":{"$ref":"#/components/schemas/AssetReference"}}},"required":["count","examples"]},"StructureSummaryRequestRequest":{"type":"object","properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"default":25}}},"StructureSummaryResponse":{"type":"object","properties":{"totals":{"$ref":"#/components/schemas/StructureSummaryTotals"},"orphans":{"$ref":"#/components/schemas/StructureSummaryOrphans"},"duplicate_names":{"$ref":"#/components/schemas/StructureSummaryDuplicateNames"},"organizations_without_assets":{"$ref":"#/components/schemas/StructureSummaryEmptyOrganizations"}},"required":["duplicate_names","organizations_without_assets","orphans","totals"]},"StructureSummaryTotals":{"type":"object","properties":{"organizations":{"type":"integer","minimum":0},"assets":{"type":"integer","minimum":0},"roots":{"type":"integer","minimum":0},"max_depth":{"type":"integer","minimum":0}},"required":["assets","max_depth","organizations","roots"]},"SuppressRequestRequest":{"type":"object","properties":{"reason":{"type":"string","minLength":1,"maxLength":2000}},"required":["reason"]},"TargetedRiskAnalysis":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"approved_by_username":{"type":"string","readOnly":true},"scope_product_name":{"type":"string","readOnly":true},"scope_product_type_name":{"type":"string","readOnly":true},"linked_sla_configuration_name":{"type":"string","readOnly":true},"requirement_ref":{"type":"string","title":"PCI DSS requirement","description":"The requirement this analysis justifies a frequency for, e.g. 6.3.3 or 11.3.1.1.","pattern":"^(\\d+(\\.\\d+){0,3}|A[1-3](\\.\\d+){0,3})$","maxLength":16},"title":{"type":"string","description":"A short name for this analysis.","maxLength":255},"assets_and_threats":{"type":"string","description":"What is being protected and the threats to it (Requirement 12.3.1)."},"likelihood_and_impact":{"type":"string","description":"The likelihood and impact analysis behind the chosen frequency (Requirement 12.3.1)."},"decision":{"type":"string","description":"The frequency or timeframe decided on, and the reasoning (Requirement 12.3.1)."},"status":{"enum":["draft","approved","superseded"],"type":"string","x-spec-enum-id":"8edf5fc5253b63cd","readOnly":true,"description":"Draft, approved, or superseded.\n\n* `draft` - Draft\n* `approved` - Approved\n* `superseded` - Superseded"},"approved_at":{"type":"string","format":"date","readOnly":true,"nullable":true,"title":"Approved on","description":"The date this analysis was approved."},"review_due":{"type":"string","format":"date","readOnly":true,"nullable":true,"description":"When this analysis must be reviewed again, at least every 12 months."},"last_review_alert_at":{"type":"string","format":"date","readOnly":true,"nullable":true,"title":"Last review alert","description":"When the review-due alert for this analysis was last raised, so the weekly sweep does not repeat it."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the analysis was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the analysis was updated"},"scope_product_type":{"type":"integer","nullable":true,"title":"Scope organization","description":"Limit this analysis to one organization. Leave both scope fields empty for entity-wide."},"scope_product":{"type":"integer","nullable":true,"description":"Limit this analysis to one product. Leave both scope fields empty for entity-wide."},"linked_sla_configuration":{"type":"integer","nullable":true,"description":"The SLA configuration whose frequency this analysis justifies, if any."},"approved_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who approved this analysis."}},"required":["approved_at","approved_by","approved_by_username","created_at","id","last_review_alert_at","linked_sla_configuration_name","requirement_ref","review_due","scope_product_name","scope_product_type_name","status","title","updated_at"]},"TargetedRiskAnalysisRequest":{"type":"object","description":"Base serializer for all models.","properties":{"requirement_ref":{"type":"string","minLength":1,"title":"PCI DSS requirement","description":"The requirement this analysis justifies a frequency for, e.g. 6.3.3 or 11.3.1.1.","pattern":"^(\\d+(\\.\\d+){0,3}|A[1-3](\\.\\d+){0,3})$","maxLength":16},"title":{"type":"string","minLength":1,"description":"A short name for this analysis.","maxLength":255},"assets_and_threats":{"type":"string","description":"What is being protected and the threats to it (Requirement 12.3.1)."},"likelihood_and_impact":{"type":"string","description":"The likelihood and impact analysis behind the chosen frequency (Requirement 12.3.1)."},"decision":{"type":"string","description":"The frequency or timeframe decided on, and the reasoning (Requirement 12.3.1)."},"scope_product_type":{"type":"integer","nullable":true,"title":"Scope organization","description":"Limit this analysis to one organization. Leave both scope fields empty for entity-wide."},"scope_product":{"type":"integer","nullable":true,"description":"Limit this analysis to one product. Leave both scope fields empty for entity-wide."},"linked_sla_configuration":{"type":"integer","nullable":true,"description":"The SLA configuration whose frequency this analysis justifies, if any."}},"required":["requirement_ref","title"]},"TeamRequestRequest":{"type":"object","properties":{"team":{"type":"integer","nullable":true}},"required":["team"]},"TeamScorecardRequestRequest":{"type":"object","properties":{"limit":{"type":"integer"}}},"Test":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"test_type_name":{"type":"string","readOnly":true},"deduplication_algorithm":{"type":"string","readOnly":true,"description":"Algorithm used to match findings for deduplication and reimport (legacy, unique_id_from_tool, hash_code, or unique_id_from_tool_or_hash_code)."},"hash_code_fields":{"type":"array","items":{"type":"string"},"readOnly":true,"nullable":true,"description":"Finding fields hashed to compute hash_code for this test's scan type. Null when the scan type has no per-scanner configuration and legacy default fields are used."},"scan_type":{"type":"string","nullable":true},"title":{"type":"string","nullable":true,"maxLength":255},"description":{"type":"string","nullable":true},"target_start":{"type":"string","format":"date-time"},"target_end":{"type":"string","format":"date-time"},"percent_complete":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"version":{"type":"string","nullable":true,"maxLength":100},"build_id":{"type":"string","nullable":true,"description":"Build ID that was tested, a reimport may update this field.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash tested, a reimport may update this field.","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch that was tested, a reimport may update this field.","maxLength":150},"engagement":{"type":"integer","readOnly":true},"lead":{"type":"integer","nullable":true},"test_type":{"type":"integer"},"environment":{"type":"integer","nullable":true},"api_scan_configuration":{"type":"integer","nullable":true},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"},"readOnly":true},"files":{"type":"array","items":{"$ref":"#/components/schemas/File"},"readOnly":true},"tags":{"type":"array","items":{"type":"string"}},"finding_groups":{"type":"array","items":{"$ref":"#/components/schemas/FindingGroup"},"readOnly":true}},"required":["created","deduplication_algorithm","engagement","files","finding_groups","hash_code_fields","id","notes","target_end","target_start","test_type","test_type_name","updated"]},"TestCreate":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"engagement":{"type":"integer"},"notes":{"type":"array","items":{"type":"integer"},"readOnly":true},"test_type_name":{"type":"string","readOnly":true},"deduplication_algorithm":{"type":"string","readOnly":true,"description":"Algorithm used to match findings for deduplication and reimport (legacy, unique_id_from_tool, hash_code, or unique_id_from_tool_or_hash_code)."},"hash_code_fields":{"type":"array","items":{"type":"string"},"readOnly":true,"nullable":true,"description":"Finding fields hashed to compute hash_code for this test's scan type. Null when the scan type has no per-scanner configuration and legacy default fields are used."},"processing":{"type":"boolean","description":"Dictate that the test is undergoing an Import or ReImport"},"deduplication":{"type":"boolean","description":"Dictate that the test is undergoing Deduplication for all findings that were imported last"},"false_positive_history":{"type":"boolean","description":"Dictate that the test is undergoing False Positive History for all findings that were imported last"},"status":{"type":"string","readOnly":true,"description":"The human readable status of the status the test is currently set to"},"pci_role":{"enum":["none","internal_vulnerability_scan","external_asv_scan","web_application_assessment","penetration_test","segmentation_test",""],"type":"string","x-spec-enum-id":"df388145a7e568b9","description":"Overrides the test type's PCI DSS role for this test alone. Blank inherits it.\n\n* `none` - Not a PCI test\n* `internal_vulnerability_scan` - Internal vulnerability scan\n* `external_asv_scan` - External ASV scan\n* `web_application_assessment` - Web application assessment\n* `penetration_test` - Penetration test\n* `segmentation_test` - Segmentation test"},"authenticated":{"enum":["unknown","yes","no"],"type":"string","x-spec-enum-id":"d1c998de7a29cb98","description":"Whether this scan ran with credentials (PCI DSS Requirement 11.3.1.2)\n\n* `unknown` - Unknown\n* `yes` - Authenticated\n* `no` - Not authenticated"},"asv_result":{"enum":["not_applicable","pass","fail"],"type":"string","x-spec-enum-id":"2622389e4dfa2e13","description":"The result the Approved Scanning Vendor reported, as recorded by the entity\n\n* `not_applicable` - Not applicable\n* `pass` - Passing\n* `fail` - Failing"},"asv_vendor":{"type":"string","description":"The Approved Scanning Vendor that ran the scan"},"asv_attestation_reference":{"type":"string","description":"The entity's reference for the ASV attestation covering this scan"},"after_change":{"type":"integer","nullable":true,"description":"The significant change this scan was run in response to"},"pci_note":{"type":"string","description":"Context an assessor would ask for about this test"},"scan_type":{"type":"string","nullable":true},"title":{"type":"string","nullable":true,"maxLength":255},"description":{"type":"string","nullable":true},"target_start":{"type":"string","format":"date-time"},"target_end":{"type":"string","format":"date-time"},"percent_complete":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"version":{"type":"string","nullable":true,"maxLength":100},"build_id":{"type":"string","nullable":true,"description":"Build ID that was tested, a reimport may update this field.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash tested, a reimport may update this field.","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch that was tested, a reimport may update this field.","maxLength":150},"lead":{"type":"integer","nullable":true},"test_type":{"type":"integer"},"environment":{"type":"integer","nullable":true},"api_scan_configuration":{"type":"integer","nullable":true},"files":{"type":"array","items":{"$ref":"#/components/schemas/File"},"readOnly":true},"tags":{"type":"array","items":{"type":"string"}},"finding_groups":{"type":"array","items":{"$ref":"#/components/schemas/FindingGroup"},"readOnly":true}},"required":["created","deduplication_algorithm","engagement","files","finding_groups","hash_code_fields","id","notes","status","target_end","target_start","test_type","test_type_name","updated"]},"TestCreateRequest":{"type":"object","description":"Base serializer for all models.","properties":{"engagement":{"type":"integer"},"processing":{"type":"boolean","description":"Dictate that the test is undergoing an Import or ReImport"},"deduplication":{"type":"boolean","description":"Dictate that the test is undergoing Deduplication for all findings that were imported last"},"false_positive_history":{"type":"boolean","description":"Dictate that the test is undergoing False Positive History for all findings that were imported last"},"pci_role":{"enum":["none","internal_vulnerability_scan","external_asv_scan","web_application_assessment","penetration_test","segmentation_test",""],"type":"string","x-spec-enum-id":"df388145a7e568b9","description":"Overrides the test type's PCI DSS role for this test alone. Blank inherits it.\n\n* `none` - Not a PCI test\n* `internal_vulnerability_scan` - Internal vulnerability scan\n* `external_asv_scan` - External ASV scan\n* `web_application_assessment` - Web application assessment\n* `penetration_test` - Penetration test\n* `segmentation_test` - Segmentation test"},"authenticated":{"enum":["unknown","yes","no"],"type":"string","x-spec-enum-id":"d1c998de7a29cb98","description":"Whether this scan ran with credentials (PCI DSS Requirement 11.3.1.2)\n\n* `unknown` - Unknown\n* `yes` - Authenticated\n* `no` - Not authenticated"},"asv_result":{"enum":["not_applicable","pass","fail"],"type":"string","x-spec-enum-id":"2622389e4dfa2e13","description":"The result the Approved Scanning Vendor reported, as recorded by the entity\n\n* `not_applicable` - Not applicable\n* `pass` - Passing\n* `fail` - Failing"},"asv_vendor":{"type":"string","description":"The Approved Scanning Vendor that ran the scan"},"asv_attestation_reference":{"type":"string","description":"The entity's reference for the ASV attestation covering this scan"},"after_change":{"type":"integer","nullable":true,"description":"The significant change this scan was run in response to"},"pci_note":{"type":"string","description":"Context an assessor would ask for about this test"},"scan_type":{"type":"string","nullable":true,"minLength":1},"title":{"type":"string","nullable":true,"maxLength":255},"description":{"type":"string","nullable":true},"target_start":{"type":"string","format":"date-time"},"target_end":{"type":"string","format":"date-time"},"percent_complete":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"version":{"type":"string","nullable":true,"maxLength":100},"build_id":{"type":"string","nullable":true,"description":"Build ID that was tested, a reimport may update this field.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash tested, a reimport may update this field.","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch that was tested, a reimport may update this field.","maxLength":150},"lead":{"type":"integer","nullable":true},"test_type":{"type":"integer"},"environment":{"type":"integer","nullable":true},"api_scan_configuration":{"type":"integer","nullable":true},"tags":{"type":"array","items":{"type":"string","minLength":1}}},"required":["engagement","target_end","target_start","test_type"]},"TestImport":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"test_import_finding_action_set":{"type":"array","items":{"$ref":"#/components/schemas/TestImportFindingAction"},"readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true},"modified":{"type":"string","format":"date-time","readOnly":true},"import_settings":{"nullable":true},"type":{"type":"string","maxLength":64},"version":{"type":"string","nullable":true,"maxLength":100},"build_id":{"type":"string","nullable":true,"description":"Build ID that was tested, a reimport may update this field.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash tested, a reimport may update this field.","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch that was tested, a reimport may update this field.","maxLength":150},"test":{"type":"integer","readOnly":true},"findings_affected":{"type":"array","items":{"type":"integer"},"readOnly":true}},"required":["created","findings_affected","id","modified","test","test_import_finding_action_set"]},"TestImportFindingAction":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true},"modified":{"type":"string","format":"date-time","readOnly":true},"action":{"enum":["N","C","R","U","",null],"type":"string","description":"* `N` - created\n* `C` - closed\n* `R` - reactivated\n* `U` - untouched","x-spec-enum-id":"630f6e89cd3cf0b8","nullable":true},"test_import":{"type":"integer","readOnly":true},"finding":{"type":"integer","readOnly":true}},"required":["created","finding","id","modified","test_import"]},"TestImportFindingActionRequest":{"type":"object","properties":{"action":{"enum":["N","C","R","U","",null],"type":"string","description":"* `N` - created\n* `C` - closed\n* `R` - reactivated\n* `U` - untouched","x-spec-enum-id":"630f6e89cd3cf0b8","nullable":true}}},"TestImportRequest":{"type":"object","properties":{"import_settings":{"nullable":true},"type":{"type":"string","minLength":1,"maxLength":64},"version":{"type":"string","nullable":true,"maxLength":100},"build_id":{"type":"string","nullable":true,"description":"Build ID that was tested, a reimport may update this field.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash tested, a reimport may update this field.","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch that was tested, a reimport may update this field.","maxLength":150}}},"TestToFiles":{"type":"object","properties":{"test_id":{"type":"integer","nullable":true},"files":{"type":"array","items":{"$ref":"#/components/schemas/File"}}},"required":["files","test_id"]},"TestToNotes":{"type":"object","properties":{"test_id":{"type":"integer","nullable":true},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"}}},"required":["notes","test_id"]},"TestType":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","readOnly":true},"soc":{"type":"boolean"},"static_tool":{"type":"boolean"},"dynamic_tool":{"type":"boolean"},"active":{"type":"boolean"}},"required":["id","name"]},"TestTypeCreate":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"soc":{"type":"boolean"},"name":{"type":"string","maxLength":200},"static_tool":{"type":"boolean"},"dynamic_tool":{"type":"boolean"},"active":{"type":"boolean"}},"required":["id","name"]},"TestTypeCreateRequest":{"type":"object","properties":{"soc":{"type":"boolean"},"name":{"type":"string","minLength":1,"maxLength":200},"static_tool":{"type":"boolean"},"dynamic_tool":{"type":"boolean"},"active":{"type":"boolean"}},"required":["name"]},"TestTypeDetail":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"}},"required":["id","name"]},"TestTypeRequest":{"type":"object","properties":{"soc":{"type":"boolean"},"static_tool":{"type":"boolean"},"dynamic_tool":{"type":"boolean"},"active":{"type":"boolean"}}},"Tests":{"type":"object","description":"Regression guard for Sentry DJANGO-D2P.\n\nDRF ``ModelSerializer.update()`` calls ``instance.<m2m>.set(new_list)`` for\nevery M2M field present in ``validated_data``, even when the new list is\nidentical to the current one. On tagulous ``TagField``s that triggers a\nfull teardown + re-add of the M2M, which runs SELECT + UPDATE ``count``\nbookkeeping per tag (N+1).\n\nThis mixin short-circuits the ``.set()`` call per ``TagListSerializerField``\nwhen the normalized incoming list equals ``instance.<attr>.get_tag_list()``.\nAll other M2M fields keep the stock DRF behavior.\n\nOpt in by adding ``SkipUnchangedTagsMixin`` to the base-class list of any\nserializer that exposes a ``TagListSerializerField`` for update.","properties":{"id":{"type":"integer","readOnly":true},"test_type_name":{"type":"string","readOnly":true},"deduplication_algorithm":{"type":"string","readOnly":true,"description":"Algorithm used to match findings for deduplication and reimport (legacy, unique_id_from_tool, hash_code, or unique_id_from_tool_or_hash_code)."},"hash_code_fields":{"type":"array","items":{"type":"string"},"readOnly":true,"nullable":true,"description":"Finding fields hashed to compute hash_code for this test's scan type. Null when the scan type has no per-scanner configuration and legacy default fields are used."},"processing":{"type":"boolean","description":"Dictate that the test is undergoing an Import or ReImport"},"deduplication":{"type":"boolean","description":"Dictate that the test is undergoing Deduplication for all findings that were imported last"},"false_positive_history":{"type":"boolean","description":"Dictate that the test is undergoing False Positive History for all findings that were imported last"},"status":{"type":"string","readOnly":true,"description":"The human readable status of the status the test is currently set to"},"pci_role":{"enum":["none","internal_vulnerability_scan","external_asv_scan","web_application_assessment","penetration_test","segmentation_test",""],"type":"string","x-spec-enum-id":"df388145a7e568b9","description":"Overrides the test type's PCI DSS role for this test alone. Blank inherits it.\n\n* `none` - Not a PCI test\n* `internal_vulnerability_scan` - Internal vulnerability scan\n* `external_asv_scan` - External ASV scan\n* `web_application_assessment` - Web application assessment\n* `penetration_test` - Penetration test\n* `segmentation_test` - Segmentation test"},"authenticated":{"enum":["unknown","yes","no"],"type":"string","x-spec-enum-id":"d1c998de7a29cb98","description":"Whether this scan ran with credentials (PCI DSS Requirement 11.3.1.2)\n\n* `unknown` - Unknown\n* `yes` - Authenticated\n* `no` - Not authenticated"},"asv_result":{"enum":["not_applicable","pass","fail"],"type":"string","x-spec-enum-id":"2622389e4dfa2e13","description":"The result the Approved Scanning Vendor reported, as recorded by the entity\n\n* `not_applicable` - Not applicable\n* `pass` - Passing\n* `fail` - Failing"},"asv_vendor":{"type":"string","description":"The Approved Scanning Vendor that ran the scan"},"asv_attestation_reference":{"type":"string","description":"The entity's reference for the ASV attestation covering this scan"},"after_change":{"type":"integer","nullable":true,"description":"The significant change this scan was run in response to"},"pci_note":{"type":"string","description":"Context an assessor would ask for about this test"},"scan_type":{"type":"string","readOnly":true},"title":{"type":"string","nullable":true,"maxLength":255},"description":{"type":"string","nullable":true},"target_start":{"type":"string","format":"date-time"},"target_end":{"type":"string","format":"date-time"},"percent_complete":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"version":{"type":"string","nullable":true,"maxLength":100},"build_id":{"type":"string","nullable":true,"description":"Build ID that was tested, a reimport may update this field.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash tested, a reimport may update this field.","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch that was tested, a reimport may update this field.","maxLength":150},"engagement":{"type":"integer","readOnly":true},"lead":{"type":"integer","nullable":true},"test_type":{"type":"integer"},"environment":{"type":"integer","nullable":true},"api_scan_configuration":{"type":"integer","nullable":true},"notes":{"type":"array","items":{"$ref":"#/components/schemas/Note"},"readOnly":true},"files":{"type":"array","items":{"$ref":"#/components/schemas/File"},"readOnly":true},"tags":{"type":"array","items":{"type":"string"}},"finding_groups":{"type":"array","items":{"$ref":"#/components/schemas/FindingGroup"},"readOnly":true},"prefetch":{"type":"object","properties":{"api_scan_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ProductAPIScanConfiguration"}},"engagement":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/FindingEngagement"}},"environment":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/FindingEnvironment"}},"files":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/File"}},"lead":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/UserStub"}},"notes":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Note"}},"test_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/TestType"}}}}},"required":["created","deduplication_algorithm","engagement","files","finding_groups","hash_code_fields","id","notes","scan_type","status","target_end","target_start","test_type","test_type_name","updated"]},"TestsRequest":{"type":"object","description":"Regression guard for Sentry DJANGO-D2P.\n\nDRF ``ModelSerializer.update()`` calls ``instance.<m2m>.set(new_list)`` for\nevery M2M field present in ``validated_data``, even when the new list is\nidentical to the current one. On tagulous ``TagField``s that triggers a\nfull teardown + re-add of the M2M, which runs SELECT + UPDATE ``count``\nbookkeeping per tag (N+1).\n\nThis mixin short-circuits the ``.set()`` call per ``TagListSerializerField``\nwhen the normalized incoming list equals ``instance.<attr>.get_tag_list()``.\nAll other M2M fields keep the stock DRF behavior.\n\nOpt in by adding ``SkipUnchangedTagsMixin`` to the base-class list of any\nserializer that exposes a ``TagListSerializerField`` for update.","properties":{"processing":{"type":"boolean","description":"Dictate that the test is undergoing an Import or ReImport"},"deduplication":{"type":"boolean","description":"Dictate that the test is undergoing Deduplication for all findings that were imported last"},"false_positive_history":{"type":"boolean","description":"Dictate that the test is undergoing False Positive History for all findings that were imported last"},"pci_role":{"enum":["none","internal_vulnerability_scan","external_asv_scan","web_application_assessment","penetration_test","segmentation_test",""],"type":"string","x-spec-enum-id":"df388145a7e568b9","description":"Overrides the test type's PCI DSS role for this test alone. Blank inherits it.\n\n* `none` - Not a PCI test\n* `internal_vulnerability_scan` - Internal vulnerability scan\n* `external_asv_scan` - External ASV scan\n* `web_application_assessment` - Web application assessment\n* `penetration_test` - Penetration test\n* `segmentation_test` - Segmentation test"},"authenticated":{"enum":["unknown","yes","no"],"type":"string","x-spec-enum-id":"d1c998de7a29cb98","description":"Whether this scan ran with credentials (PCI DSS Requirement 11.3.1.2)\n\n* `unknown` - Unknown\n* `yes` - Authenticated\n* `no` - Not authenticated"},"asv_result":{"enum":["not_applicable","pass","fail"],"type":"string","x-spec-enum-id":"2622389e4dfa2e13","description":"The result the Approved Scanning Vendor reported, as recorded by the entity\n\n* `not_applicable` - Not applicable\n* `pass` - Passing\n* `fail` - Failing"},"asv_vendor":{"type":"string","description":"The Approved Scanning Vendor that ran the scan"},"asv_attestation_reference":{"type":"string","description":"The entity's reference for the ASV attestation covering this scan"},"after_change":{"type":"integer","nullable":true,"description":"The significant change this scan was run in response to"},"pci_note":{"type":"string","description":"Context an assessor would ask for about this test"},"title":{"type":"string","nullable":true,"maxLength":255},"description":{"type":"string","nullable":true},"target_start":{"type":"string","format":"date-time"},"target_end":{"type":"string","format":"date-time"},"percent_complete":{"type":"integer","maximum":2147483647,"minimum":-2147483648,"nullable":true},"version":{"type":"string","nullable":true,"maxLength":100},"build_id":{"type":"string","nullable":true,"description":"Build ID that was tested, a reimport may update this field.","maxLength":150},"commit_hash":{"type":"string","nullable":true,"description":"Commit hash tested, a reimport may update this field.","maxLength":150},"branch_tag":{"type":"string","nullable":true,"title":"Branch/Tag","description":"Tag or branch that was tested, a reimport may update this field.","maxLength":150},"lead":{"type":"integer","nullable":true},"test_type":{"type":"integer"},"environment":{"type":"integer","nullable":true},"api_scan_configuration":{"type":"integer","nullable":true},"tags":{"type":"array","items":{"type":"string","minLength":1}}},"required":["target_end","target_start","test_type"]},"ThreatModelCreateRequest":{"type":"object","description":"Validates a generation request before any work is queued.\n\nEverything checkable is checked here so a bad input is a synchronous 400 rather\nthan a run that fails minutes later: at least one input present, the document\nreadable, the diagram a real image within limits, and the text inside the\nconfigured ceiling.","properties":{"product":{"type":"integer"},"name":{"type":"string","minLength":1,"maxLength":255},"input_text":{"type":"string","default":""},"input_file":{"type":"string","format":"binary","nullable":true},"input_image":{"type":"string","format":"binary","nullable":true}},"required":["name","product"]},"ThreatModelDetail":{"type":"object","description":"Everything the detail view renders, in one request.\n\nNested rather than paginated: a threat model is a few dozen rows read together,\nand splitting it would make the diagram wait on a second round trip.","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","readOnly":true,"description":"The product this threat model describes"},"product_name":{"type":"string","readOnly":true},"version":{"type":"integer","readOnly":true,"default":1,"description":"Per-product version number, incrementing with each generation"},"name":{"type":"string","readOnly":true,"description":"The feature or design this model covers"},"summary":{"type":"string","readOnly":true,"description":"A short narrative summary of the design and its main risks"},"threat_count":{"type":"integer","readOnly":true},"requirement_count":{"type":"integer","readOnly":true},"pushed_count":{"type":"integer","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"When this threat model was generated"},"created_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who generated this threat model"},"architecture":{"readOnly":true,"description":"Components, trust boundaries, data assets and flows extracted from the design"},"graph":{"type":"object","additionalProperties":{},"readOnly":true},"coverage_gaps":{"type":"array","items":{},"readOnly":true},"assumptions":{"readOnly":true,"description":"What the model assumed because the design did not say"},"open_questions":{"readOnly":true,"description":"What the design left unclear and a reviewer should confirm"},"dropped_items":{"readOnly":true,"description":"Generated items discarded during validation, with the reason, for transparency"},"llm_provider":{"type":"string","readOnly":true,"description":"Which provider generated this model"},"llm_model":{"type":"string","readOnly":true,"description":"Which model id generated this model"},"threats":{"type":"array","items":{"$ref":"#/components/schemas/ThreatModelThreat"},"readOnly":true},"requirements":{"type":"array","items":{"$ref":"#/components/schemas/ThreatModelRequirement"},"readOnly":true},"run":{"allOf":[{"$ref":"#/components/schemas/ThreatModelRun"}],"readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"When this threat model last changed"}},"required":["architecture","assumptions","coverage_gaps","created_at","created_by","dropped_items","graph","id","llm_model","llm_provider","name","open_questions","product","product_name","pushed_count","requirement_count","requirements","run","summary","threat_count","threats","updated_at","version"]},"ThreatModelList":{"type":"object","description":"Slim row for the list table -- counts instead of nested collections.","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","readOnly":true,"description":"The product this threat model describes"},"product_name":{"type":"string","readOnly":true},"version":{"type":"integer","readOnly":true,"default":1,"description":"Per-product version number, incrementing with each generation"},"name":{"type":"string","readOnly":true,"description":"The feature or design this model covers"},"summary":{"type":"string","readOnly":true,"description":"A short narrative summary of the design and its main risks"},"threat_count":{"type":"integer","readOnly":true},"requirement_count":{"type":"integer","readOnly":true},"pushed_count":{"type":"integer","readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"When this threat model was generated"},"created_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who generated this threat model"}},"required":["created_at","created_by","id","name","product","product_name","pushed_count","requirement_count","summary","threat_count","version"]},"ThreatModelRequirement":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"uuid":{"type":"string","format":"uuid","readOnly":true,"description":"Stable identity carried onto the pushed finding"},"external_id":{"type":"string","readOnly":true,"title":"Requirement ID","description":"The generated identifier for this requirement (e.g. R1)"},"title":{"type":"string","readOnly":true,"description":"A one-line name for the requirement"},"statement":{"type":"string","readOnly":true,"title":"Requirement","description":"The testable requirement the design must satisfy"},"verification":{"type":"string","readOnly":true,"description":"How to confirm the requirement has been implemented"},"category":{"enum":["authn","authz","input_validation","crypto","logging_monitoring","data_protection","availability","session_mgmt","secure_config","other"],"type":"string","x-spec-enum-id":"bf32fdd0a4f8d994","readOnly":true,"description":"The security domain this requirement belongs to\n\n* `authn` - Authentication\n* `authz` - Authorization\n* `input_validation` - Input Validation\n* `crypto` - Cryptography\n* `logging_monitoring` - Logging and Monitoring\n* `data_protection` - Data Protection\n* `availability` - Availability\n* `session_mgmt` - Session Management\n* `secure_config` - Secure Configuration\n* `other` - Other"},"priority":{"enum":["mandatory","recommended"],"type":"string","x-spec-enum-id":"3d156e2dc68f2791","readOnly":true,"description":"Whether the requirement is mandatory or recommended\n\n* `mandatory` - Mandatory\n* `recommended` - Recommended"},"severity":{"type":"string","readOnly":true,"description":"Severity of the worst threat this requirement mitigates"},"cwe":{"type":"integer","readOnly":true,"nullable":true,"description":"The CWE carried onto the pushed finding"},"evidence_quote":{"type":"string","readOnly":true,"title":"Evidence","description":"The part of the design that makes this requirement necessary"},"evidence_source":{"enum":["text","diagram","inference"],"type":"string","x-spec-enum-id":"9938b3837ddd308c","readOnly":true,"description":"Whether the evidence came from the text, the diagram, or inference\n\n* `text` - Design text\n* `diagram` - Diagram\n* `inference` - Inference"},"evidence_verified":{"type":"boolean","readOnly":true,"description":"Whether the evidence quote was found verbatim in the supplied design text"},"component_refs":{"readOnly":true,"title":"Component References","description":"Ids of the architecture components this requirement applies to"},"mitigates_ids":{"type":"array","items":{"type":"string"},"readOnly":true},"finding_id":{"type":"integer","readOnly":true},"pushed_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Pushed Timestamp","description":"When this requirement was last pushed to a finding"}},"required":["category","component_refs","cwe","evidence_quote","evidence_source","evidence_verified","external_id","finding_id","id","mitigates_ids","priority","pushed_at","severity","statement","title","uuid","verification"]},"ThreatModelRun":{"type":"object","description":"A generation's progress. This is what the UI polls.","properties":{"id":{"type":"integer","readOnly":true},"product":{"type":"integer","readOnly":true,"description":"The product this threat model belongs to"},"product_name":{"type":"string","readOnly":true},"name":{"type":"string","readOnly":true,"description":"A short name for the feature or design being modeled"},"status":{"enum":["QUEUED","RUNNING","SUCCEEDED","FAILED","CANCELLED"],"type":"string","x-spec-enum-id":"60560380022a1906","readOnly":true,"description":"Lifecycle state of the generation\n\n* `QUEUED` - Queued\n* `RUNNING` - Running\n* `SUCCEEDED` - Succeeded\n* `FAILED` - Failed\n* `CANCELLED` - Cancelled"},"stage":{"enum":["queued","extracting-architecture","enumerating-threats","writing-requirements","assembling-results","done"],"type":"string","x-spec-enum-id":"0276a1200f00b318","readOnly":true,"description":"Which step of the pipeline is running\n\n* `queued` - Queued\n* `extracting-architecture` - Extracting architecture\n* `enumerating-threats` - Enumerating threats\n* `writing-requirements` - Writing security requirements\n* `assembling-results` - Assembling results\n* `done` - Done"},"stage_display":{"type":"string","readOnly":true},"stage_history":{"readOnly":true,"description":"Ordered record of stage transitions, for the progress display"},"root_cause":{"type":"string","readOnly":true,"nullable":true,"description":"On failure, a scrubbed explanation safe to show the requester"},"requested_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who started the generation"},"requested_by_username":{"type":"string","readOnly":true},"attempts":{"type":"integer","readOnly":true,"description":"How many times this run has been dispatched (1 = original, >1 = resumed)"},"llm_calls":{"type":"integer","readOnly":true,"description":"Number of model calls this run made, including schema repairs"},"tokens_in":{"type":"integer","readOnly":true,"title":"Input Tokens","description":"Total prompt tokens across the run"},"tokens_out":{"type":"integer","readOnly":true,"title":"Output Tokens","description":"Total completion tokens across the run"},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"When the generation was requested"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"When the run record last changed"},"finished_at":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"title":"Finished Timestamp","description":"When the run reached a terminal state"},"threat_model_id":{"type":"integer","nullable":true,"readOnly":true}},"required":["attempts","created_at","finished_at","id","llm_calls","name","product","product_name","requested_by","requested_by_username","root_cause","stage","stage_display","stage_history","status","threat_model_id","tokens_in","tokens_out","updated_at"]},"ThreatModelThreat":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"external_id":{"type":"string","readOnly":true,"title":"Threat ID","description":"The generated identifier requirements reference (e.g. T1)"},"title":{"type":"string","readOnly":true,"description":"A one-line statement of the threat"},"description":{"type":"string","readOnly":true,"description":"What the threat is and why this design is exposed to it"},"stride":{"enum":["S","T","R","I","D","E"],"type":"string","x-spec-enum-id":"adf3805c684103b6","readOnly":true,"title":"STRIDE Category","description":"The STRIDE category this threat falls under\n\n* `S` - Spoofing\n* `T` - Tampering\n* `R` - Repudiation\n* `I` - Information Disclosure\n* `D` - Denial of Service\n* `E` - Elevation of Privilege"},"stride_name":{"type":"string","readOnly":true},"cwe":{"type":"integer","readOnly":true,"nullable":true,"description":"The closest CWE, when one clearly applies"},"severity":{"type":"string","readOnly":true,"description":"Severity in DefectDojo terms (Critical, High, Medium, Low, Info)"},"likelihood":{"type":"string","readOnly":true,"description":"How likely the threat is to be realised (low, medium, high)"},"attacker_profile":{"type":"string","readOnly":true,"description":"Who would mount this attack (e.g. external unauthenticated, insider)"},"attacker_skill":{"type":"string","readOnly":true,"description":"The capability the attacker needs (low, medium, high)"},"attack_path":{"readOnly":true,"description":"Ordered steps an attacker would take, each with its prerequisite"},"component_refs":{"readOnly":true,"title":"Component References","description":"Ids of the architecture components this threat targets"},"flow_refs":{"readOnly":true,"title":"Data Flow References","description":"Ids of the data flows this threat targets"},"asset_refs":{"readOnly":true,"title":"Data Asset References","description":"Ids of the data assets this threat puts at risk"},"ttps":{"readOnly":true,"title":"Techniques","description":"Real-world attacker techniques this maps to, with ATT&CK ids when known"},"evidence_quote":{"type":"string","readOnly":true,"title":"Evidence","description":"The part of the design that supports this threat"},"evidence_source":{"enum":["text","diagram","inference"],"type":"string","x-spec-enum-id":"9938b3837ddd308c","readOnly":true,"description":"Whether the evidence came from the text, the diagram, or inference\n\n* `text` - Design text\n* `diagram` - Diagram\n* `inference` - Inference"},"evidence_verified":{"type":"boolean","readOnly":true,"description":"Whether the evidence quote was found verbatim in the supplied design text"},"confidence":{"enum":["high","medium","low"],"type":"string","x-spec-enum-id":"3cd2babd9a875ec3","readOnly":true,"description":"How confident the model was in this threat\n\n* `high` - High\n* `medium` - Medium\n* `low` - Low"},"requirement_ids":{"type":"array","items":{"type":"string"},"readOnly":true}},"required":["asset_refs","attack_path","attacker_profile","attacker_skill","component_refs","confidence","cwe","description","evidence_quote","evidence_source","evidence_verified","external_id","flow_refs","id","likelihood","requirement_ids","severity","stride","stride_name","title","ttps"]},"ThreatPulseRequestRequest":{"type":"object","properties":{"window_days":{"type":"integer"},"limit":{"type":"integer"}}},"TicketRequestRequest":{"type":"object","properties":{"system":{"type":"string","maxLength":64},"key":{"type":"string","maxLength":128},"url":{"oneOf":[{"type":"string","format":"uri","maxLength":1024},{"type":"string","maxLength":0}]}}},"ToolConfiguration":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":200},"description":{"type":"string","nullable":true,"maxLength":2000},"url":{"type":"string","nullable":true,"maxLength":2000},"authentication_type":{"enum":["API","Password","SSH","",null],"type":"string","description":"* `API` - API Key\n* `Password` - Username/Password\n* `SSH` - SSH","x-spec-enum-id":"e1a582895a9e03b4","nullable":true},"extras":{"type":"string","nullable":true,"description":"Additional definitions that will be consumed by scanner","maxLength":255},"username":{"type":"string","nullable":true,"maxLength":200},"auth_title":{"type":"string","nullable":true,"title":"Title for SSH/API Key","maxLength":200},"tool_type":{"type":"integer"},"prefetch":{"type":"object","properties":{"tool_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ToolType"}}}}},"required":["id","name","tool_type"]},"ToolConfigurationRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","nullable":true,"maxLength":2000},"url":{"type":"string","nullable":true,"maxLength":2000},"authentication_type":{"enum":["API","Password","SSH","",null],"type":"string","description":"* `API` - API Key\n* `Password` - Username/Password\n* `SSH` - SSH","x-spec-enum-id":"e1a582895a9e03b4","nullable":true},"extras":{"type":"string","nullable":true,"description":"Additional definitions that will be consumed by scanner","maxLength":255},"username":{"type":"string","nullable":true,"maxLength":200},"password":{"type":"string","writeOnly":true,"nullable":true,"maxLength":900},"auth_title":{"type":"string","nullable":true,"title":"Title for SSH/API Key","maxLength":200},"ssh":{"type":"string","writeOnly":true,"nullable":true,"maxLength":9000},"api_key":{"type":"string","writeOnly":true,"nullable":true,"maxLength":900},"tool_type":{"type":"integer"}},"required":["name","tool_type"]},"ToolProductSettings":{"type":"object","description":"Enforce ``view_tool_configuration`` on ``tool_configuration`` writes.\n\nSelecting a ``tool_configuration`` lets an import run authenticated requests\nwith the credential stored on it, so it is gated by the same\n``view_tool_configuration`` permission that guards the tool-configuration\nviews, not just the object permission these endpoints already check.\n\nMix this into *every* serializer exposing the field, including alias\nserializers over the same model, so the rule holds wherever the field is\nreachable.\n\nThe check hangs off ``run_validation`` rather than ``validate`` on purpose: a\nsubclass that defines its own ``validate`` would otherwise shadow the mixin's\nand silently drop the guard.\n\nNo-ops when the field is absent (replay-safe on PATCH), mirroring\ndojo.authorization.api_permissions.check_update_permission.","properties":{"id":{"type":"integer","readOnly":true},"setting_url":{"type":"string"},"product":{"type":"integer"},"name":{"type":"string","maxLength":200},"description":{"type":"string","nullable":true,"maxLength":2000},"url":{"type":"string","nullable":true,"maxLength":2000},"tool_project_id":{"type":"string","nullable":true,"maxLength":200},"tool_configuration":{"type":"integer"},"notes":{"type":"array","items":{"type":"integer"},"readOnly":true},"prefetch":{"type":"object","properties":{"notes":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Note"}},"product":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/Product"}},"tool_configuration":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/ToolConfiguration"}}}}},"required":["id","name","notes","product","setting_url","tool_configuration"]},"ToolProductSettingsRequest":{"type":"object","description":"Enforce ``view_tool_configuration`` on ``tool_configuration`` writes.\n\nSelecting a ``tool_configuration`` lets an import run authenticated requests\nwith the credential stored on it, so it is gated by the same\n``view_tool_configuration`` permission that guards the tool-configuration\nviews, not just the object permission these endpoints already check.\n\nMix this into *every* serializer exposing the field, including alias\nserializers over the same model, so the rule holds wherever the field is\nreachable.\n\nThe check hangs off ``run_validation`` rather than ``validate`` on purpose: a\nsubclass that defines its own ``validate`` would otherwise shadow the mixin's\nand silently drop the guard.\n\nNo-ops when the field is absent (replay-safe on PATCH), mirroring\ndojo.authorization.api_permissions.check_update_permission.","properties":{"setting_url":{"type":"string","minLength":1},"product":{"type":"integer"},"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","nullable":true,"maxLength":2000},"url":{"type":"string","nullable":true,"maxLength":2000},"tool_project_id":{"type":"string","nullable":true,"maxLength":200},"tool_configuration":{"type":"integer"}},"required":["name","product","setting_url","tool_configuration"]},"ToolType":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","maxLength":200},"description":{"type":"string","nullable":true,"maxLength":2000}},"required":["id","name"]},"ToolTypeRequest":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","nullable":true,"maxLength":2000}},"required":["name"]},"TopFixesRequestRequest":{"type":"object","properties":{"limit":{"type":"integer"}}},"TransitionRequestRequest":{"type":"object","properties":{"status":{"enum":["draft","review","approved","published","revised","superseded"],"type":"string","description":"* `draft` - Draft\n* `review` - In Review\n* `approved` - Approved\n* `published` - Published\n* `revised` - Revised\n* `superseded` - Superseded","x-spec-enum-id":"d964746435c55bc3"}},"required":["status"]},"Tree":{"type":"object","properties":{"root":{"$ref":"#/components/schemas/Node"},"nodes":{"type":"array","items":{"$ref":"#/components/schemas/Node"}},"edges":{"type":"array","items":{"$ref":"#/components/schemas/Edge"}}},"required":["edges","nodes","root"]},"URL":{"type":"object","description":"Serializer for the URL model with primary keys for related objects.","properties":{"id":{"type":"integer","readOnly":true},"string":{"type":"string","readOnly":true},"type":{"type":"string","readOnly":true},"tags":{"type":"array","items":{"type":"string"}},"protocol":{"type":"string","description":"The protocol of the URL (e.g., http, https, ftp, etc.)","maxLength":10},"user_info":{"type":"string","description":"Connection details for a given user","maxLength":512},"host":{"type":"string","description":"The host of the URL, which can be a domain name or an IP address","maxLength":256},"port":{"type":"integer","maximum":65535,"minimum":1,"nullable":true,"description":"The port number of the URL (optional)"},"path":{"type":"string","description":"The path of the URL (optional),","maxLength":2048},"query":{"type":"string","description":"The query string of the URL (optional)","maxLength":2048},"fragment":{"type":"string","description":"The fragment identifier of the URL (optional)","maxLength":2048},"host_validation_failure":{"type":"boolean","description":"Dictates whether the endpoint was found to have host validation issues during creation"}},"required":["host","id","string","type"]},"URLRequest":{"type":"object","description":"Serializer for the URL model with primary keys for related objects.","properties":{"tags":{"type":"array","items":{"type":"string","minLength":1}},"protocol":{"type":"string","description":"The protocol of the URL (e.g., http, https, ftp, etc.)","maxLength":10},"user_info":{"type":"string","description":"Connection details for a given user","maxLength":512},"host":{"type":"string","minLength":1,"description":"The host of the URL, which can be a domain name or an IP address","maxLength":256},"port":{"type":"integer","maximum":65535,"minimum":1,"nullable":true,"description":"The port number of the URL (optional)"},"path":{"type":"string","description":"The path of the URL (optional),","maxLength":2048},"query":{"type":"string","description":"The query string of the URL (optional)","maxLength":2048},"fragment":{"type":"string","description":"The fragment identifier of the URL (optional)","maxLength":2048},"host_validation_failure":{"type":"boolean","description":"Dictates whether the endpoint was found to have host validation issues during creation"}},"required":["host"]},"UnassignedEndpoint":{"type":"object","properties":{"endpoint":{"type":"string","nullable":true,"description":"The entire endpoint","maxLength":1500}}},"UnassignedFinding":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","description":"A short description of the flaw.","maxLength":511},"description":{"type":"string","readOnly":true},"date":{"type":"string","format":"date","readOnly":true,"description":"The date the flaw was discovered."},"severity":{"type":"string","description":"The severity level of this flaw (Critical, High, Medium, Low, Informational).","maxLength":200},"reporter":{"type":"integer","readOnly":true,"description":"Documents who reported the flaw."},"file":{"type":"string","description":"Title of the file the finding came from","maxLength":511},"test_type":{"type":"integer"},"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/UnassignedEndpoint"}},"status":{"type":"string","readOnly":true},"prefetch":{"type":"object","properties":{"reporter":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/AddUser"}},"test_type":{"type":"object","readOnly":true,"additionalProperties":{"$ref":"#/components/schemas/TestType"}}}}},"required":["date","description","endpoints","file","id","reporter","severity","status","test_type","title"]},"UnauthenticatedSystemException":{"type":"object","description":"Base serializer for all models.","properties":{"id":{"type":"integer","readOnly":true},"product_name":{"type":"string","readOnly":true},"recorded_by_username":{"type":"string","readOnly":true},"system_identifier":{"type":"string","title":"System","description":"The host, device or component that cannot accept scanning credentials","maxLength":255},"reason":{"type":"string","description":"Why the system cannot accept credentials (Requirement 11.3.1.2)"},"compensating_control":{"type":"string","description":"What offsets the missing credentials: the control the entity relies on in place of an authenticated scan. Requirement 11.3.1.2 asks for this alongside the reason, because a system that cannot be scanned with credentials is only acceptable when something else covers it."},"valid_from":{"type":"string","format":"date","description":"The date the exception starts to apply"},"valid_until":{"type":"string","format":"date","nullable":true,"description":"The date the exception lapses. Empty means it stands until removed."},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the exception was recorded"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"},"product":{"type":"integer","description":"The product the excepted system belongs to"},"recorded_by":{"type":"integer","readOnly":true,"nullable":true,"description":"The user who recorded the exception"}},"required":["created_at","id","product","product_name","reason","recorded_by","recorded_by_username","system_identifier","updated_at","valid_from"]},"UnauthenticatedSystemExceptionRequest":{"type":"object","description":"Base serializer for all models.","properties":{"system_identifier":{"type":"string","minLength":1,"title":"System","description":"The host, device or component that cannot accept scanning credentials","maxLength":255},"reason":{"type":"string","minLength":1,"description":"Why the system cannot accept credentials (Requirement 11.3.1.2)"},"compensating_control":{"type":"string","description":"What offsets the missing credentials: the control the entity relies on in place of an authenticated scan. Requirement 11.3.1.2 asks for this alongside the reason, because a system that cannot be scanned with credentials is only acceptable when something else covers it."},"valid_from":{"type":"string","format":"date","description":"The date the exception starts to apply"},"valid_until":{"type":"string","format":"date","nullable":true,"description":"The date the exception lapses. Empty means it stands until removed."},"product":{"type":"integer","description":"The product the excepted system belongs to"}},"required":["product","reason","system_identifier","valid_from"]},"UsageRecord":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"event_type":{"enum":["import","reimport","import_preview","reimport_preview","bulk_finding_delete","sensei_repo","sensei_fix","sensei_threat_model","sensei_cloud_account","sensei_agent_target","sensei_recommendations","sensei_dast","sensei_dast_triage","sensei_ai_triage","sensei_assistant"],"type":"string","description":"* `import` - Import\n* `reimport` - Reimport\n* `import_preview` - Import Preview\n* `reimport_preview` - Reimport Preview\n* `bulk_finding_delete` - Bulk finding delete\n* `sensei_repo` - Sensei Repo Onboarded\n* `sensei_fix` - Sensei Fix Applied\n* `sensei_threat_model` - Sensei Threat Model Generated\n* `sensei_cloud_account` - Sensei Cloud Account Onboarded\n* `sensei_agent_target` - Sensei Agent Target Onboarded\n* `sensei_recommendations` - Sensei Advisor Run Completed\n* `sensei_dast` - Sensei DAST Target Onboarded\n* `sensei_dast_triage` - Sensei DAST Findings Triaged\n* `sensei_ai_triage` - Sensei AI Triage Findings Reviewed\n* `sensei_assistant` - Ask Sensei Answer","x-spec-enum-id":"656e144ba8adc7f3","readOnly":true},"event_subtype":{"type":"string","readOnly":true},"timestamp":{"type":"string","format":"date-time","readOnly":true},"user_id":{"type":"integer","readOnly":true,"nullable":true},"product_id":{"type":"integer","readOnly":true,"nullable":true},"count":{"type":"integer","readOnly":true},"count_created":{"type":"integer","readOnly":true},"count_closed":{"type":"integer","readOnly":true},"count_reactivated":{"type":"integer","readOnly":true},"count_untouched":{"type":"integer","readOnly":true},"count_deleted":{"type":"integer","readOnly":true},"duration_ms":{"type":"integer","readOnly":true,"nullable":true},"metadata":{"readOnly":true},"error_message":{"type":"string","readOnly":true}},"required":["count","count_closed","count_created","count_deleted","count_reactivated","count_untouched","duration_ms","error_message","event_subtype","event_type","id","metadata","product_id","timestamp","user_id"]},"User":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"username":{"type":"string","description":"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.","pattern":"^[\\w.@+-]+$","maxLength":150},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150},"email":{"type":"string","format":"email"},"date_joined":{"type":"string","format":"date-time","readOnly":true},"last_login":{"type":"string","format":"date-time","readOnly":true,"nullable":true},"is_active":{"type":"boolean","title":"Active","description":"Designates whether this user should be treated as active. Unselect this instead of deleting accounts."},"is_staff":{"type":"boolean","title":"Staff status","description":"Designates whether the user can log into this admin site."},"is_superuser":{"type":"boolean","title":"Superuser status","description":"Designates that this user has all permissions without explicitly assigning them."},"token_last_reset":{"type":"string","format":"date-time","nullable":true,"readOnly":true},"token_expiry":{"type":"string","format":"date-time","nullable":true,"readOnly":true},"password_last_reset":{"type":"string","format":"date-time","nullable":true,"readOnly":true},"configuration_permissions":{"type":"array","items":{"type":"integer","nullable":true}}},"required":["date_joined","email","id","last_login","password_last_reset","token_expiry","token_last_reset","username"]},"UserContactInfo":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"user_profile":{"allOf":[{"$ref":"#/components/schemas/User"}],"readOnly":true},"title":{"type":"string","nullable":true,"maxLength":150},"phone_number":{"description":"Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.","oneOf":[{"type":"string","pattern":"^\\+?1?\\d{9,15}$","maxLength":15},{"type":"string","maxLength":0}]},"cell_number":{"description":"Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.","oneOf":[{"type":"string","pattern":"^\\+?1?\\d{9,15}$","maxLength":15},{"type":"string","maxLength":0}]},"twitter_username":{"type":"string","nullable":true,"maxLength":150},"github_username":{"type":"string","nullable":true,"maxLength":150},"slack_username":{"type":"string","nullable":true,"title":"Slack Email Address","description":"Email address associated with your slack account","maxLength":150},"slack_user_id":{"type":"string","nullable":true,"maxLength":25},"block_execution":{"type":"boolean","description":"Instead of async deduping a finding the findings will be deduped synchronously and will 'block' the user until completion."},"deduplication_execution_mode":{"enum":["async","async_wait","sync","",null],"type":"string","x-spec-enum-id":"bf7fb8ff28520a46","nullable":true,"description":"Controls how import/reimport deduplication post-processing is executed. 'Async' dispatches it to the background and returns immediately (default). 'Async, wait for deduplication' dispatches to the background but waits for deduplication to finish before responding, so notifications and statistics reflect the deduplicated state. 'Synchronous' runs the import deduplication inline. Can be overridden per request. Independent of block_execution, which forces all async tasks (notifications, jira, ...) to the foreground.\n\n* `async` - Async (do not wait)\n* `async_wait` - Async, wait for deduplication\n* `sync` - Synchronous (block)"},"force_password_reset":{"type":"boolean","description":"Forces this user to reset their password on next login."},"token_last_reset":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of the most recent API token reset for this user."},"token_expiry":{"type":"string","format":"date-time","nullable":true,"description":"Explicit expiry for this user's API token. Overrides the instance-wide default from DD_API_TOKEN_DEFAULT_EXPIRY_DAYS. Leave empty to use that default. Once the effective expiry has passed the token is rejected at authentication."},"password_last_reset":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of the most recent password reset for this user."},"language":{"type":"string","description":"Preferred language for the DefectDojo UI. Leave blank to use the instance default.","maxLength":12},"user":{"type":"integer"}},"required":["id","user","user_profile"]},"UserRequest":{"type":"object","properties":{"username":{"type":"string","minLength":1,"description":"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.","pattern":"^[\\w.@+-]+$","maxLength":150},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150},"email":{"type":"string","format":"email","minLength":1},"is_active":{"type":"boolean","title":"Active","description":"Designates whether this user should be treated as active. Unselect this instead of deleting accounts."},"is_staff":{"type":"boolean","title":"Staff status","description":"Designates whether the user can log into this admin site."},"is_superuser":{"type":"boolean","title":"Superuser status","description":"Designates that this user has all permissions without explicitly assigning them."},"password":{"type":"string","writeOnly":true,"minLength":1},"configuration_permissions":{"type":"array","items":{"type":"integer","nullable":true}}},"required":["email","username"]},"UserStub":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"username":{"type":"string","description":"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.","pattern":"^[\\w.@+-]+$","maxLength":150},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150}},"required":["id","username"]},"UserStubRequest":{"type":"object","properties":{"username":{"type":"string","minLength":1,"description":"Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.","pattern":"^[\\w.@+-]+$","maxLength":150},"first_name":{"type":"string","maxLength":150},"last_name":{"type":"string","maxLength":150}},"required":["username"]},"V3EndpointCompatible":{"type":"object","description":"Serializes a LocationProductReference model to something that looks like an Endpoint.","properties":{"id":{"type":"integer","readOnly":true},"protocol":{"type":"string"},"userinfo":{"type":"string"},"host":{"type":"string"},"port":{"type":"integer"},"path":{"type":"string"},"query":{"type":"string"},"fragment":{"type":"string"},"tags":{"type":"array","items":{"type":"string"},"readOnly":true},"location_id":{"type":"integer"},"active_finding_count":{"type":"integer","readOnly":true},"created":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was initially created, and saved to the database"},"updated":{"type":"string","format":"date-time","readOnly":true,"nullable":true,"description":"Time that the object was most recently saved to the database"},"relationship":{"enum":["owned_by","used_by",""],"type":"string","x-spec-enum-id":"8c638fc6583828e5","description":"The relationship between two locations\n\n* `owned_by` - is owned by\n* `used_by` - is used by"},"relationship_data":{"description":"Any extra data about this relationship"},"status":{"enum":["Active","Mitigated"],"type":"string","x-spec-enum-id":"bcfb073a62b96b70","description":"The status of the the given Location\n\n* `Active` - Active\n* `Mitigated` - Mitigated"},"product":{"type":"integer"}},"required":["active_finding_count","created","fragment","host","id","location_id","path","port","product","protocol","query","tags","updated","userinfo"]},"VerdictBatchRequest":{"type":"object","description":"Endpoint A body: general providers name their product scope.","properties":{"source":{"type":"string","minLength":1,"maxLength":300},"analyzed_commit":{"type":"string","maxLength":64},"items":{"type":"array","items":{"$ref":"#/components/schemas/ReachabilityVerdictItemRequest"}},"product":{"type":"integer"}},"required":["items","product","source"]},"Version":{"type":"object","properties":{"version":{"type":"string","maxLength":8}},"required":["version"]},"VulnerabilityId":{"type":"object","properties":{"vulnerability_id":{"type":"string"}},"required":["vulnerability_id"]},"VulnerabilityIdRequest":{"type":"object","properties":{"vulnerability_id":{"type":"string","minLength":1}},"required":["vulnerability_id"]},"VulnerabilityResponsePolicy":{"type":"object","description":"A published standard as data, with its cells nested for reading.","properties":{"id":{"type":"integer","readOnly":true},"name":{"type":"string","description":"Display name for this policy, for example 'FedRAMP VDR 2026'.","maxLength":128},"standard":{"type":"string","description":"The published standard's own identifier, for example 'FedRAMP VDR'. Free text, because every framework names itself differently and this column must not privilege one of them.","maxLength":128},"version":{"type":"string","description":"The version identifier the standard publishes for itself, for example a release date. Together with the standard this is the seed key, so a revision arrives as a new row.","maxLength":64},"effective_from":{"type":"string","format":"date","description":"The date this version of the standard takes effect."},"enabled":{"type":"boolean","description":"When disabled, SLA configurations pointing at this policy fall back to their own VDR settings. Lets an operator stage a policy before it governs any deadline."},"impact_vocabulary":{"description":"The standard's adverse-impact level codes, as a JSON list in ascending order of impact, for example [\"N1\", \"N2\", \"N3\", \"N4\", \"N5\"]. Ascending order is what lets a threshold be expressed as 'above this code' without this code knowing the words."},"authorization_vocabulary":{"description":"The standard's authorization or certification level codes, as a JSON list, for example [\"A\", \"B\", \"C\", \"D\"]. Free-form for the same reason as the impact vocabulary: the in-force FedRAMP rules key timeframes on certification classes, while older FedRAMP material and other frameworks key them on low/moderate/high."},"severity_impact_map":{"title":"Severity to Impact Map","description":"The fallback mapping from a finding's severity onto this policy's impact vocabulary, for example {\"Critical\": \"N5\"}. Only consulted when nothing better is known. Configurable per policy because severity is a poor proxy for impact on a customer's mission and the customer has to be able to correct it."},"epss_threshold":{"type":"number","format":"double","nullable":true,"description":"The EPSS score at or above which a finding counts as credibly exploitable under this policy. Null defers to the SLA configuration's own VDR EPSS threshold."},"evaluation_days":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"How many days after detection the standard allows for evaluating a vulnerability. Null means the standard sets no evaluation deadline."},"evaluation_days_by_authorization":{"title":"Evaluation Days by Authorization Level","description":"Per-authorization-level overrides of the evaluation deadline, for example {\"D\": 2}. Consulted before the flat evaluation days above."},"escalate_to_incident":{"title":"Escalation Condition","description":"The condition under which the standard treats a vulnerability as a reportable incident until it is mitigated, as a JSON object. Recorded here rather than in code so a revision that moves the threshold is a seed change."},"acceptance_days":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"The point after which the standard categorises an unresolved vulnerability as accepted. Null means the standard sets no such backstop."},"source_url":{"description":"Where this version of the standard is published.","oneOf":[{"type":"string","format":"uri","maxLength":256},{"type":"string","maxLength":0}]},"note":{"type":"string","description":"A short citation locating these timeframes in the published document."},"timeframes":{"type":"array","items":{"$ref":"#/components/schemas/ResponseTimeframe"},"readOnly":true},"created_at":{"type":"string","format":"date-time","readOnly":true,"title":"Created Timestamp","description":"The time that the record was created"},"updated_at":{"type":"string","format":"date-time","readOnly":true,"title":"Updated Timestamp","description":"The last time the record was updated"}},"required":["created_at","effective_from","id","name","standard","timeframes","updated_at","version"]},"VulnerabilityResponsePolicyRequest":{"type":"object","description":"A published standard as data, with its cells nested for reading.","properties":{"name":{"type":"string","minLength":1,"description":"Display name for this policy, for example 'FedRAMP VDR 2026'.","maxLength":128},"standard":{"type":"string","minLength":1,"description":"The published standard's own identifier, for example 'FedRAMP VDR'. Free text, because every framework names itself differently and this column must not privilege one of them.","maxLength":128},"version":{"type":"string","minLength":1,"description":"The version identifier the standard publishes for itself, for example a release date. Together with the standard this is the seed key, so a revision arrives as a new row.","maxLength":64},"effective_from":{"type":"string","format":"date","description":"The date this version of the standard takes effect."},"enabled":{"type":"boolean","description":"When disabled, SLA configurations pointing at this policy fall back to their own VDR settings. Lets an operator stage a policy before it governs any deadline."},"impact_vocabulary":{"description":"The standard's adverse-impact level codes, as a JSON list in ascending order of impact, for example [\"N1\", \"N2\", \"N3\", \"N4\", \"N5\"]. Ascending order is what lets a threshold be expressed as 'above this code' without this code knowing the words."},"authorization_vocabulary":{"description":"The standard's authorization or certification level codes, as a JSON list, for example [\"A\", \"B\", \"C\", \"D\"]. Free-form for the same reason as the impact vocabulary: the in-force FedRAMP rules key timeframes on certification classes, while older FedRAMP material and other frameworks key them on low/moderate/high."},"severity_impact_map":{"title":"Severity to Impact Map","description":"The fallback mapping from a finding's severity onto this policy's impact vocabulary, for example {\"Critical\": \"N5\"}. Only consulted when nothing better is known. Configurable per policy because severity is a poor proxy for impact on a customer's mission and the customer has to be able to correct it."},"epss_threshold":{"type":"number","format":"double","nullable":true,"description":"The EPSS score at or above which a finding counts as credibly exploitable under this policy. Null defers to the SLA configuration's own VDR EPSS threshold."},"evaluation_days":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"How many days after detection the standard allows for evaluating a vulnerability. Null means the standard sets no evaluation deadline."},"evaluation_days_by_authorization":{"title":"Evaluation Days by Authorization Level","description":"Per-authorization-level overrides of the evaluation deadline, for example {\"D\": 2}. Consulted before the flat evaluation days above."},"escalate_to_incident":{"title":"Escalation Condition","description":"The condition under which the standard treats a vulnerability as a reportable incident until it is mitigated, as a JSON object. Recorded here rather than in code so a revision that moves the threshold is a seed change."},"acceptance_days":{"type":"integer","maximum":2147483647,"minimum":0,"nullable":true,"description":"The point after which the standard categorises an unresolved vulnerability as accepted. Null means the standard sets no such backstop."},"source_url":{"description":"Where this version of the standard is published.","oneOf":[{"type":"string","format":"uri","maxLength":256},{"type":"string","maxLength":0}]},"note":{"type":"string","description":"A short citation locating these timeframes in the published document."}},"required":["effective_from","name","standard","version"]},"WidgetAggregateRequestRequest":{"type":"object","properties":{"model":{"enum":["finding","product","engagement","test"],"type":"string","description":"* `finding` - finding\n* `product` - product\n* `engagement` - engagement\n* `test` - test","x-spec-enum-id":"238c8fed600431b0"},"filters":{},"group_by":{"type":"string","minLength":1,"description":"Dimension key from the model's catalog."},"aggregation":{"enum":["count","distinct_cwe","distinct_issue","distinct_vulnerability_id"],"type":"string","description":"* `count` - count\n* `distinct_cwe` - distinct_cwe\n* `distinct_issue` - distinct_issue\n* `distinct_vulnerability_id` - distinct_vulnerability_id","x-spec-enum-id":"e70498de52e0d31c","default":"count"},"include_child_assets":{"type":"boolean","default":false,"description":"Widen a ``product`` filter to that asset plus every asset under it by rollup edges (parent / contains). Finding model only: any other model is a 400."},"include_total":{"type":"boolean","default":false,"description":"Add ``total``: the operator applied once over the filtered set (for a distinct operator, not the sum of the buckets). Costs a second query."},"total_groups":{"type":"array","items":{"type":"string","minLength":1},"description":"With ``include_total``: count the total over only the rows whose group value is in this list. Categorical ``group_by`` only."},"time_bucket":{"enum":["day","week","month","quarter","year",null],"type":"string","x-spec-enum-id":"d84a1376d5a58541","nullable":true,"description":"Required iff the dimension's kind is 'time'.\n\n* `day` - day\n* `week` - week\n* `month` - month\n* `quarter` - quarter\n* `year` - year"},"limit":{"type":"integer","maximum":1000,"minimum":1,"nullable":true,"description":"Top-N cap. Omit / null for no cap."}},"required":["group_by","model"]},"WidgetAggregation":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"}},"required":["key","label"]},"WidgetAgingRequestRequest":{"type":"object","properties":{"filters":{},"boundaries":{"type":"array","items":{"type":"integer","maximum":3650,"minimum":1}},"date_field":{"type":"string","minLength":1,"default":"created"},"severity_filter":{"type":"array","items":{"type":"string","minLength":1}}}},"WidgetCatalogEntry":{"type":"object","properties":{"type":{"type":"string","description":"The value to set on a widget's ``type`` field."},"label":{"type":"string"},"category":{"type":"string"},"description":{"type":"string"},"data_endpoints":{"type":"array","items":{"type":"string"},"description":"Relative URLs the widget POSTs/GETs to render. Empty for widgets rendered entirely from config (markdown, iframe, favorites, quick_actions, table)."},"config_example":{"description":"A minimal valid widget ``config`` dict."},"surfaces":{"type":"array","items":{"type":"string"},"description":"Where the widget can be placed: ``dashboard``, and ``report`` when a report can draw it."},"requires":{"$ref":"#/components/schemas/WidgetCatalogRequirements"}},"required":["category","config_example","data_endpoints","description","label","requires","surfaces","type"]},"WidgetCatalogRequirements":{"type":"object","properties":{"feature_flags":{"type":"array","items":{"type":"string"},"description":"Feature-flag registry keys the data endpoint requires beyond ``dashboard_v2``."},"licensed_features":{"type":"array","items":{"type":"string"},"description":"License capabilities the data endpoint requires (e.g. ``psirt_engine``)."},"permissions":{"type":"array","items":{"type":"string"},"description":"Role gates the data endpoint requires: ``global_maintainer``, ``generated_report_view``, ``psirt_view``."}},"required":["feature_flags","licensed_features","permissions"]},"WidgetCatalogResponse":{"type":"object","properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/WidgetCategory"},"description":"Category metadata, matches the frontend's grouping order."},"widgets":{"type":"array","items":{"$ref":"#/components/schemas/WidgetCatalogEntry"},"description":"One entry per widget type. Order is editorial."}},"required":["categories","widgets"]},"WidgetCategory":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"}},"required":["description","id","label"]},"WidgetConfigSchemaResponse":{"type":"object","properties":{"dialect":{"type":"string","description":"The JSON Schema dialect URI every schema below is written in."},"widgets":{"type":"object","additionalProperties":{},"description":"Widget type -> JSON Schema for that type's ``config`` object."}},"required":["dialect","widgets"]},"WidgetCountRequestRequest":{"type":"object","properties":{"model":{"enum":["finding","product","engagement","test"],"type":"string","x-spec-enum-id":"238c8fed600431b0","description":"Target model. Must be one of the supported COUNT models.\n\n* `finding` - finding\n* `product` - product\n* `engagement` - engagement\n* `test` - test"},"filters":{"description":"Filter dict in the same shape the list view's URL emits. Empty object means 'no filters' (counts everything)."},"aggregation":{"enum":["count","distinct_cwe","distinct_issue","distinct_vulnerability_id"],"type":"string","x-spec-enum-id":"e70498de52e0d31c","default":"count","description":"What to count over the matching rows: 'count' (rows), 'distinct_cwe' (unique CWEs, CWE 0 excluded), 'distinct_vulnerability_id' (unique vulnerability ids, case-insensitive) or 'distinct_issue' (the vulnerability id, else the CWE). The distinct measures apply to the finding model.\n\n* `count` - count\n* `distinct_cwe` - distinct_cwe\n* `distinct_issue` - distinct_issue\n* `distinct_vulnerability_id` - distinct_vulnerability_id"},"include_child_assets":{"type":"boolean","default":false,"description":"Widen a ``product`` filter to that asset plus every asset under it by rollup edges (parent / contains). Finding model only: any other model is a 400."}},"required":["model"]},"WidgetCountResponse":{"type":"object","properties":{"count":{"type":"integer"}},"required":["count"]},"WidgetDimension":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"kind":{"type":"string"}},"required":["key","kind","label"]},"WidgetDimensionsResponse":{"type":"object","properties":{"model":{"type":"string"},"dimensions":{"type":"array","items":{"$ref":"#/components/schemas/WidgetDimension"}},"aggregations":{"type":"array","items":{"$ref":"#/components/schemas/WidgetAggregation"}}},"required":["aggregations","dimensions","model"]},"WidgetFilterContractChoice":{"type":"object","properties":{"value":{"nullable":true},"label":{"type":"string"}},"required":["label","value"]},"WidgetFilterContractEntry":{"type":"object","properties":{"key":{"type":"string"},"filter":{"type":"string"},"field":{"type":"string"},"lookup":{"type":"string"},"url_safe":{"type":"boolean"},"label":{"type":"string"},"help_text":{"type":"string"},"choices":{"type":"array","items":{"$ref":"#/components/schemas/WidgetFilterContractChoice"}}},"required":["field","filter","key","lookup","url_safe"]},"WidgetFilterContractResponse":{"type":"object","properties":{"model":{"type":"string"},"filters":{"type":"array","items":{"$ref":"#/components/schemas/WidgetFilterContractEntry"}},"dimensions":{"type":"array","items":{}},"record_metrics":{"type":"array","items":{}}},"required":["dimensions","filters","model","record_metrics"]},"WidgetHeatmapRequestRequest":{"type":"object","properties":{"filters":{},"date_field":{"enum":["created","mitigated","date"],"type":"string","description":"* `created` - created\n* `mitigated` - mitigated\n* `date` - date","x-spec-enum-id":"cf7b4eb347a72af1","default":"created"},"window_days":{"type":"integer","maximum":730,"minimum":30,"default":365}}},"WidgetMttrMttdRequestRequest":{"type":"object","properties":{"filters":{},"time_bucket":{"enum":["day","week","month"],"type":"string","description":"* `day` - day\n* `week` - week\n* `month` - month","x-spec-enum-id":"273287207128dc4a","default":"week"},"window_days":{"type":"integer","maximum":730,"minimum":7,"default":90}}},"WidgetPriorityHistogramRequestRequest":{"type":"object","properties":{"filters":{},"bin_count":{"type":"integer","maximum":50,"minimum":5,"default":10}}},"WidgetRateChartRequestRequest":{"type":"object","properties":{"model":{"type":"string","minLength":1},"filters":{},"pass_filters":{},"group_by":{"type":"string","minLength":1,"description":"Categorical dim — time/banded dims not allowed."},"limit":{"type":"integer","maximum":50,"minimum":1},"sort":{"enum":["rate_desc","rate_asc","count_desc"],"type":"string","description":"* `rate_desc` - rate_desc\n* `rate_asc` - rate_asc\n* `count_desc` - count_desc","x-spec-enum-id":"b4181f04a282698f"},"min_denominator":{"type":"integer","minimum":0},"metric_label":{"type":"string","minLength":1}},"required":["group_by","model"]},"WidgetRecordMetric":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"default_sort":{"enum":["asc","desc"],"type":"string","description":"* `asc` - asc\n* `desc` - desc","x-spec-enum-id":"eadf035d1a023852"}},"required":["default_sort","key","label"]},"WidgetRecordMetricsResponse":{"type":"object","properties":{"model":{"type":"string"},"metrics":{"type":"array","items":{"$ref":"#/components/schemas/WidgetRecordMetric"}}},"required":["metrics","model"]},"WidgetRiskMatrixRequestRequest":{"type":"object","properties":{"filters":{},"x_dim":{"enum":["severity","risk","cvssv3_band","cvssv4_band"],"type":"string","description":"* `severity` - severity\n* `risk` - risk\n* `cvssv3_band` - cvssv3_band\n* `cvssv4_band` - cvssv4_band","x-spec-enum-id":"fd343279b8aa98a3","default":"severity"}}},"WidgetRootCausesRequestRequest":{"type":"object","properties":{"limit":{"type":"integer","maximum":20,"minimum":1,"default":5}}},"WidgetSankeyRequestRequest":{"type":"object","properties":{"model":{"type":"string","minLength":1,"default":"finding"},"filters":{},"source_dim":{"type":"string","minLength":1,"description":"Categorical dim — same allowlist as aggregate group_by."},"target_dim":{"type":"string","minLength":1}},"required":["source_dim","target_dim"]},"WidgetScanCoverageRequestRequest":{"type":"object","properties":{"model":{"type":"string","minLength":1,"default":"product"},"filters":{},"windows":{"type":"array","items":{"type":"integer","maximum":3650,"minimum":1},"description":"Day counts. 1-4 windows; defaults to [30, 90, 180, 365]."}}},"WidgetSunburstRequestRequest":{"type":"object","properties":{"model":{"type":"string","minLength":1,"default":"finding"},"filters":{},"hierarchy":{"type":"array","items":{"type":"string","minLength":1},"description":"1 or 2 dim keys, in outer-to-inner order."}},"required":["hierarchy"]},"WidgetTopRecordsRequestRequest":{"type":"object","properties":{"model":{"type":"string","minLength":1},"filters":{},"metric":{"type":"string","minLength":1},"limit":{"type":"integer","maximum":100,"minimum":1},"sort":{"enum":["asc","desc",null],"type":"string","description":"* `asc` - asc\n* `desc` - desc","x-spec-enum-id":"eadf035d1a023852","nullable":true}},"required":["metric","model"]},"WidgetTreemapRequestRequest":{"type":"object","properties":{"filters":{},"metric":{"enum":["count","active_count"],"type":"string","description":"* `count` - count\n* `active_count` - active_count","x-spec-enum-id":"d3abee9754f3e36d","default":"active_count"}}},"WidgetVelocityRequestRequest":{"type":"object","properties":{"filters":{},"time_bucket":{"enum":["day","week","month","quarter","year"],"type":"string","description":"* `day` - day\n* `week` - week\n* `month` - month\n* `quarter` - quarter\n* `year` - year","x-spec-enum-id":"d84a1376d5a58541","default":"week"},"window_days":{"type":"integer","maximum":730,"minimum":7,"default":90}}},"_CountRef":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"count":{"type":"integer"}},"required":["count","id","name"]},"_Engine":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"is_default":{"type":"boolean"}},"required":["id","is_default","name"]},"_MappedTest":{"type":"object","description":"The Test object nested inside a MappingTest through row.","properties":{"id":{"type":"integer","readOnly":true},"title":{"type":"string","nullable":true,"maxLength":255},"scan_type":{"type":"string","nullable":true}},"required":["id"]},"_NamedRef":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"}},"required":["id","name"]},"_PriorityField":{"type":"object","properties":{"field":{"enum":["business_criticality","user_records","revenue","external_audience","internet_accessible"],"type":"string","description":"* `business_criticality` - business_criticality\n* `user_records` - user_records\n* `revenue` - revenue\n* `external_audience` - external_audience\n* `internet_accessible` - internet_accessible","x-spec-enum-id":"51fa63bb36ba0fe3"},"value":{"nullable":true},"set":{"type":"boolean"},"weight":{"type":"number","format":"double","nullable":true,"description":"The prioritization engine's scalar for it."},"organization_total":{"type":"number","format":"double","nullable":true},"share":{"type":"number","format":"double","nullable":true,"description":"Share of the organization total."},"exposure_override":{"type":"string","nullable":true}},"required":["field","set","value","weight"]},"_Sla":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"configuration_type":{"type":"string"},"source":{"enum":["default","criticality_mapping","asset"],"type":"string","description":"* `default` - default\n* `criticality_mapping` - criticality_mapping\n* `asset` - asset","x-spec-enum-id":"3c824484f1ee84da"}},"required":["configuration_type","id","name","source"]},"_User":{"type":"object","properties":{"id":{"type":"integer"},"username":{"type":"string"}},"required":["id","username"]},"AddUser":{"type":"object","description":"Minimal user representation with id and username only.","properties":{"id":{"type":"integer","readOnly":true},"username":{"type":"string","maxLength":150}},"required":["username"]},"ProErrorResponse":{"type":"object","description":"Body of a 401 or 403 response. `code` is a stable machine-readable key: `not_authenticated`, `authentication_failed`, `mcp_disabled` (401); `permission_denied`, `feature_disabled`, `not_licensed`, `locked_by_admin` (403). `feature` names the feature-flag key or license capability that was denied and is present only for `feature_disabled` and `not_licensed`.","properties":{"detail":{"type":"string","description":"Human-readable explanation."},"code":{"type":"string","description":"Machine-readable error code."},"feature":{"type":"string","description":"Denied feature-flag key or license capability."}},"required":["detail","code"]}},"securitySchemes":{"aiGuardrailsCollectorToken":{"type":"http","scheme":"bearer","description":"An AI guardrails collector token (ddgr_...). It authenticates the Claude Code hook endpoint only."},"basicAuth":{"type":"http","scheme":"basic"},"cookieAuth":{"type":"apiKey","in":"cookie","name":"sessionid"},"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}}}}