An Earnie API key, sent as Authorization: Bearer sk_earnie_.... Create one under Settings > API keys. The key's scopes decide which operations it may call.
Per-finding Export Signals for the current regime, current-vintage rows first. Rows computed under a superseded regime version are still returned, marked vintage: retired; they are never dropped, because a regime bump would otherwise empty this array for every project that has not re-scanned. Other finding domains return an empty array.
The severity this finding carried before the most recent re-scan changed it. severity is recomputed and overwritten on every re-scan, so without this the previous value is simply gone. Null means no re-scan has ever moved this finding's severity — it is not "unknown", and it must not be read as "was previously none".
The scan run this finding was last observed at while it still carried previous_severity, so a client can state the whole fact — "was critical at scan " — instead of an unattributable claim. Null when no transition has been recorded, and also when the earlier observation predates scan-run tracking: a set previous_severity with a null scan run is a real transition whose scan cannot be named.
Which direction the recorded transition went, and the only field that distinguishes a downgrade from a raise. Null when no transition has been recorded.
ID of the resolution that currently explains this finding's resolved state. Null when the finding is open, reopened, or superseded by a rule. Set on resolve; cleared to null on reopen, supersede, or revert. Consumers can use this to fetch the full resolution record in one query rather than replaying audit events.
True when the finding was read from a pull request scan's own result set and no standing project finding carries its id: the pull request introduced it and it has not reached the default branch. It can still be resolved, reopened and approved: the decision is kept by identity and applies when the finding reaches the default branch. Assign, suppress and create-rule answer 409 finding_scan_only until it does. Absent or false everywhere else.
A resolve decision taken on a finding a pull request introduced (scan_only). It is kept by the finding's identity and becomes the resolution it describes when that identity first reaches the default branch. Until then the pull request reads the finding as resolved, and out of its gate when suppresses is true. Present only on a scan_only finding that carries one.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"SCANOSS documentation","colors":{"primary":"#FF6A1A","light":"#FF6A1A","dark":"#FF6A1A"},"logo":{"light":"https://mintcdn.com/scanoss/9UP7eHL2Z_rQPx8l/scanoss-logo-horizontal-positive.svg?fit=max\u0026auto=format\u0026n=9UP7eHL2Z_rQPx8l\u0026q=85\u0026s=686c4487013423ef804e2e83983c76ef","dark":"https://mintcdn.com/scanoss/9UP7eHL2Z_rQPx8l/scanoss-logo-horizontal-negative.svg?fit=max\u0026auto=format\u0026n=9UP7eHL2Z_rQPx8l\u0026q=85\u0026s=03cf2002f3fff2726f8e9b19bb2781ec","href":"https://scanoss.com"},"favicon":"https://mintcdn.com/scanoss/SuvZQ2xWfRUv4OAb/scan-favicon.png?fit=max\u0026auto=format\u0026n=SuvZQ2xWfRUv4OAb\u0026q=85\u0026s=4f02839460dfdc66102d3b028b507df6","appearance":{"default":"system","strict":false},"footer":{"socials":{"x":"https://x.com/SCANOSS_","github":"https://github.com/scanoss","linkedin":"https://es.linkedin.com/company/scanoss"}},"seo":{"indexing":"all"},"fonts":{"heading":{"family":"Space Grotesk","weight":700,"format":"woff2"},"body":{"family":"Space Grotesk","format":"woff2"}},"integrations":{"ga4":{"measurementId":"G-NWY31TXG8Y"}},"banner":{"content":"**Earnie is here** — SCANOSS's major release for AI governance, cryptography, PQC readiness, and open source compliance. [Watch the release demo →](https://youtu.be/MKgIpH4bEQ4?si=wXECS3umWGx11mB7)","dismissible":true},"contextual":{"options":["copy","view","claude","chatgpt","cursor","vscode","mcp"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"scanoss","hasAudioNarration":false,"actualSubdomain":"scanoss","customDomains":["docs.scanoss.com"],"gitSource":{"type":"github","owner":"scanoss","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae1a1ce5ca9b4a2f462af41","collectionId":"88eeda7e-8420-4b77-b284-4cc7695dc50f","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae1a1ce5ca9b4a2f462af41"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae1a1ce5ca9b4a2f462af41","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Earnie","count":161},{"language":"default","tag":"API Reference","count":137},{"language":"default","tag":"Guides","count":87},{"language":"default","tag":"Developer Tools","count":67},{"language":"default","tag":"API reference","count":48},{"language":"default","tag":"v3 endpoints","count":47},{"language":"default","tag":"Scans","count":44},{"language":"default","tag":"scans","count":44},{"language":"default","tag":"Policies","count":22},{"language":"default","tag":"CLI Tools","count":21}]},"assistantConfig":{"enableStarterQuestions":true,"deflection":{"enabled":true,"email":"support@scanoss.com","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"starterQuestions":[{"_id":"695fa5b6a879c7d6b0e8a169","deploymentId":"68551e34bde804c6773f4df2","questionText":"Cannot import/export projects?","status":"active","generatedBy":"manual","createdAt":"2026-01-08T12:40:22.697Z","updatedAt":"2026-01-08T12:40:22.697Z","__v":0},{"_id":"695fa5a4a879c7d6b0e8a064","deploymentId":"68551e34bde804c6773f4df2","questionText":"Dependency files not detected during scan?","status":"active","generatedBy":"manual","createdAt":"2026-01-08T12:40:04.675Z","updatedAt":"2026-01-08T12:40:04.675Z","__v":0},{"_id":"695fa566a879c7d6b0e89d1e","deploymentId":"68551e34bde804c6773f4df2","questionText":"How do I configure the SCANOSS API key?","status":"active","generatedBy":"manual","createdAt":"2026-01-08T12:39:02.662Z","updatedAt":"2026-01-08T12:39:02.662Z","__v":0}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"#banner{background-color:#ff6a1a!important;color:#fff!important}html:not(.dark) #assistant-entry,html:not(.dark) #background-color,html:not(.dark) #chat-assistant-sheet,html:not(.dark) #chat-assistant-sheet .bg-background-light,html:not(.dark) #navbar-transition,html:not(.dark) .chat-assistant-floating-input .bg-background-light,html:not(.dark) .chat-assistant-floating-input::before{background-color:#f4f6f9!important}html:not(.dark) h1{color:#081320!important}html:not(.dark) nav a[aria-current=page]{background-color:rgba(8,19,32,.1)!important}html.dark #background-color,html.dark #navbar-transition{background-color:#081320!important}html.dark .prose :where(h1, h2, h3, h4, h5, h6),html.dark .prose :where(p, li, td, th):not(svg *),html.dark h1{color:#fff!important}html.dark nav a[aria-current=page]{background-color:rgba(255,106,26,.15)!important}html.dark #assistant-entry,html.dark #chat-assistant-sheet,html.dark #chat-assistant-sheet .dark\\:bg-background-dark,html.dark .chat-assistant-floating-input .dark\\:bg-background-dark,html.dark .chat-assistant-floating-input::before{background-color:#081320!important}nav#sidebar .sticky.top-0.h-8,span[style*=radial-gradient]{display:none!important}#sidebar #navigation-items{padding-top:2rem}.eyebrow,nav a.text-primary{color:#ff6a1a!important}"}],"page":{"pagePath":"earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state","slug":"/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state","pageMetadata":{"title":"Suppress or unsuppress a finding (orthogonal to triage state)","description":null,"deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings/{findingId}/actions/suppress","href":"/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state","autogeneratedByOpenApi":true},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Suppress or unsuppress a finding (orthogonal to triage state)","description":null,"deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings/{findingId}/actions/suppress","href":"/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"PostV1FindingsFindingIdActionsSuppress","summary":"Suppress or unsuppress a finding (orthogonal to triage state)","tags":["findings"],"parameters":["c678bfe7-501c-4d7b-8828-49198b73bdd9"],"requestBody":"219f624c-c3c5-4887-81ff-4741a2554ef7","responses":{"200":"068e42ce-6f88-4476-b850-f0cb9dc5bd77","400":"cca0d859-4696-4e6c-a064-a1cd10d35b6b","401":"42fac269-637f-4f9d-8d15-92e8c8e83037","403":"24d44af0-721b-41c0-a6ff-d62d5fc95639","404":"964efb40-432a-4540-8d6b-462ca703cf93","409":"adb1b337-e0c8-4778-a576-7dd3f1b8de2d","500":"7dbca7a7-25f8-4b5b-95b9-2f279b3fa20d"},"method":"post","type":"path","servers":["4d816cad-ef08-4835-941f-5a852e437ef9"],"security":["c8d1323b-1149-4c60-81d6-3e183ff9fead"],"path":"/v1/findings/{findingId}/actions/suppress","baseUrlOptions":["https://{tenant}.earnie.dev"],"title":"Suppress or unsuppress a finding (orthogonal to triage state)","description":"","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"c678bfe7-501c-4d7b-8828-49198b73bdd9":{"name":"findingId","in":"path","required":true,"schema":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"","typeLabel":"string\u003cuuid>"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["suppress"],"properties":{"suppress":{"type":"boolean","isRequired":true,"uniqueKey":"suppress","typeLabel":"boolean"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"suppress":true}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"068e42ce-6f88-4476-b850-f0cb9dc5bd77":{"description":"Updated finding after suppression toggle","content":{"application/json":{"schema":{"type":"object","required":["id","org_id","project_id","domain_slug","title","evidence","produced_by","state","domain","severity","suppressed","version","created_at","updated_at","purpose","export_signals"],"properties":{"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"id","typeLabel":"string\u003cuuid>"},"org_id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"org_id","typeLabel":"string\u003cuuid>"},"project_id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"project_id","typeLabel":"string\u003cuuid>"},"domain_slug":{"type":"string","isRequired":true,"uniqueKey":"domain_slug","typeLabel":"string"},"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"evidence":{"oneOf":[{"type":"object","required":["kind","local_file","local_line_start","local_line_end","oss_file","oss_line_start","oss_line_end","purl","match_percent","algorithm"],"properties":{"kind":{"type":"string","enum":["oss-diff"],"isRequired":true,"uniqueKey":"evidence.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"local_file":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.0.local_file","typeLabel":"string"},"local_line_start":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.0.local_line_start","typeLabel":"integer"},"local_line_end":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.0.local_line_end","typeLabel":"integer"},"oss_file":{"type":"string","description":"CRC64 source hash of the matched OSS file; the content-fetch key, not a path.","isRequired":true,"uniqueKey":"evidence.oneOf.0.oss_file","typeLabel":"string"},"oss_line_start":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.0.oss_line_start","typeLabel":"integer"},"oss_line_end":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.0.oss_line_end","typeLabel":"integer"},"purl":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.0.purl","typeLabel":"string"},"match_percent":{"type":"number","format":"double","isRequired":true,"uniqueKey":"evidence.oneOf.0.match_percent","typeLabel":"number\u003cdouble>"},"algorithm":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.0.algorithm","typeLabel":"string"},"oss_file_path":{"type":"string","description":"Relative path of the matched file within the OSS component (empty for findings scanned before this was captured).","uniqueKey":"evidence.oneOf.0.oss_file_path","typeLabel":"string"},"spans":{"type":"array","description":"All matched line ranges, in order. A snippet may match several discontiguous spans; the scalar local_line_*/oss_line_* fields mirror spans[0]. Empty for a whole-file match or findings from before multi-span capture.","items":{"type":"object","required":["local_line_start","local_line_end","oss_line_start","oss_line_end"],"properties":{"local_line_start":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.0.spans.items.[INDEX].local_line_start","typeLabel":"integer"},"local_line_end":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.0.spans.items.[INDEX].local_line_end","typeLabel":"integer"},"oss_line_start":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.0.spans.items.[INDEX].oss_line_start","typeLabel":"integer"},"oss_line_end":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.0.spans.items.[INDEX].oss_line_end","typeLabel":"integer"}},"uniqueKey":"evidence.oneOf.0.spans.items.[INDEX]","typeLabel":"object"},"uniqueKey":"evidence.oneOf.0.spans","typeLabel":"object[]"},"match_type":{"type":"string","enum":["file","snippet"],"description":"SCANOSS match kind — \"file\" for a full-file fingerprint match (line ranges are 0/absent, the whole file matched), \"snippet\" for a partial line-range match. Absent on findings emitted before this field was captured.","uniqueKey":"evidence.oneOf.0.match_type","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"evidence.oneOf.0","typeLabel":"object"},{"type":"object","required":["kind","algorithm","purl","call_chain"],"properties":{"kind":{"type":"string","enum":["reachability-path"],"isRequired":true,"uniqueKey":"evidence.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"algorithm":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.1.algorithm","typeLabel":"string"},"purl":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.1.purl","typeLabel":"string"},"call_chain":{"type":"array","items":{"type":"object","required":["file","line","function"],"properties":{"file":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].file","typeLabel":"string"},"line":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].line","typeLabel":"integer"},"function":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].function","typeLabel":"string"},"signature":{"type":"string","description":"Canonical function signature retained from the callgraph producer.","uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].signature","typeLabel":"string"},"call_site_line":{"type":"integer","minimum":1,"description":"The invocation line within this frame: the call to the next frame, or the matched crypto invocation for the terminal frame. Absent on evidence written before call-site capture.","uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].call_site_line","typeLabel":"integer"},"argument_expression":{"type":"string","minLength":1,"description":"The producer-retained argument expression passed from this frame to the next frame. Absent on terminal frames, older evidence, or when the producer retained no renderable argument for the edge.","uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].argument_expression","typeLabel":"string"},"resolved_value":{"type":"string","minLength":1,"description":"The statically resolved value of argument_expression. Absent when the producer could not resolve the edge argument.","uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].resolved_value","typeLabel":"string"},"library":{"type":"object","required":["module"],"description":"The dependency a call-chain frame belongs to, as the scanner stamped it. Absent on first-party frames. `purl` is the identity; `module` and `version` are the ecosystem's own spelling.","properties":{"module":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].library.module","typeLabel":"string"},"version":{"type":"string","minLength":1,"uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].library.version","typeLabel":"string"},"purl":{"type":"string","minLength":1,"uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].library.purl","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].library","typeLabel":"object"},"entry_resolution":{"type":"string","minLength":1,"description":"How the producer resolved the call that arrives at this frame: `exact` when the callee is certain, or a dispatch kind (for example `interface_dispatch`) when the analysis could not narrow the receiver and considered every compatible implementation. A dispatch hop is indicative, not proven. The set of kinds is the producer's and may grow, so a client treats an unknown value as not exact. Absent on the first frame of a chain, on evidence from producers that do not report it, and on the frame after a truncation gap, whose caller is no longer shown.","uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].entry_resolution","typeLabel":"string"},"entry_declared_type":{"type":"string","minLength":1,"description":"The static type a dispatch hop was resolved over. Absent when entry_resolution is absent or exact.","uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX].entry_declared_type","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.1.call_chain.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"evidence.oneOf.1.call_chain","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"evidence.oneOf.1","typeLabel":"object"},{"type":"object","required":["kind","occurrence_key","rule_key","source_range","source","reachability","asset","rules","producer"],"properties":{"kind":{"type":"string","enum":["crypto-reachability"],"isRequired":true,"uniqueKey":"evidence.oneOf.2.kind","typeLabel":"enum\u003cstring>"},"occurrence_key":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.occurrence_key","typeLabel":"string"},"rule_key":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.rule_key","typeLabel":"string"},"source_range":{"type":"object","required":["file","start_line","end_line"],"properties":{"file":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.source_range.file","typeLabel":"string"},"start_line":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.2.source_range.start_line","typeLabel":"integer"},"end_line":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.2.source_range.end_line","typeLabel":"integer"},"start_column":{"type":"integer","uniqueKey":"evidence.oneOf.2.source_range.start_column","typeLabel":"integer"},"end_column":{"type":"integer","uniqueKey":"evidence.oneOf.2.source_range.end_column","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"evidence.oneOf.2.source_range","typeLabel":"object"},"source":{"type":"string","enum":["direct","dependency"],"isRequired":true,"uniqueKey":"evidence.oneOf.2.source","typeLabel":"enum\u003cstring>"},"reachability":{"type":"string","enum":["reachable","unreachable","unknown"],"isRequired":true,"uniqueKey":"evidence.oneOf.2.reachability","typeLabel":"enum\u003cstring>"},"asset":{"type":"object","description":"One cryptographic asset, discriminated by `type`. At most one of `algorithm_properties`, `protocol_properties`, `certificate_properties` and `material_properties` is present, and it is the one matching `type`; an asset of a `type` the server does not model carries none. A fact that is a coherent question for one asset type alone lives in that type's object and is structurally absent everywhere else: a certificate has no cipher mode and key material has no protocol version, so a client MUST read a fact from its own object rather than assuming a sibling applies. `type`, `algorithm` and `algorithm_name` stay at this level because they are the asset's identity rather than one type's property. The `*_properties` names follow CycloneDX `cryptoProperties`, which is also why the algorithm object is not called `algorithm`: that name is already the family spelling.","properties":{"type":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.type","typeLabel":"string"},"algorithm":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.algorithm","typeLabel":"string"},"algorithm_name":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.algorithm_name","typeLabel":"string"},"primitive":{"type":"string","deprecated":true,"description":"Replaced by `algorithm_properties.primitive`. Kept for one release.","uniqueKey":"evidence.oneOf.2.asset.primitive","typeLabel":"string"},"mode":{"type":"string","deprecated":true,"description":"Replaced by `algorithm_properties.mode`. Kept for one release.","uniqueKey":"evidence.oneOf.2.asset.mode","typeLabel":"string"},"padding":{"type":"string","deprecated":true,"description":"Replaced by `algorithm_properties.padding`. Kept for one release.","uniqueKey":"evidence.oneOf.2.asset.padding","typeLabel":"string"},"key_size":{"type":"integer","deprecated":true,"description":"Typed key length in bits; never parsed from algorithmParameterSetIdentifier. Replaced by `algorithm_properties.key_size`. Kept for one release. It was never key material's own size: a related-crypto-material asset reports that as `material_properties.size`, and the two are not commensurable, so a client MUST NOT compare a 256-bit symmetric key against an RSA modulus threshold.","uniqueKey":"evidence.oneOf.2.asset.key_size","typeLabel":"integer"},"protocol_type":{"type":"string","deprecated":true,"description":"Replaced by `protocol_properties.type`. Kept for one release.","uniqueKey":"evidence.oneOf.2.asset.protocol_type","typeLabel":"string"},"protocol_version":{"type":"string","deprecated":true,"description":"Replaced by `protocol_properties.version`. Kept for one release.","uniqueKey":"evidence.oneOf.2.asset.protocol_version","typeLabel":"string"},"oid":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.oid","typeLabel":"string"},"algorithm_properties":{"type":"object","description":"Present only when `type` is `algorithm`.","properties":{"primitive":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.algorithm_properties.primitive","typeLabel":"string"},"mode":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.algorithm_properties.mode","typeLabel":"string"},"padding":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.algorithm_properties.padding","typeLabel":"string"},"block_size":{"type":"integer","uniqueKey":"evidence.oneOf.2.asset.algorithm_properties.block_size","typeLabel":"integer"},"hash_function":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.algorithm_properties.hash_function","typeLabel":"string"},"parameter_set_identifier":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.algorithm_properties.parameter_set_identifier","typeLabel":"string"},"iterations":{"type":"integer","uniqueKey":"evidence.oneOf.2.asset.algorithm_properties.iterations","typeLabel":"integer"},"crypto_function":{"type":"string","description":"What the occurrence does with the algorithm (encrypt, sign, digest). One fact the producer spells with two keys, reported once here.","uniqueKey":"evidence.oneOf.2.asset.algorithm_properties.crypto_function","typeLabel":"string"},"elliptic_curve":{"type":"string","description":"The curve, in CycloneDX's family-qualified spelling (`secg/secp256k1`, `nist/P-256`). 579 rules in the shipped ruleset emit one, so an elliptic-curve algorithm without this field was not asked, it simply has no curve.","example":"secg/secp256k1","uniqueKey":"evidence.oneOf.2.asset.algorithm_properties.elliptic_curve","typeLabel":"string"},"key_size":{"type":"integer","description":"The algorithm's key parameter in bits: the resolved call-site literal where one exists, else the producer's typed key length, and only for the primitives whose key length is key bits. A key derivation function's length is a derived-output size and is deliberately absent rather than reported here.","uniqueKey":"evidence.oneOf.2.asset.algorithm_properties.key_size","typeLabel":"integer"}},"uniqueKey":"evidence.oneOf.2.asset.algorithm_properties","typeLabel":"object"},"protocol_properties":{"type":"object","description":"Present only when `type` is `protocol`.","properties":{"type":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.protocol_properties.type","typeLabel":"string"},"name":{"type":"string","description":"The protocol's own name, and the only fact separating SSL from TLS: the producer models SSLv3 as type `tls` with name `SSL`. A client testing for SSL MUST read this rather than `type`.","uniqueKey":"evidence.oneOf.2.asset.protocol_properties.name","typeLabel":"string"},"version":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.protocol_properties.version","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.2.asset.protocol_properties","typeLabel":"object"},"certificate_properties":{"type":"object","description":"Present only when `type` is `certificate`.","properties":{"type":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.certificate_properties.type","typeLabel":"string"},"format":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.certificate_properties.format","typeLabel":"string"},"serial_number":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.certificate_properties.serial_number","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.2.asset.certificate_properties","typeLabel":"object"},"material_properties":{"type":"object","description":"Present only when `type` is `related-crypto-material`.","properties":{"type":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.material_properties.type","typeLabel":"string"},"size":{"type":"integer","description":"This material's own size in bits, whatever the material is, a nonce's 96 included. It is NOT a key-size threshold input: a policy asking \"under 2048 bits\" MUST NOT read it for non-key material.","uniqueKey":"evidence.oneOf.2.asset.material_properties.size","typeLabel":"integer"},"algorithm":{"type":"string","description":"The algorithm this material belongs to, the producer's spelling. It is the only algorithm identity a material asset carries.","uniqueKey":"evidence.oneOf.2.asset.material_properties.algorithm","typeLabel":"string"},"format":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.material_properties.format","typeLabel":"string"},"algorithm_family":{"type":"string","description":"The family the material's algorithm belongs to, where the producer names one separately: a BLS12-381 key is of family BLS. Present when `algorithm` alone is too specific to compare.","example":"BLS","uniqueKey":"evidence.oneOf.2.asset.material_properties.algorithm_family","typeLabel":"string"},"elliptic_curve":{"type":"string","description":"The curve this key is on, family-qualified. 94 of the curve-emitting rules put a curve on a private key rather than on an algorithm.","example":"nist/P-256","uniqueKey":"evidence.oneOf.2.asset.material_properties.elliptic_curve","typeLabel":"string"},"origin":{"type":"string","description":"How the material came to exist: generated, derived, loaded, imported. It separates a key the code minted from one it read off disk.","example":"generated","uniqueKey":"evidence.oneOf.2.asset.material_properties.origin","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.2.asset.material_properties","typeLabel":"object"},"metadata":{"type":"object","deprecated":true,"description":"The producer's own keys that no reader consumed, verbatim, kept for forensics. Every key a client used to read from here now has a typed home: the four `*_properties` objects, or `implementation` on the enclosing evidence for `library`, `api` and `provider`. Kept for one release, and its contents are not a contract: a key leaves it the moment the server types that fact.","additionalProperties":{"type":"string","uniqueKey":"evidence.oneOf.2.asset.metadata.additionalProperties","typeLabel":"string"},"uniqueKey":"evidence.oneOf.2.asset.metadata","typeLabel":"object"}},"isRequired":true,"uniqueKey":"evidence.oneOf.2.asset","typeLabel":"object"},"rules":{"type":"array","items":{"type":"object","required":["id"],"properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.rules.items.[INDEX].id","typeLabel":"string"},"message":{"type":"string","uniqueKey":"evidence.oneOf.2.rules.items.[INDEX].message","typeLabel":"string"},"version":{"type":"string","uniqueKey":"evidence.oneOf.2.rules.items.[INDEX].version","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.2.rules.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"evidence.oneOf.2.rules","typeLabel":"object[]"},"producer":{"type":"object","properties":{"tool_name":{"type":"string","uniqueKey":"evidence.oneOf.2.producer.tool_name","typeLabel":"string"},"tool_version":{"type":"string","uniqueKey":"evidence.oneOf.2.producer.tool_version","typeLabel":"string"},"rules_source":{"type":"string","uniqueKey":"evidence.oneOf.2.producer.rules_source","typeLabel":"string"},"rules_name":{"type":"string","uniqueKey":"evidence.oneOf.2.producer.rules_name","typeLabel":"string"},"rules_version":{"type":"string","uniqueKey":"evidence.oneOf.2.producer.rules_version","typeLabel":"string"},"rules_checksum_sha256":{"type":"string","uniqueKey":"evidence.oneOf.2.producer.rules_checksum_sha256","typeLabel":"string"},"finding_id":{"type":"string","description":"Producer artifact join key only; never part of finding identity.","uniqueKey":"evidence.oneOf.2.producer.finding_id","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.2.producer","typeLabel":"object"},"matched_text":{"type":"string","description":"The exact code the producer matched at source_range, retained verbatim. It is the only renderable code for an occurrence whose file is not among the scanned files — a dependency-sourced one, whose call site lives in the dependency's own resolved source. Absent when the producer reported no match text; consumers MUST then say the code is unavailable rather than render an empty pane.","uniqueKey":"evidence.oneOf.2.matched_text","typeLabel":"string"},"matched_symbol":{"type":"string","description":"Fully qualified symbol from the producer's matched_operation. Absent on evidence written before symbol capture.","uniqueKey":"evidence.oneOf.2.matched_symbol","typeLabel":"string"},"purl":{"type":"string","description":"The component the occurrence is attributed to. Always present for dependency-sourced evidence; present for direct evidence when the matched rule is backed by a published package (the library whose API the first-party code is calling), absent otherwise.","uniqueKey":"evidence.oneOf.2.purl","typeLabel":"string"},"module":{"type":"string","description":"The dependency's raw, ecosystem-native module identifier as the producer reported it (Maven's `groupId:artifactId`, a Go module path, a crate name). Present only for dependency-sourced evidence. Stored separately from `purl` because the resolved-source read keys on it directly: deriving it back out of a composed `purl@version` would be a lossy inverse, and a wrong key silently reads nothing.","uniqueKey":"evidence.oneOf.2.module","typeLabel":"string"},"module_version":{"type":"string","description":"The dependency version exactly as the producer reported it, kept beside `module` for the same reason — the composed `purl` cannot be split back into the two halves reliably. Present only for dependency-sourced evidence.","uniqueKey":"evidence.oneOf.2.module_version","typeLabel":"string"},"base_severity":{"type":"string","enum":["info","low","medium","high"],"description":"The intrinsic risk Earnie's algorithm-risk table assigned to the asset, before reachability escalation — so an escalated severity can explain its derivation. Capped at high: critical is only ever earned by escalation. Absent on evidence written before this field existed; the next scan fills it in.","uniqueKey":"evidence.oneOf.2.base_severity","typeLabel":"enum\u003cstring>"},"assessed":{"type":"boolean","description":"Whether a curated risk table actually decided base_severity. False means the unassessed fallback — nobody has assessed this asset — and an unassessed finding never escalates on reachability, so severity equals base_severity. It is what lets a reader tell \"medium because the table says so\" from \"medium because nobody looked\". Absent on evidence written before this field existed.","uniqueKey":"evidence.oneOf.2.assessed","typeLabel":"boolean"},"pqc_status":{"type":"string","enum":["safe","vulnerable","unassessed","not_applicable"],"description":"The post-quantum verdict, assessed from the algorithm family on any asset type that carries one — including certificates and protocols, which carry the longest-lead migration work. `vulnerable` is Shor-relevant (the classical asymmetric families); `not_applicable` is a hash, symmetric cipher, MAC or KDF, which Shor has no structure to attack; `unassessed` is an absent or uncurated family and is never asserted safe. Replaces the quantum_safe boolean, which had to express three ideas with two values.","uniqueKey":"evidence.oneOf.2.pqc_status","typeLabel":"enum\u003cstring>"},"risk_table_version":{"type":"string","description":"The curation vintage of the Earnie-owned risk tables that judged this finding (e.g. `nist-2026-08`). Severity is scan-anchored: a finding assessed last release was assessed by rows the running process no longer holds, so the vintage travels with the verdict instead of living only in release notes. Absent on evidence written before the stamp existed.","uniqueKey":"evidence.oneOf.2.risk_table_version","typeLabel":"string"},"current_risk_table_version":{"type":"string","description":"The risk-table vintage shipping now. Paired with `risk_table_version` so a reader can state the whole fact — \"assessed under nist-2026-08, current nist-2026-11\" — without a second lookup. Derived on every read, never stored.","uniqueKey":"evidence.oneOf.2.current_risk_table_version","typeLabel":"string"},"risk_table_vintage":{"type":"string","enum":["current","retired"],"description":"Whether this finding's severity, `assessed` flag and `pqc_status` came from the risk tables shipping today (`current`) or from a superseded vintage (`retired`). Derived on every read from the two fields above — never a stored column, because a stored answer would freeze a comparison whose right operand moves with the release and would keep reading `current` for exactly the findings a reassessment must catch. A retired verdict is still auditable: it was correct under the tables that produced it, and the reassessment job brings it forward without a re-scan.","uniqueKey":"evidence.oneOf.2.risk_table_vintage","typeLabel":"enum\u003cstring>"},"export_regime_version":{"type":"string","description":"The export-control regime identity this finding's export signals were computed from, as the COMPOSED value (`ear-2026-08`) rather than the bare vintage. Composed because the vintage alone does not say which regime stated the test, and a second regime's rows (EU dual-use, Wassenaar) would be indistinguishable from EAR's. Paired with `risk_table_version` it completes the provenance of the finding: which table judged its severity, and which regime dataset answered its export tests. Absent on evidence written before the stamp existed; the next scan fills it in.","uniqueKey":"evidence.oneOf.2.export_regime_version","typeLabel":"string"},"assessed_family":{"type":"string","description":"The canonical algorithm family the curated tables actually resolved this occurrence to — not the producer's spelling, which `asset.algorithm` carries verbatim. It is what lets a reader tell \"judged as `rsa`\" from \"the producer wrote RSA and nothing matched\", and what stops a later alias edit from answering a question with a family this finding was never judged as. Absent when the family is uncurated — the same distinction `assessed` draws, applied to the family rather than to the severity.","uniqueKey":"evidence.oneOf.2.assessed_family","typeLabel":"string"},"deprecation_horizon":{"type":"integer","description":"The calendar year a cited migration deadline falls on — 2030 for the CNSA 2.0 retirement of the classical asymmetric algorithms — and absent when no published document sets one. INFORMATIONAL, and NEVER a severity. It takes no part in reachability escalation and never moves `base_severity` or `severity`. A client MUST render it as the deadline it is and MUST NOT render it as an alarm, a risk level, or anything adjacent to the severity: RSA-2048 and P-256 are correctly `low` today and have a deadline, and a UI that folds the deadline into the severity is how a risk table starts crying wolf about cryptography that is currently fine.","uniqueKey":"evidence.oneOf.2.deprecation_horizon","typeLabel":"integer"},"unknown_reason":{"type":"string","description":"Why reachability is unknown. `traversal_truncated`: a depth limit cut every route before a root. `unresolved_dispatch`: every route to the finding crosses a call the producer linked by method name alone, so its call_chains show how the crypto MAY run, not that it does; each step's entry_resolution says which hops were guessed. `dependency_without_source`: no call chain reaches the finding, and every route through the dependency graph to its library crosses a dependency the producer parsed without source (types only), so the calls inside it could not be walked; dependency_provenance marks that step `without_source`.","enum":["unsupported_language","missing_anchor","traversal_truncated","analysis_failed","unresolved_dispatch","dependency_without_source"],"uniqueKey":"evidence.oneOf.2.unknown_reason","typeLabel":"enum\u003cstring>"},"implementation":{"type":"object","description":"What PROVIDES the crypto, as opposed to what the crypto is. It sits beside `purl` and `module` on the evidence rather than inside `asset` because \"Bouncy Castle\" is not a property of AES the way a cipher mode is. Absent on evidence written before this object existed.","properties":{"library":{"type":"string","description":"The providing library, e.g. `Bouncy Castle` or `JCA/JCE`.","uniqueKey":"evidence.oneOf.2.implementation.library","typeLabel":"string"},"api":{"type":"string","description":"The call surface the producer's rule matched.","uniqueKey":"evidence.oneOf.2.implementation.api","typeLabel":"string"},"provider":{"type":"string","description":"The runtime provider name, e.g. `BC`.","uniqueKey":"evidence.oneOf.2.implementation.provider","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.2.implementation","typeLabel":"object"},"resolved_params":{"type":"array","description":"Terminal crypto-call arguments, including static values where the producer resolved them. Absent on older evidence.","items":{"type":"object","required":["index","type","expression"],"properties":{"index":{"type":"integer","minimum":0,"isRequired":true,"uniqueKey":"evidence.oneOf.2.resolved_params.items.[INDEX].index","typeLabel":"integer"},"type":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.resolved_params.items.[INDEX].type","typeLabel":"string"},"expression":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.resolved_params.items.[INDEX].expression","typeLabel":"string"},"resolved_value":{"type":"string","description":"Statically resolved value; absent when analysis could not resolve it.","uniqueKey":"evidence.oneOf.2.resolved_params.items.[INDEX].resolved_value","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.2.resolved_params.items.[INDEX]","typeLabel":"object"},"uniqueKey":"evidence.oneOf.2.resolved_params","typeLabel":"object[]"},"call_chains":{"type":"array","maxItems":20,"description":"Retained root-to-crypto paths, capped at ingest to the shortest distinct ones. NOT required: absent means the caller asked for a summary view and the chains were not loaded, while an empty array means the producer found none. A required array cannot express that difference. Use call_chains_total to tell how many existed. maxItems binds evidence written since the cap; findings stored before it can still carry up to the producer's own 128 until their project is re-scanned, so a strict client should validate leniently rather than reject.","items":{"type":"object","required":["root","depth","complete","truncated","steps"],"properties":{"root":{"type":"object","required":["file","line","function"],"properties":{"file":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.file","typeLabel":"string"},"line":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.line","typeLabel":"integer"},"function":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.function","typeLabel":"string"},"signature":{"type":"string","description":"Canonical function signature retained from the callgraph producer.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.signature","typeLabel":"string"},"call_site_line":{"type":"integer","minimum":1,"description":"The invocation line within this frame: the call to the next frame, or the matched crypto invocation for the terminal frame. Absent on evidence written before call-site capture.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.call_site_line","typeLabel":"integer"},"argument_expression":{"type":"string","minLength":1,"description":"The producer-retained argument expression passed from this frame to the next frame. Absent on terminal frames, older evidence, or when the producer retained no renderable argument for the edge.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.argument_expression","typeLabel":"string"},"resolved_value":{"type":"string","minLength":1,"description":"The statically resolved value of argument_expression. Absent when the producer could not resolve the edge argument.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.resolved_value","typeLabel":"string"},"library":{"type":"object","required":["module"],"description":"The dependency a call-chain frame belongs to, as the scanner stamped it. Absent on first-party frames. `purl` is the identity; `module` and `version` are the ecosystem's own spelling.","properties":{"module":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.library.module","typeLabel":"string"},"version":{"type":"string","minLength":1,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.library.version","typeLabel":"string"},"purl":{"type":"string","minLength":1,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.library.purl","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.library","typeLabel":"object"},"entry_resolution":{"type":"string","minLength":1,"description":"How the producer resolved the call that arrives at this frame: `exact` when the callee is certain, or a dispatch kind (for example `interface_dispatch`) when the analysis could not narrow the receiver and considered every compatible implementation. A dispatch hop is indicative, not proven. The set of kinds is the producer's and may grow, so a client treats an unknown value as not exact. Absent on the first frame of a chain, on evidence from producers that do not report it, and on the frame after a truncation gap, whose caller is no longer shown.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.entry_resolution","typeLabel":"string"},"entry_declared_type":{"type":"string","minLength":1,"description":"The static type a dispatch hop was resolved over. Absent when entry_resolution is absent or exact.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root.entry_declared_type","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root","typeLabel":"object"},"depth":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].depth","typeLabel":"integer"},"complete":{"type":"boolean","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].complete","typeLabel":"boolean"},"truncated":{"type":"boolean","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].truncated","typeLabel":"boolean"},"steps":{"type":"array","maxItems":24,"description":"Frames from entry point to crypto call. Capped at ingest: a chain longer than this keeps both ends and drops from the middle, because a trace that loses its sink is wrong rather than short. The edge data on the frame before the gap (call_site_line, argument_expression) and on the frame after it (entry_resolution) is cleared, because it described a call between frames that are no longer adjacent. maxItems binds evidence written since the cap; rows stored before it can still exceed this until their project is re-scanned, so a strict client should validate leniently rather than reject. Such a chain reports truncated: true.","items":{"type":"object","required":["file","line","function"],"properties":{"file":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].file","typeLabel":"string"},"line":{"type":"integer","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].line","typeLabel":"integer"},"function":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].function","typeLabel":"string"},"signature":{"type":"string","description":"Canonical function signature retained from the callgraph producer.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].signature","typeLabel":"string"},"call_site_line":{"type":"integer","minimum":1,"description":"The invocation line within this frame: the call to the next frame, or the matched crypto invocation for the terminal frame. Absent on evidence written before call-site capture.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].call_site_line","typeLabel":"integer"},"argument_expression":{"type":"string","minLength":1,"description":"The producer-retained argument expression passed from this frame to the next frame. Absent on terminal frames, older evidence, or when the producer retained no renderable argument for the edge.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].argument_expression","typeLabel":"string"},"resolved_value":{"type":"string","minLength":1,"description":"The statically resolved value of argument_expression. Absent when the producer could not resolve the edge argument.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].resolved_value","typeLabel":"string"},"library":{"type":"object","required":["module"],"description":"The dependency a call-chain frame belongs to, as the scanner stamped it. Absent on first-party frames. `purl` is the identity; `module` and `version` are the ecosystem's own spelling.","properties":{"module":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].library.module","typeLabel":"string"},"version":{"type":"string","minLength":1,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].library.version","typeLabel":"string"},"purl":{"type":"string","minLength":1,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].library.purl","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].library","typeLabel":"object"},"entry_resolution":{"type":"string","minLength":1,"description":"How the producer resolved the call that arrives at this frame: `exact` when the callee is certain, or a dispatch kind (for example `interface_dispatch`) when the analysis could not narrow the receiver and considered every compatible implementation. A dispatch hop is indicative, not proven. The set of kinds is the producer's and may grow, so a client treats an unknown value as not exact. Absent on the first frame of a chain, on evidence from producers that do not report it, and on the frame after a truncation gap, whose caller is no longer shown.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].entry_resolution","typeLabel":"string"},"entry_declared_type":{"type":"string","minLength":1,"description":"The static type a dispatch hop was resolved over. Absent when entry_resolution is absent or exact.","uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX].entry_declared_type","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].steps","typeLabel":"object[]"},"root_kind":{"type":"string","description":"What the chain's first frame is. `main`: the program's main. `framework_entry`: a function a framework invokes (an override of a type outside the application, or a request-mapping, scheduling or listener annotation). `no_callers`: application code nothing in the application calls. `depth_limit`: a depth limit stopped the walk here, so the chain does not reach a real root. Absent when the producer does not report it (crypto-finder 0.32.0 and earlier).","enum":["main","framework_entry","no_callers","depth_limit"],"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].root_kind","typeLabel":"enum\u003cstring>"},"dependency_path":{"type":"array","description":"The libraries this chain passes through, in call order, from the first library the application calls into to the one holding the crypto call (app -> A -> B reads [A, B]). Derived from the frames' `library` on every read, never stored. Consecutive frames of one library count once; a route that leaves a library and returns lists it again. Empty for a first-party chain. On a truncated chain it covers the frames that were kept.","items":{"type":"object","required":["module"],"description":"The dependency a call-chain frame belongs to, as the scanner stamped it. Absent on first-party frames. `purl` is the identity; `module` and `version` are the ecosystem's own spelling.","properties":{"module":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].dependency_path.items.[INDEX].module","typeLabel":"string"},"version":{"type":"string","minLength":1,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].dependency_path.items.[INDEX].version","typeLabel":"string"},"purl":{"type":"string","minLength":1,"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].dependency_path.items.[INDEX].purl","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].dependency_path.items.[INDEX]","typeLabel":"object"},"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX].dependency_path","typeLabel":"object[]"}},"uniqueKey":"evidence.oneOf.2.call_chains.items.[INDEX]","typeLabel":"object"},"uniqueKey":"evidence.oneOf.2.call_chains","typeLabel":"object[]"},"call_chains_total":{"type":"integer","description":"How many call chains the producer reported, before the ingest cap. Absent on evidence written before the cap existed, which readers MUST treat as unknown rather than as zero.","uniqueKey":"evidence.oneOf.2.call_chains_total","typeLabel":"integer"},"call_chains_truncated":{"type":"boolean","description":"True when fewer chains are stored than the producer reported. Consumers rendering a trace MUST say so rather than present the retained paths as the whole story.","uniqueKey":"evidence.oneOf.2.call_chains_truncated","typeLabel":"boolean"},"call_chain_steps_dropped":{"type":"integer","description":"Total frames removed across all stored chains by the per-chain step cap.","uniqueKey":"evidence.oneOf.2.call_chain_steps_dropped","typeLabel":"integer"},"call_paths_total":{"type":"integer","format":"int64","description":"How many distinct routes, from a chain root to the finding, the producer's call graph holds. A route is a function sequence, so chains that differ only in a call-site line count once. Unlike call_chains_total it counts routes the producer never exported, so it is the number to compare the shown chains against. Saturates at the largest int64 and is then a lower bound. Absent when the producer does not report it (crypto-finder 0.32.0 and earlier) or the finding has no route.","uniqueKey":"evidence.oneOf.2.call_paths_total","typeLabel":"integer\u003cint64>"},"call_paths_kept":{"type":"integer","format":"int64","description":"How many of call_paths_total the producer exported as chains, before the ingest cap. Absent exactly when call_paths_total is.","uniqueKey":"evidence.oneOf.2.call_paths_kept","typeLabel":"integer\u003cint64>"},"route_evidence":{"type":"string","description":"How strongly the producer resolved the finding's best route, the one its verdict rests on. `direct`: every call on it is statically resolved. `dispatch`: it needs at least one interface or runtime dispatch hop but no call matched by method name alone; the finding still reads reachable, and each step's entry_resolution marks the dispatch hop. `name_only`: every route crosses a call matched by method name alone, so reachability is `unknown` with reason `unresolved_dispatch`. Absent when the producer does not report it (crypto-finder 0.32.0 and earlier), and on a dependency finding proven only by a dependency's cached entry index.","enum":["direct","dispatch","name_only"],"uniqueKey":"evidence.oneOf.2.route_evidence","typeLabel":"enum\u003cstring>"},"no_callers_only":{"type":"boolean","description":"True when every route to the finding starts at application code nothing in the application calls (chain root_kind `no_callers`). The finding reads reachable, on weaker evidence: whether that code ever runs is not established. Absent when false, and when the producer does not report it.","uniqueKey":"evidence.oneOf.2.no_callers_only","typeLabel":"boolean"},"dependency_provenance":{"type":"object","description":"How the scanned application depends on the library holding a dependency finding, from the producer's resolved dependency graph. Present only on dependency-sourced evidence, and absent when the producer does not report it (crypto-finder 0.32.0 and earlier). This is the DECLARED path, not a call path. A call chain's dependency_path follows calls and can cross libraries the declarations do not (app -> tika-core -> tika-parsers -> bcprov by calls, app -> tika-parsers -> bcprov by declarations); the two answer different questions and are both served.","properties":{"relationship":{"type":"string","description":"`direct`: the application declares the library itself. `transitive`: it arrives through another dependency. Absent when the producer gave a value outside this set.","enum":["direct","transitive"],"uniqueKey":"evidence.oneOf.2.dependency_provenance.relationship","typeLabel":"enum\u003cstring>"},"path":{"type":"array","description":"The shortest path through the dependency graph, from the library the application declares to the one holding the finding, app excluded (app -> A -> B reads [A, B]; a direct dependency reads [B]). Absent when the producer gave none, or a step that names no library.","items":{"type":"object","required":["module"],"description":"One library on a declared dependency path. `purl` is the identity; `module` and `version` are the ecosystem's own spelling, and `module` is empty only when the producer gave a purl alone.","properties":{"module":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.2.dependency_provenance.path.items.[INDEX].module","typeLabel":"string"},"version":{"type":"string","minLength":1,"uniqueKey":"evidence.oneOf.2.dependency_provenance.path.items.[INDEX].version","typeLabel":"string"},"purl":{"type":"string","minLength":1,"uniqueKey":"evidence.oneOf.2.dependency_provenance.path.items.[INDEX].purl","typeLabel":"string"},"without_source":{"type":"boolean","description":"True when the producer parsed this library without source (types only), so it holds no call edges of its own and a route through it cannot be walked. Absent when false.","uniqueKey":"evidence.oneOf.2.dependency_provenance.path.items.[INDEX].without_source","typeLabel":"boolean"}},"uniqueKey":"evidence.oneOf.2.dependency_provenance.path.items.[INDEX]","typeLabel":"object"},"uniqueKey":"evidence.oneOf.2.dependency_provenance.path","typeLabel":"object[]"}},"uniqueKey":"evidence.oneOf.2.dependency_provenance","typeLabel":"object"}},"isRequired":true,"uniqueKey":"evidence.oneOf.2","typeLabel":"object"},{"type":"object","description":"A model file's identification outcome. `status` selects the shape of `detail`: identified carries ModelIdentifiedDetail, unidentified ModelUnidentifiedDetail, too_large ModelTooLargeDetail, lfs_pointer ModelLFSPointerDetail and matching_unavailable ModelMatchingUnavailableDetail. The server never emits any other pairing.","required":["kind","location","status","detail","sha256"],"properties":{"kind":{"type":"string","enum":["metadata-card"],"isRequired":true,"uniqueKey":"evidence.oneOf.3.kind","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"The model file, or the shard index manifest for a sharded snapshot.","required":["path"],"properties":{"path":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.3.location.path","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.3.location","typeLabel":"object"},"status":{"type":"string","enum":["identified","unidentified","too_large","lfs_pointer","matching_unavailable"],"isRequired":true,"uniqueKey":"evidence.oneOf.3.status","typeLabel":"enum\u003cstring>"},"detail":{"oneOf":[{"type":"object","required":["purl","matched_via"],"properties":{"purl":{"type":"string","description":"Typically pkg:huggingface/\u003corg>/\u003cname>.","isRequired":true,"uniqueKey":"evidence.oneOf.3.detail.oneOf.0.purl","typeLabel":"string"},"matched_via":{"type":"string","enum":["sha256","md5","header_sha256","manifest_sha256","tlsh","filename","composite"],"description":"filename means a match by file name alone, with no other signal.","isRequired":true,"uniqueKey":"evidence.oneOf.3.detail.oneOf.0.matched_via","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Derived from purl when the producer left it empty.","uniqueKey":"evidence.oneOf.3.detail.oneOf.0.name","typeLabel":"string"},"matched_signals":{"type":"array","description":"Populated only when matched_via is composite.","items":{"type":"string","uniqueKey":"evidence.oneOf.3.detail.oneOf.0.matched_signals.items.[INDEX]","typeLabel":"string"},"uniqueKey":"evidence.oneOf.3.detail.oneOf.0.matched_signals","typeLabel":"string[]"},"confidence_band":{"type":"string","enum":["high","medium","low"],"description":"The server's own band, shown as text and never turned into a percentage. Absent for an offline guess.","uniqueKey":"evidence.oneOf.3.detail.oneOf.0.confidence_band","typeLabel":"enum\u003cstring>"},"near_ties":{"type":"array","items":{"type":"object","description":"A candidate the matcher could not separate from the winner. purl is absent when the candidate itself has none.","required":["sha256","relation"],"properties":{"sha256":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.3.detail.oneOf.0.near_ties.items.[INDEX].sha256","typeLabel":"string"},"relation":{"type":"string","enum":["near_tie","score_tie","weight_identical"],"isRequired":true,"uniqueKey":"evidence.oneOf.3.detail.oneOf.0.near_ties.items.[INDEX].relation","typeLabel":"enum\u003cstring>"},"purl":{"type":"string","uniqueKey":"evidence.oneOf.3.detail.oneOf.0.near_ties.items.[INDEX].purl","typeLabel":"string"}},"uniqueKey":"evidence.oneOf.3.detail.oneOf.0.near_ties.items.[INDEX]","typeLabel":"object"},"uniqueKey":"evidence.oneOf.3.detail.oneOf.0.near_ties","typeLabel":"object[]"},"near_tie_resolution":{"type":"string","enum":["elected","kept"],"uniqueKey":"evidence.oneOf.3.detail.oneOf.0.near_tie_resolution","typeLabel":"enum\u003cstring>"},"bundle_manifest_version":{"type":"string","description":"Present only for a server match. Its absence is the only proof the offline fallback answered instead.","uniqueKey":"evidence.oneOf.3.detail.oneOf.0.bundle_manifest_version","typeLabel":"string"},"matcher_version":{"type":"string","uniqueKey":"evidence.oneOf.3.detail.oneOf.0.matcher_version","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.3.detail.oneOf.0","typeLabel":"object"},{"type":"object","properties":{"candidate_purls":{"type":"array","items":{"type":"string","uniqueKey":"evidence.oneOf.3.detail.oneOf.1.candidate_purls.items.[INDEX]","typeLabel":"string"},"uniqueKey":"evidence.oneOf.3.detail.oneOf.1.candidate_purls","typeLabel":"string[]"},"error":{"type":"string","description":"The tool's own error text (ai-finder-pro misses[].error).","uniqueKey":"evidence.oneOf.3.detail.oneOf.1.error","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.3.detail.oneOf.1","typeLabel":"object"},{"type":"object","required":["cap_mb"],"properties":{"cap_mb":{"type":"integer","description":"The limit the model's own size_bytes was measured against.","isRequired":true,"uniqueKey":"evidence.oneOf.3.detail.oneOf.2.cap_mb","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"evidence.oneOf.3.detail.oneOf.2","typeLabel":"object"},{"type":"object","description":"Set only when the pointer text parsed.","properties":{"pointer_oid":{"type":"string","uniqueKey":"evidence.oneOf.3.detail.oneOf.3.pointer_oid","typeLabel":"string"},"pointer_size":{"type":"integer","format":"int64","uniqueKey":"evidence.oneOf.3.detail.oneOf.3.pointer_size","typeLabel":"integer\u003cint64>"}},"isRequired":true,"uniqueKey":"evidence.oneOf.3.detail.oneOf.3","typeLabel":"object"},{"type":"object","required":["reason"],"properties":{"reason":{"type":"string","enum":["no_key","offline","auth","rate_limited"],"isRequired":true,"uniqueKey":"evidence.oneOf.3.detail.oneOf.4.reason","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"evidence.oneOf.3.detail.oneOf.4","typeLabel":"object"}],"isRequired":true,"uniqueKey":"evidence.oneOf.3.detail","typeLabel":"object"},"sha256":{"type":"string","description":"Content identity of the model file, synthesized for a sharded snapshot's index manifest.","isRequired":true,"uniqueKey":"evidence.oneOf.3.sha256","typeLabel":"string"},"size_bytes":{"type":"integer","format":"int64","uniqueKey":"evidence.oneOf.3.size_bytes","typeLabel":"integer\u003cint64>"},"fingerprint_version":{"type":"string","uniqueKey":"evidence.oneOf.3.fingerprint_version","typeLabel":"string"},"shards":{"type":"array","description":"Set only for a sharded snapshot.","items":{"type":"object","description":"One file of a sharded snapshot, named by the index manifest ModelLocation.path points at.","required":["filename","sha256","size_bytes"],"properties":{"filename":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.3.shards.items.[INDEX].filename","typeLabel":"string"},"sha256":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.3.shards.items.[INDEX].sha256","typeLabel":"string"},"size_bytes":{"type":"integer","format":"int64","isRequired":true,"uniqueKey":"evidence.oneOf.3.shards.items.[INDEX].size_bytes","typeLabel":"integer\u003cint64>"}},"uniqueKey":"evidence.oneOf.3.shards.items.[INDEX]","typeLabel":"object"},"uniqueKey":"evidence.oneOf.3.shards","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"evidence.oneOf.3","typeLabel":"object"},{"type":"object","required":["kind","purl","declarations"],"properties":{"kind":{"type":"string","enum":["dependency"],"isRequired":true,"uniqueKey":"evidence.oneOf.4.kind","typeLabel":"enum\u003cstring>"},"purl":{"type":"string","description":"purl@version for a resolved pin, or the base purl (no @version) when the declaration is an unresolved range/constraint.","isRequired":true,"uniqueKey":"evidence.oneOf.4.purl","typeLabel":"string"},"declarations":{"type":"array","items":{"type":"object","description":"One manifest declaration of a dependency. Multiple declarations for the same purl@version (e.g. declared in several manifests) are aggregated into DependencyEvidence.declarations rather than emitting several findings.","required":["manifest_path","line"],"properties":{"manifest_path":{"type":"string","description":"Path of the manifest file the declaration was found in.","isRequired":true,"uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX].manifest_path","typeLabel":"string"},"line":{"type":"integer","description":"1-based line number of the declaration within the manifest. 0 is a first-class sentinel meaning the parser could not map this declaration to a specific line — it MUST NOT be treated as an error and consumers MUST degrade gracefully.","isRequired":true,"uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX].line","typeLabel":"integer"},"declared_text":{"oneOf":[{"type":"string","description":"The raw declaration text as extracted from the manifest.","uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX].declared_text.oneOf.0","typeLabel":"string"},{"type":"null","description":"The raw declaration text as extracted from the manifest.","uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX].declared_text.oneOf.1","typeLabel":"null"}],"uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX].declared_text","typeLabel":"string | null"},"scope":{"oneOf":[{"type":"string","description":"Runtime classification as reported by the manifest parser (e.g. \"dev\", \"test\", \"optional\", or the default/production scope). This is metadata, not graph depth.","uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX].scope.oneOf.0","typeLabel":"string"},{"type":"null","description":"Runtime classification as reported by the manifest parser (e.g. \"dev\", \"test\", \"optional\", or the default/production scope). This is metadata, not graph depth.","uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX].scope.oneOf.1","typeLabel":"null"}],"uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX].scope","typeLabel":"string | null"},"requirement":{"oneOf":[{"type":"string","description":"The raw declared version constraint (e.g. \"^1.2.0\", \"v1.62.0\"). Preserved even when the finding's identity collapses to a version-less base purl for unresolved ranges.","uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX].requirement.oneOf.0","typeLabel":"string"},{"type":"null","description":"The raw declared version constraint (e.g. \"^1.2.0\", \"v1.62.0\"). Preserved even when the finding's identity collapses to a version-less base purl for unresolved ranges.","uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX].requirement.oneOf.1","typeLabel":"null"}],"uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX].requirement","typeLabel":"string | null"}},"uniqueKey":"evidence.oneOf.4.declarations.items.[INDEX]","typeLabel":"object"},"description":"All manifest declarations aggregated for this finding.","isRequired":true,"uniqueKey":"evidence.oneOf.4.declarations","typeLabel":"object[]"}},"isRequired":true,"uniqueKey":"evidence.oneOf.4","typeLabel":"object"},{"type":"object","description":"An AI usage detected in source code or a manifest. It marks one line of one file. `detection_type` selects the shape of `detail`: sdk_usage carries AISDKUsageDetail, manifest_dep AIManifestDepDetail, agent AIAgentDetail, tool AIToolDetail, embedding AIEmbeddingDetail, vector_store AIVectorStoreDetail and dataset AIDatasetDetail. The server never emits any other pairing.","required":["kind","location","detection_type","detail","confidence"],"properties":{"kind":{"type":"string","enum":["ai-usage"],"isRequired":true,"uniqueKey":"evidence.oneOf.5.kind","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"The one line an AI usage marks.","required":["path"],"properties":{"path":{"type":"string","description":"File path relative to the scanned tree.","isRequired":true,"uniqueKey":"evidence.oneOf.5.location.path","typeLabel":"string"},"line":{"type":"integer","minimum":1,"description":"1-based line. Absent when the producer could not place the detection on a line, which it does for some manifest formats (package.json).","uniqueKey":"evidence.oneOf.5.location.line","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"evidence.oneOf.5.location","typeLabel":"object"},"detection_type":{"type":"string","enum":["sdk_usage","manifest_dep","agent","tool","embedding","vector_store","dataset"],"isRequired":true,"uniqueKey":"evidence.oneOf.5.detection_type","typeLabel":"enum\u003cstring>"},"detail":{"oneOf":[{"type":"object","required":["sdk","import_statement"],"properties":{"sdk":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.0.sdk","typeLabel":"string"},"import_statement":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.0.import_statement","typeLabel":"string"},"version":{"type":"string","uniqueKey":"evidence.oneOf.5.detail.oneOf.0.version","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.0","typeLabel":"object"},{"type":"object","required":["name","version","manifest_file"],"properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.1.name","typeLabel":"string"},"version":{"type":"string","description":"The declared version or constraint, verbatim. May be empty.","isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.1.version","typeLabel":"string"},"manifest_file":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.1.manifest_file","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.1","typeLabel":"object"},{"type":"object","required":["framework"],"properties":{"framework":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.2.framework","typeLabel":"string"},"agent_type":{"type":"string","uniqueKey":"evidence.oneOf.5.detail.oneOf.2.agent_type","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.2","typeLabel":"object"},{"type":"object","required":["name"],"properties":{"name":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.3.name","typeLabel":"string"},"description":{"type":"string","uniqueKey":"evidence.oneOf.5.detail.oneOf.3.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.3","typeLabel":"object"},{"type":"object","required":["provider"],"properties":{"provider":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.4.provider","typeLabel":"string"},"model":{"type":"string","uniqueKey":"evidence.oneOf.5.detail.oneOf.4.model","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.4","typeLabel":"object"},{"type":"object","required":["provider"],"properties":{"provider":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.5.provider","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.5","typeLabel":"object"},{"type":"object","required":["source"],"properties":{"source":{"type":"string","isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.6.source","typeLabel":"string"},"name":{"type":"string","uniqueKey":"evidence.oneOf.5.detail.oneOf.6.name","typeLabel":"string"},"split":{"type":"string","uniqueKey":"evidence.oneOf.5.detail.oneOf.6.split","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.5.detail.oneOf.6","typeLabel":"object"}],"isRequired":true,"uniqueKey":"evidence.oneOf.5.detail","typeLabel":"object"},"confidence":{"type":"number","format":"double","minimum":0,"maximum":1,"isRequired":true,"uniqueKey":"evidence.oneOf.5.confidence","typeLabel":"number\u003cdouble>"},"line_text":{"type":"string","description":"The source line as the producer read it, truncated to 500 characters. Absent when the producer could not read the line.","uniqueKey":"evidence.oneOf.5.line_text","typeLabel":"string"}},"isRequired":true,"uniqueKey":"evidence.oneOf.5","typeLabel":"object"}],"isRequired":true,"uniqueKey":"evidence","typeLabel":"object"},"produced_by":{"type":"object","required":["kind","id"],"properties":{"kind":{"type":"string","enum":["user","apikey","worker","agent"],"isRequired":true,"uniqueKey":"produced_by.kind","typeLabel":"enum\u003cstring>"},"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"produced_by.id","typeLabel":"string\u003cuuid>"}},"isRequired":true,"uniqueKey":"produced_by","typeLabel":"object"},"state":{"type":"string","enum":["open","assigned","resolved","superseded_by_rule","reopened"],"isRequired":true,"uniqueKey":"state","typeLabel":"enum\u003cstring>"},"domain":{"type":"string","enum":["oss","crypto","ai","deps","provenance"],"isRequired":true,"uniqueKey":"domain","typeLabel":"enum\u003cstring>"},"severity":{"type":"string","enum":["critical","high","medium","low","info","none"],"isRequired":true,"uniqueKey":"severity","typeLabel":"enum\u003cstring>"},"suppressed":{"type":"boolean","isRequired":true,"uniqueKey":"suppressed","typeLabel":"boolean"},"version":{"type":"integer","format":"int32","isRequired":true,"uniqueKey":"version","typeLabel":"integer\u003cint32>"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"updated_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"updated_at","typeLabel":"string\u003cdate-time>"},"purpose":{"oneOf":[{"type":"string","description":"Per-finding crypto purpose. Present for crypto findings and null for other finding domains.","enum":["confidentiality","excluded","support","unknown"],"isRequired":true,"uniqueKey":"purpose.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","isRequired":true,"uniqueKey":"purpose.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"purpose","typeLabel":"enum\u003cstring> | null"},"export_signals":{"type":"array","items":{"type":"object","required":["regime","regime_version","test","state","vintage"],"properties":{"regime":{"type":"string","description":"Export-control regime identifier (for example, ear).","isRequired":true,"uniqueKey":"export_signals.items.[INDEX].regime","typeLabel":"string"},"regime_version":{"type":"string","description":"Version of the cited regime dataset.","isRequired":true,"uniqueKey":"export_signals.items.[INDEX].regime_version","typeLabel":"string"},"vintage":{"type":"string","enum":["current","retired"],"description":"Whether the signal was computed under the regime version Earnie ships today (`current`) or under a superseded one (`retired`). Derived on read by comparing the row's `regime_version` against the shipped version, never stored: a stored flag would keep reading `current` after the version moved. A `retired` signal is still evidence and is still returned, but it is never a fact about the current regime — re-scan the project to refresh it.","isRequired":true,"uniqueKey":"export_signals.items.[INDEX].vintage","typeLabel":"enum\u003cstring>"},"test":{"type":"string","description":"Stable regime test identifier. New TN 2.c evidence uses `ear.tn2c_described_algorithm`. `ear.pqc_present` is a deprecated one-release alias retained only for evidence written before the rename; producers must not emit it for new evidence.","isRequired":true,"uniqueKey":"export_signals.items.[INDEX].test","typeLabel":"string"},"state":{"type":"string","enum":["met","not_met","unknown","not_evaluated"],"description":"Result of one export-control test. `unknown` means occurrence evidence exists but cannot decide the test at occurrence scope; `not_evaluated` means the occurrence carries no evidence applicable to that test.","isRequired":true,"uniqueKey":"export_signals.items.[INDEX].state","typeLabel":"enum\u003cstring>"},"provenance_ref":{"oneOf":[{"type":"string","description":"Citation or other typed dataset reference for the signal.","uniqueKey":"export_signals.items.[INDEX].provenance_ref.oneOf.0","typeLabel":"string"},{"type":"null","description":"Citation or other typed dataset reference for the signal.","uniqueKey":"export_signals.items.[INDEX].provenance_ref.oneOf.1","typeLabel":"null"}],"uniqueKey":"export_signals.items.[INDEX].provenance_ref","typeLabel":"string | null"}},"uniqueKey":"export_signals.items.[INDEX]","typeLabel":"object"},"description":"Per-finding Export Signals for the current regime, current-vintage rows first. Rows computed under a superseded regime version are still returned, marked `vintage: retired`; they are never dropped, because a regime bump would otherwise empty this array for every project that has not re-scanned. Other finding domains return an empty array.","isRequired":true,"uniqueKey":"export_signals","typeLabel":"object[]"},"location":{"oneOf":[{"type":"object","properties":{"purl":{"oneOf":[{"type":"string","uniqueKey":"location.oneOf.0.purl.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"location.oneOf.0.purl.oneOf.1","typeLabel":"null"}],"uniqueKey":"location.oneOf.0.purl","typeLabel":"string | null"},"path":{"oneOf":[{"type":"string","uniqueKey":"location.oneOf.0.path.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"location.oneOf.0.path.oneOf.1","typeLabel":"null"}],"uniqueKey":"location.oneOf.0.path","typeLabel":"string | null"},"line":{"oneOf":[{"type":"integer","format":"int32","uniqueKey":"location.oneOf.0.line.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","format":"int32","uniqueKey":"location.oneOf.0.line.oneOf.1","typeLabel":"null"}],"uniqueKey":"location.oneOf.0.line","typeLabel":"integer\u003cint32> | null"},"end_line":{"oneOf":[{"type":"integer","format":"int32","uniqueKey":"location.oneOf.0.end_line.oneOf.0","typeLabel":"integer\u003cint32>"},{"type":"null","format":"int32","uniqueKey":"location.oneOf.0.end_line.oneOf.1","typeLabel":"null"}],"uniqueKey":"location.oneOf.0.end_line","typeLabel":"integer\u003cint32> | null"}},"uniqueKey":"location.oneOf.0","typeLabel":"object"},{"type":"null","properties":{"purl":{"oneOf":[{"type":"string"},{"type":"null"}]},"path":{"oneOf":[{"type":"string"},{"type":"null"}]},"line":{"oneOf":[{"type":"integer","format":"int32"},{"type":"null","format":"int32"}]},"end_line":{"oneOf":[{"type":"integer","format":"int32"},{"type":"null","format":"int32"}]}},"uniqueKey":"location.oneOf.1","typeLabel":"null"}],"uniqueKey":"location","typeLabel":"object | null"},"producer_kind":{"oneOf":[{"type":"string","description":"Which producer last observed this finding.","enum":["repo","upload","pr_ci","agent"],"uniqueKey":"producer_kind.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","description":"Which producer last observed this finding.","enum":["repo","upload","pr_ci","agent"],"uniqueKey":"producer_kind.oneOf.1","typeLabel":"null"}],"uniqueKey":"producer_kind","typeLabel":"enum\u003cstring> | null"},"producer_ref":{"oneOf":[{"type":"string","description":"Human-readable provenance reference (e.g. Null when not set.","uniqueKey":"producer_ref.oneOf.0","typeLabel":"string"},{"type":"null","description":"Human-readable provenance reference (e.g. Null when not set.","uniqueKey":"producer_ref.oneOf.1","typeLabel":"null"}],"uniqueKey":"producer_ref","typeLabel":"string | null"},"previous_severity":{"oneOf":[{"type":"string","enum":["critical","high","medium","low","info","none"],"description":"The severity this finding carried before the most recent re-scan changed it. `severity` is recomputed and overwritten on every re-scan, so without this the previous value is simply gone. Null means no re-scan has ever moved this finding's severity — it is not \"unknown\", and it must not be read as \"was previously none\".","uniqueKey":"previous_severity.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["critical","high","medium","low","info","none"],"description":"The severity this finding carried before the most recent re-scan changed it. `severity` is recomputed and overwritten on every re-scan, so without this the previous value is simply gone. Null means no re-scan has ever moved this finding's severity — it is not \"unknown\", and it must not be read as \"was previously none\".","uniqueKey":"previous_severity.oneOf.1","typeLabel":"null"}],"uniqueKey":"previous_severity","typeLabel":"enum\u003cstring> | null"},"previous_severity_scan_run_id":{"oneOf":[{"type":"string","format":"uuid","description":"The scan run this finding was last observed at while it still carried `previous_severity`, so a client can state the whole fact — \"was critical at scan \u003cid>\" — instead of an unattributable claim. Null when no transition has been recorded, and also when the earlier observation predates scan-run tracking: a set `previous_severity` with a null scan run is a real transition whose scan cannot be named.","uniqueKey":"previous_severity_scan_run_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","description":"The scan run this finding was last observed at while it still carried `previous_severity`, so a client can state the whole fact — \"was critical at scan \u003cid>\" — instead of an unattributable claim. Null when no transition has been recorded, and also when the earlier observation predates scan-run tracking: a set `previous_severity` with a null scan run is a real transition whose scan cannot be named.","uniqueKey":"previous_severity_scan_run_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"previous_severity_scan_run_id","typeLabel":"string\u003cuuid> | null"},"severity_change_reason":{"oneOf":[{"type":"string","description":"Which direction the recorded transition went, and the only field that distinguishes a downgrade from a raise. Null when no transition has been recorded.","enum":["rescan_lowered","rescan_raised"],"uniqueKey":"severity_change_reason.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","uniqueKey":"severity_change_reason.oneOf.1","typeLabel":"null"}],"uniqueKey":"severity_change_reason","typeLabel":"enum\u003cstring> | null"},"enrichments":{"type":"object","description":"Canonical PURL-keyed enrichments attached at read time.","properties":{"component":{"type":"object","description":"Release and lifecycle metadata for the matched component version.","properties":{"release_date":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"enrichments.component.release_date.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"enrichments.component.release_date.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.component.release_date","typeLabel":"string\u003cdate-time> | null"},"latest_release_date":{"oneOf":[{"type":"string","format":"date-time","uniqueKey":"enrichments.component.latest_release_date.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","uniqueKey":"enrichments.component.latest_release_date.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.component.latest_release_date","typeLabel":"string\u003cdate-time> | null"},"age_days":{"oneOf":[{"type":"integer","minimum":0,"uniqueKey":"enrichments.component.age_days.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"uniqueKey":"enrichments.component.age_days.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.component.age_days","typeLabel":"integer | null"},"versions_behind":{"oneOf":[{"type":"integer","minimum":0,"uniqueKey":"enrichments.component.versions_behind.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"uniqueKey":"enrichments.component.versions_behind.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.component.versions_behind","typeLabel":"integer | null"},"status":{"oneOf":[{"type":"string","uniqueKey":"enrichments.component.status.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.component.status.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.component.status","typeLabel":"string | null"}},"uniqueKey":"enrichments.component","typeLabel":"object"},"license":{"type":"object","description":"License data sourced from scan-time scanoss-go match data.","properties":{"spdx_id":{"oneOf":[{"type":"string","description":"SPDX license identifier (e.g. \"MIT\", \"Apache-2.0\").","uniqueKey":"enrichments.license.spdx_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"SPDX license identifier (e.g. \"MIT\", \"Apache-2.0\").","uniqueKey":"enrichments.license.spdx_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.license.spdx_id","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","description":"Human-readable license name.","uniqueKey":"enrichments.license.name.oneOf.0","typeLabel":"string"},{"type":"null","description":"Human-readable license name.","uniqueKey":"enrichments.license.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.license.name","typeLabel":"string | null"},"url":{"oneOf":[{"type":"string","description":"License text URL.","uniqueKey":"enrichments.license.url.oneOf.0","typeLabel":"string"},{"type":"null","description":"License text URL.","uniqueKey":"enrichments.license.url.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.license.url","typeLabel":"string | null"},"copyleft":{"oneOf":[{"type":"boolean","description":"True if the license has copyleft obligations.","uniqueKey":"enrichments.license.copyleft.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"True if the license has copyleft obligations.","uniqueKey":"enrichments.license.copyleft.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.license.copyleft","typeLabel":"boolean | null"},"category":{"type":"string","enum":["permissive","copyleft-weak","copyleft-strong","proprietary","public-domain","unknown"],"description":"License risk category derived from a curated SPDX-to-category map (ScanCode LicenseDB, CC-BY-4.0). Always populated (\"unknown\" fallback), optional in the contract for backward compatibility.","uniqueKey":"enrichments.license.category","typeLabel":"enum\u003cstring>"},"dual_licensed":{"oneOf":[{"type":"boolean","description":"True when the upstream license statement contains multiple alternatives.","uniqueKey":"enrichments.license.dual_licensed.oneOf.0","typeLabel":"boolean"},{"type":"null","description":"True when the upstream license statement contains multiple alternatives.","uniqueKey":"enrichments.license.dual_licensed.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.license.dual_licensed","typeLabel":"boolean | null"},"source":{"type":"string","description":"Source of the license data (e.g. \"scanoss-go\", \"mock\").","uniqueKey":"enrichments.license.source","typeLabel":"string"}},"uniqueKey":"enrichments.license","typeLabel":"object"},"vulnerabilities":{"type":"array","items":{"type":"object","description":"Vulnerability entry from scanoss.api v3. fixed_versions contains only explicit upstream fix boundaries; Earnie never infers one.","required":["fixed_versions","cwe","kev","known_ransomware"],"properties":{"kev":{"type":"boolean","description":"True when the CVE is in the CISA Known Exploited Vulnerabilities catalog.","isRequired":true,"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].kev","typeLabel":"boolean"},"known_ransomware":{"type":"boolean","description":"True when CISA associates the CVE with known ransomware campaign use.","isRequired":true,"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].known_ransomware","typeLabel":"boolean"},"fixed_versions":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].fixed_versions.items.[INDEX]","typeLabel":"string"},"description":"Deterministic, naturally sorted explicit fix versions reported by scanoss.api. Always present; empty when no authoritative fix is available.","isRequired":true,"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].fixed_versions","typeLabel":"string[]"},"cwe":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].cwe.items.[INDEX]","typeLabel":"string"},"description":"CWE identifiers this vulnerability is classified under, in canonical `CWE-\u003cn>` form. A vulnerability may carry several weaknesses, so this is a list, never a scalar. Always present, empty when the producer classified nothing. Do not build a consumer that assumes values.","isRequired":true,"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].cwe","typeLabel":"string[]"},"cve_id":{"oneOf":[{"type":"string","description":"CVE identifier (e.g. \"CVE-2021-44228\").","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].cve_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"CVE identifier (e.g. \"CVE-2021-44228\").","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].cve_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].cve_id","typeLabel":"string | null"},"cvss_score":{"oneOf":[{"type":"number","description":"CVSS base score 0.0–10.0.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].cvss_score.oneOf.0","typeLabel":"number"},{"type":"null","description":"CVSS base score 0.0–10.0.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].cvss_score.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].cvss_score","typeLabel":"number | null"},"cvss_vector":{"oneOf":[{"type":"string","description":"CVSS vector string.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].cvss_vector.oneOf.0","typeLabel":"string"},{"type":"null","description":"CVSS vector string.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].cvss_vector.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].cvss_vector","typeLabel":"string | null"},"epss_score":{"oneOf":[{"type":"number","description":"EPSS probability 0.0–1.0.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].epss_score.oneOf.0","typeLabel":"number"},{"type":"null","description":"EPSS probability 0.0–1.0.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].epss_score.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].epss_score","typeLabel":"number | null"},"epss_percentile":{"oneOf":[{"type":"number","description":"EPSS percentile 0.0–100.0.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].epss_percentile.oneOf.0","typeLabel":"number"},{"type":"null","description":"EPSS percentile 0.0–100.0.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].epss_percentile.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].epss_percentile","typeLabel":"number | null"},"severity":{"oneOf":[{"type":"string","enum":["critical","high","medium","low","none"],"description":"Vulnerability severity level.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].severity.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","enum":["critical","high","medium","low","none"],"description":"Vulnerability severity level.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].severity.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].severity","typeLabel":"enum\u003cstring> | null"},"source":{"type":"string","description":"Data source identifier. Names every source that reported the CVE when there are several, sorted and comma-joined (\"NVD, OSV\").","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].source","typeLabel":"string"},"published":{"oneOf":[{"type":"string","format":"date-time","description":"Advisory publication timestamp.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].published.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Advisory publication timestamp.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].published.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].published","typeLabel":"string\u003cdate-time> | null"},"modified":{"oneOf":[{"type":"string","format":"date-time","description":"Advisory last-modified timestamp.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].modified.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"Advisory last-modified timestamp.","uniqueKey":"enrichments.vulnerabilities.items.[INDEX].modified.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.vulnerabilities.items.[INDEX].modified","typeLabel":"string\u003cdate-time> | null"}},"uniqueKey":"enrichments.vulnerabilities.items.[INDEX]","typeLabel":"object"},"description":"Array of vulnerability entries. Empty array means no known CVEs; omitted means not yet resolved.","uniqueKey":"enrichments.vulnerabilities","typeLabel":"object[]"},"geoprovenance":{"oneOf":[{"type":"object","description":"Stored geoprovenance data for this component. Null means no data is available. Geoprovenance is not a public optional scan enrichment.","required":["countries","locations"],"properties":{"countries":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.geoprovenance.oneOf.0.countries.items.[INDEX]","typeLabel":"string"},"description":"ISO-3166 alpha-2 country codes inferred from the component's origin data. May be an empty array if the upstream geoprovenance API does not return country-level data for this component.","isRequired":true,"uniqueKey":"enrichments.geoprovenance.oneOf.0.countries","typeLabel":"string[]"},"locations":{"type":"array","items":{"type":"object","required":["country","percentage"],"properties":{"country":{"type":"string","isRequired":true,"uniqueKey":"enrichments.geoprovenance.oneOf.0.locations.items.[INDEX].country","typeLabel":"string"},"percentage":{"type":"number","format":"double","isRequired":true,"uniqueKey":"enrichments.geoprovenance.oneOf.0.locations.items.[INDEX].percentage","typeLabel":"number\u003cdouble>"}},"uniqueKey":"enrichments.geoprovenance.oneOf.0.locations.items.[INDEX]","typeLabel":"object"},"description":"Weighted country-of-origin values returned by SCANOSS.","isRequired":true,"uniqueKey":"enrichments.geoprovenance.oneOf.0.locations","typeLabel":"object[]"}},"uniqueKey":"enrichments.geoprovenance.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"enrichments.geoprovenance.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.geoprovenance","typeLabel":"object | null"},"model":{"oneOf":[{"type":"object","description":"ai-identity-api layer for an identified-model finding, resolved by the exact (purl, manifest_version) pair the finding's own evidence names. Null means the finding names no such pair, the pair has not been fetched yet, or the fetch degraded (a bundle-vintage mismatch, a not-found response, or a network error all leave this null rather than failing the read). Deliberately separate from `license` — an OSS license policy or facet must never read a model's license.","required":["derivation","datasets","bias","curation","model_card","shards"],"properties":{"derivation":{"type":"object","description":"One identified model's lineage.","required":["is_adapter","parents"],"properties":{"parents":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.model.oneOf.0.derivation.parents.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.derivation.parents","typeLabel":"string[]"},"is_adapter":{"type":"boolean","isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.derivation.is_adapter","typeLabel":"boolean"},"transform_kind":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.derivation.transform_kind.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.derivation.transform_kind.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.derivation.transform_kind","typeLabel":"string | null"},"adapter_type":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.derivation.adapter_type.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.derivation.adapter_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.derivation.adapter_type","typeLabel":"string | null"},"evidence_source":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.derivation.evidence_source.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.derivation.evidence_source.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.derivation.evidence_source","typeLabel":"string | null"},"source":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.derivation.source.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.derivation.source.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.derivation.source","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.derivation","typeLabel":"object"},"datasets":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.model.oneOf.0.datasets.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.datasets","typeLabel":"string[]"},"bias":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.model.oneOf.0.bias.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.bias","typeLabel":"string[]"},"curation":{"type":"object","description":"Audit/curation status of a model's training data.","properties":{"audit_status":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.curation.audit_status.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.curation.audit_status.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.curation.audit_status","typeLabel":"string | null"},"declared_license":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.curation.declared_license.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.curation.declared_license.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.curation.declared_license","typeLabel":"string | null"},"source":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.curation.source.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.curation.source.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.curation.source","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.curation","typeLabel":"object"},"model_card":{"type":"object","required":["structured"],"properties":{"structured":{"type":"object","description":"Parsed subset of a model's model card.","required":["authors","ethical_considerations"],"properties":{"ethical_considerations":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.model.oneOf.0.model_card.structured.ethical_considerations.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.model_card.structured.ethical_considerations","typeLabel":"string[]"},"authors":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.model.oneOf.0.model_card.structured.authors.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.model_card.structured.authors","typeLabel":"string[]"},"intended_use":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.model_card.structured.intended_use.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.model_card.structured.intended_use.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.model_card.structured.intended_use","typeLabel":"string | null"},"technical_limitations":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.model_card.structured.technical_limitations.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.model_card.structured.technical_limitations.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.model_card.structured.technical_limitations","typeLabel":"string | null"},"paper_url":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.model_card.structured.paper_url.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.model_card.structured.paper_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.model_card.structured.paper_url","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.model_card.structured","typeLabel":"object"},"source":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.model_card.source.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.model_card.source.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.model_card.source","typeLabel":"string | null"}},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.model_card","typeLabel":"object"},"shards":{"type":"array","items":{"type":"object","description":"One weight file of the model as published upstream.","required":["filename","sha256","size_bytes"],"properties":{"filename":{"type":"string","isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.shards.items.[INDEX].filename","typeLabel":"string"},"sha256":{"type":"string","isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.shards.items.[INDEX].sha256","typeLabel":"string"},"size_bytes":{"type":"integer","format":"int64","isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.shards.items.[INDEX].size_bytes","typeLabel":"integer\u003cint64>"}},"uniqueKey":"enrichments.model.oneOf.0.shards.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.shards","typeLabel":"object[]"},"name":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.name.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.name.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.name","typeLabel":"string | null"},"author":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.author.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.author.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.author","typeLabel":"string | null"},"architecture":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.architecture.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.architecture.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.architecture","typeLabel":"string | null"},"model_type":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.model_type.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.model_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.model_type","typeLabel":"string | null"},"parameter_count":{"oneOf":[{"type":"integer","format":"int64","uniqueKey":"enrichments.model.oneOf.0.parameter_count.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","format":"int64","uniqueKey":"enrichments.model.oneOf.0.parameter_count.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.parameter_count","typeLabel":"integer\u003cint64> | null"},"quantization":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.quantization.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.quantization.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.quantization","typeLabel":"string | null"},"license":{"oneOf":[{"type":"string","description":"The MODEL's own license — deliberately not the same field as FindingEnrichment.license, so an OSS license policy or facet can never read it.","uniqueKey":"enrichments.model.oneOf.0.license.oneOf.0","typeLabel":"string"},{"type":"null","description":"The MODEL's own license — deliberately not the same field as FindingEnrichment.license, so an OSS license policy or facet can never read it.","uniqueKey":"enrichments.model.oneOf.0.license.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.license","typeLabel":"string | null"},"organization":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.organization.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.organization.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.organization","typeLabel":"string | null"},"source":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.source.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.source.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.source","typeLabel":"string | null"},"considerations":{"type":"object","description":"What the model's publisher says about its ethical, fairness and environmental impact.","required":["ethical_considerations","fairness_assessments","environmental_considerations"],"properties":{"ethical_considerations":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.model.oneOf.0.considerations.ethical_considerations.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.considerations.ethical_considerations","typeLabel":"string[]"},"fairness_assessments":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.model.oneOf.0.considerations.fairness_assessments.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.considerations.fairness_assessments","typeLabel":"string[]"},"environmental_considerations":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.model.oneOf.0.considerations.environmental_considerations.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"enrichments.model.oneOf.0.considerations.environmental_considerations","typeLabel":"string[]"},"source":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.considerations.source.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.considerations.source.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.considerations.source","typeLabel":"string | null"}},"uniqueKey":"enrichments.model.oneOf.0.considerations","typeLabel":"object"},"modality":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.modality.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.modality.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.modality","typeLabel":"string | null"},"info_code":{"oneOf":[{"type":"string","description":"ai-identity-api's own per-item outcome (e.g. COMPONENT_NOT_FOUND) when the answer is not a plain full match.","uniqueKey":"enrichments.model.oneOf.0.info_code.oneOf.0","typeLabel":"string"},{"type":"null","description":"ai-identity-api's own per-item outcome (e.g. COMPONENT_NOT_FOUND) when the answer is not a plain full match.","uniqueKey":"enrichments.model.oneOf.0.info_code.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.info_code","typeLabel":"string | null"},"info_message":{"oneOf":[{"type":"string","uniqueKey":"enrichments.model.oneOf.0.info_message.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"enrichments.model.oneOf.0.info_message.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model.oneOf.0.info_message","typeLabel":"string | null"}},"uniqueKey":"enrichments.model.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"enrichments.model.oneOf.1","typeLabel":"null"}],"uniqueKey":"enrichments.model","typeLabel":"object | null"},"remediation":{"type":"object","description":"Remediation for this finding's exact purl@version, joined at read time. Absent when no source is configured or it has no entry.","required":["purl","version","coverage","signals","confidence","confidence_reasons","assessed_at","source"],"properties":{"purl":{"type":"string","description":"Base purl without version (e.g. \"pkg:npm/request\").","isRequired":true,"uniqueKey":"enrichments.remediation.purl","typeLabel":"string"},"version":{"type":"string","isRequired":true,"uniqueKey":"enrichments.remediation.version","typeLabel":"string"},"coverage":{"type":"string","enum":["assessed","not_covered"],"isRequired":true,"uniqueKey":"enrichments.remediation.coverage","typeLabel":"enum\u003cstring>"},"signals":{"type":"array","items":{"type":"object","description":"One verifiable fact on one dimension. A license signal states the license's nature, never a verdict; the verdict stays with Earnie's policy engine.","required":["dimension","kind","effect","fact","evidence"],"properties":{"dimension":{"type":"string","enum":["vulnerability","health","currency","license","integrity"],"isRequired":true,"uniqueKey":"enrichments.remediation.signals.items.[INDEX].dimension","typeLabel":"enum\u003cstring>"},"kind":{"type":"string","description":"Source-defined signal kind within the dimension (e.g. \"deprecated\").","isRequired":true,"uniqueKey":"enrichments.remediation.signals.items.[INDEX].kind","typeLabel":"string"},"effect":{"type":"string","enum":["blocking","concern","info"],"isRequired":true,"uniqueKey":"enrichments.remediation.signals.items.[INDEX].effect","typeLabel":"enum\u003cstring>"},"fact":{"type":"string","isRequired":true,"uniqueKey":"enrichments.remediation.signals.items.[INDEX].fact","typeLabel":"string"},"evidence":{"type":"array","items":{"type":"object","required":["label"],"properties":{"label":{"type":"string","isRequired":true,"uniqueKey":"enrichments.remediation.signals.items.[INDEX].evidence.items.[INDEX].label","typeLabel":"string"},"url":{"type":"string","description":"Where the fact can be checked. Absent when the evidence has no public link.","uniqueKey":"enrichments.remediation.signals.items.[INDEX].evidence.items.[INDEX].url","typeLabel":"string"}},"uniqueKey":"enrichments.remediation.signals.items.[INDEX].evidence.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"enrichments.remediation.signals.items.[INDEX].evidence","typeLabel":"object[]"}},"uniqueKey":"enrichments.remediation.signals.items.[INDEX]","typeLabel":"object"},"description":"Verifiable facts behind the priority, one dimension each. Empty when not_covered.","isRequired":true,"uniqueKey":"enrichments.remediation.signals","typeLabel":"object[]"},"confidence":{"type":"number","minimum":0,"maximum":1,"description":"The source's confidence in the assessment.","isRequired":true,"uniqueKey":"enrichments.remediation.confidence","typeLabel":"number"},"confidence_reasons":{"type":"array","items":{"type":"string","uniqueKey":"enrichments.remediation.confidence_reasons.items.[INDEX]","typeLabel":"string"},"description":"Why confidence is below 1, e.g. \"replacement not assessed\".","isRequired":true,"uniqueKey":"enrichments.remediation.confidence_reasons","typeLabel":"string[]"},"assessed_at":{"type":"string","format":"date-time","description":"Timestamp of the oldest input the source used.","isRequired":true,"uniqueKey":"enrichments.remediation.assessed_at","typeLabel":"string\u003cdate-time>"},"source":{"type":"object","required":["provider","version"],"properties":{"provider":{"type":"string","description":"Who produced the assessment (e.g. \"earnie-fixture\").","isRequired":true,"uniqueKey":"enrichments.remediation.source.provider","typeLabel":"string"},"version":{"type":"string","isRequired":true,"uniqueKey":"enrichments.remediation.source.version","typeLabel":"string"}},"isRequired":true,"uniqueKey":"enrichments.remediation.source","typeLabel":"object"},"priority":{"type":"string","enum":["fix_now","plan","monitor","healthy"],"description":"Qualitative band chosen by the source, never computed by Earnie. Present exactly when coverage is `assessed`.","uniqueKey":"enrichments.remediation.priority","typeLabel":"enum\u003cstring>"},"action":{"type":"object","description":"The one step the source recommends. Absent when it recommends none.","required":["kind","upgrade_pain","summary"],"properties":{"kind":{"type":"string","enum":["upgrade","replace","remove"],"isRequired":true,"uniqueKey":"enrichments.remediation.action.kind","typeLabel":"enum\u003cstring>"},"upgrade_pain":{"type":"string","enum":["none","low","medium","high","unknown"],"description":"Expected effort of the change; `unknown` when the source did not assess it.","isRequired":true,"uniqueKey":"enrichments.remediation.action.upgrade_pain","typeLabel":"enum\u003cstring>"},"summary":{"type":"string","isRequired":true,"uniqueKey":"enrichments.remediation.action.summary","typeLabel":"string"},"target_version":{"type":"string","description":"Version to upgrade to. Absent when there is none.","uniqueKey":"enrichments.remediation.action.target_version","typeLabel":"string"},"replacement_purl":{"type":"string","description":"A specific replacement package. Absent when the source names none.","uniqueKey":"enrichments.remediation.action.replacement_purl","typeLabel":"string"}},"uniqueKey":"enrichments.remediation.action","typeLabel":"object"}},"uniqueKey":"enrichments.remediation","typeLabel":"object"}},"uniqueKey":"enrichments","typeLabel":"object"},"resolution_id":{"oneOf":[{"type":"string","format":"uuid","description":"ID of the resolution that currently explains this finding's resolved state. Null when the finding is open, reopened, or superseded by a rule. Set on resolve; cleared to null on reopen, supersede, or revert. Consumers can use this to fetch the full resolution record in one query rather than replaying audit events.","uniqueKey":"resolution_id.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","format":"uuid","description":"ID of the resolution that currently explains this finding's resolved state. Null when the finding is open, reopened, or superseded by a rule. Set on resolve; cleared to null on reopen, supersede, or revert. Consumers can use this to fetch the full resolution record in one query rather than replaying audit events.","uniqueKey":"resolution_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"resolution_id","typeLabel":"string\u003cuuid> | null"},"scan_only":{"type":"boolean","description":"True when the finding was read from a pull request scan's own result set and no standing project finding carries its id: the pull request introduced it and it has not reached the default branch. It can still be resolved, reopened and approved: the decision is kept by identity and applies when the finding reaches the default branch. Assign, suppress and create-rule answer 409 `finding_scan_only` until it does. Absent or false everywhere else.","uniqueKey":"scan_only","typeLabel":"boolean"},"pending_resolution":{"type":"object","description":"A resolve decision taken on a finding a pull request introduced (`scan_only`). It is kept by the finding's identity and becomes the resolution it describes when that identity first reaches the default branch. Until then the pull request reads the finding as resolved, and out of its gate when `suppresses` is true. Present only on a `scan_only` finding that carries one.","required":["reason_slug","reason_display_name","justification","status","suppresses","decided_by","decided_at"],"properties":{"reason_slug":{"type":"string","isRequired":true,"uniqueKey":"pending_resolution.reason_slug","typeLabel":"string"},"reason_display_name":{"type":"string","isRequired":true,"uniqueKey":"pending_resolution.reason_display_name","typeLabel":"string"},"justification":{"type":"string","isRequired":true,"uniqueKey":"pending_resolution.justification","typeLabel":"string"},"status":{"type":"string","enum":["pending_review","confirmed"],"description":"The status the resolution takes when it applies.","isRequired":true,"uniqueKey":"pending_resolution.status","typeLabel":"enum\u003cstring>"},"suppresses":{"type":"boolean","description":"Whether the reason takes the finding out of the pull request gate.","isRequired":true,"uniqueKey":"pending_resolution.suppresses","typeLabel":"boolean"},"decided_by":{"type":"object","required":["kind","id"],"properties":{"kind":{"type":"string","enum":["user","apikey","worker","agent"],"isRequired":true,"uniqueKey":"pending_resolution.decided_by.kind","typeLabel":"enum\u003cstring>"},"id":{"type":"string","format":"uuid","isRequired":true,"uniqueKey":"pending_resolution.decided_by.id","typeLabel":"string\u003cuuid>"}},"isRequired":true,"uniqueKey":"pending_resolution.decided_by","typeLabel":"object"},"decided_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"pending_resolution.decided_at","typeLabel":"string\u003cdate-time>"},"decided_by_display":{"type":"string","description":"The deciding user's email or API key name, when known.","uniqueKey":"pending_resolution.decided_by_display","typeLabel":"string"}},"uniqueKey":"pending_resolution","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","org_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","project_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","domain_slug":"\u003cstring>","title":"\u003cstring>","evidence":{"kind":"oss-diff","local_file":"\u003cstring>","local_line_start":123,"local_line_end":123,"oss_file":"\u003cstring>","oss_line_start":123,"oss_line_end":123,"purl":"\u003cstring>","match_percent":123,"algorithm":"\u003cstring>","oss_file_path":"\u003cstring>","spans":[{"local_line_start":123,"local_line_end":123,"oss_line_start":123,"oss_line_end":123}],"match_type":"file"},"produced_by":{"kind":"user","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"},"state":"open","domain":"oss","severity":"critical","suppressed":true,"version":123,"created_at":"2023-11-07T05:31:56Z","updated_at":"2023-11-07T05:31:56Z","purpose":"confidentiality","export_signals":[{"regime":"\u003cstring>","regime_version":"\u003cstring>","vintage":"current","test":"\u003cstring>","state":"met","provenance_ref":"\u003cstring>"}],"location":{"purl":"\u003cstring>","path":"\u003cstring>","line":123,"end_line":123},"producer_kind":"repo","producer_ref":"\u003cstring>","previous_severity":"critical","previous_severity_scan_run_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","severity_change_reason":"rescan_lowered","enrichments":{"component":{"release_date":"2023-11-07T05:31:56Z","latest_release_date":"2023-11-07T05:31:56Z","age_days":1,"versions_behind":1,"status":"\u003cstring>"},"license":{"spdx_id":"\u003cstring>","name":"\u003cstring>","url":"\u003cstring>","copyleft":true,"category":"permissive","dual_licensed":true,"source":"\u003cstring>"},"vulnerabilities":[{"kev":true,"known_ransomware":true,"fixed_versions":["\u003cstring>"],"cwe":["\u003cstring>"],"cve_id":"\u003cstring>","cvss_score":123,"cvss_vector":"\u003cstring>","epss_score":123,"epss_percentile":123,"severity":"critical","source":"\u003cstring>","published":"2023-11-07T05:31:56Z","modified":"2023-11-07T05:31:56Z"}],"geoprovenance":{"countries":["\u003cstring>"],"locations":[{"country":"\u003cstring>","percentage":123}]},"model":{"derivation":{"parents":["\u003cstring>"],"is_adapter":true,"transform_kind":"\u003cstring>","adapter_type":"\u003cstring>","evidence_source":"\u003cstring>","source":"\u003cstring>"},"datasets":["\u003cstring>"],"bias":["\u003cstring>"],"curation":{"audit_status":"\u003cstring>","declared_license":"\u003cstring>","source":"\u003cstring>"},"model_card":{"structured":{"ethical_considerations":["\u003cstring>"],"authors":["\u003cstring>"],"intended_use":"\u003cstring>","technical_limitations":"\u003cstring>","paper_url":"\u003cstring>"},"source":"\u003cstring>"},"shards":[{"filename":"\u003cstring>","sha256":"\u003cstring>","size_bytes":123}],"name":"\u003cstring>","author":"\u003cstring>","architecture":"\u003cstring>","model_type":"\u003cstring>","parameter_count":123,"quantization":"\u003cstring>","license":"\u003cstring>","organization":"\u003cstring>","source":"\u003cstring>","considerations":{"ethical_considerations":["\u003cstring>"],"fairness_assessments":["\u003cstring>"],"environmental_considerations":["\u003cstring>"],"source":"\u003cstring>"},"modality":"\u003cstring>","info_code":"\u003cstring>","info_message":"\u003cstring>"},"remediation":{"purl":"\u003cstring>","version":"\u003cstring>","coverage":"assessed","signals":[{"dimension":"vulnerability","kind":"\u003cstring>","effect":"blocking","fact":"\u003cstring>","evidence":[{"label":"\u003cstring>","url":"\u003cstring>"}]}],"confidence":0.5,"confidence_reasons":["\u003cstring>"],"assessed_at":"2023-11-07T05:31:56Z","source":{"provider":"\u003cstring>","version":"\u003cstring>"},"priority":"fix_now","action":{"kind":"upgrade","upgrade_pain":"none","summary":"\u003cstring>","target_version":"\u003cstring>","replacement_purl":"\u003cstring>"}}},"resolution_id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","scan_only":true,"pending_resolution":{"reason_slug":"\u003cstring>","reason_display_name":"\u003cstring>","justification":"\u003cstring>","status":"pending_review","suppresses":true,"decided_by":{"kind":"user","id":"3c90c3cc-0d44-4b50-8888-8dd25736052a"},"decided_at":"2023-11-07T05:31:56Z","decided_by_display":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"cca0d859-4696-4e6c-a064-a1cd10d35b6b":{"description":"Invalid request body","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"\u003cstring>","message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"42fac269-637f-4f9d-8d15-92e8c8e83037":{"description":"Not authenticated","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"\u003cstring>","message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"24d44af0-721b-41c0-a6ff-d62d5fc95639":{"description":"Insufficient permissions (findings:write required)","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"\u003cstring>","message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"964efb40-432a-4540-8d6b-462ca703cf93":{"description":"Finding not found","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"\u003cstring>","message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"adb1b337-e0c8-4778-a576-7dd3f1b8de2d":{"description":"`finding_scan_only`: the finding exists only in a pull request scan and cannot be triaged until it reaches the default branch.","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"\u003cstring>","message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"7dbca7a7-25f8-4b5b-95b9-2f279b3fa20d":{"description":"Internal server error","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"code":"\u003cstring>","message":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"c8d1323b-1149-4c60-81d6-3e183ff9fead":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An Earnie API key, sent as `Authorization: Bearer sk_earnie_...`. Create one under Settings > API keys. The key's scopes decide which operations it may call.","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"4d816cad-ef08-4835-941f-5a852e437ef9":{"url":"https://{tenant}.earnie.dev","description":"Your Earnie deployment","variables":{"tenant":{"default":"your-company","description":"Your organization's Earnie address, as shown in your browser when you sign in."}}}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"An Earnie API key, sent as `Authorization: Bearer sk_earnie_...`. Create one under Settings > API keys. The key's scopes decide which operations it may call.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An Earnie API key, sent as `Authorization: Bearer sk_earnie_...`. Create one under Settings > API keys. The key's scopes decide which operations it may call.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api-reference/earnie/triage-openapi.json"},"subdomain":"scanoss","siteName":"SCANOSS documentation","title":"Suppress or unsuppress a finding (orthogonal to triage state) - SCANOSS documentation","navMaps":{"firstHrefInVersion":{"v2":{"href":"/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state","matchLevel":0},"v1":{"href":"/en/latest/introduction/what-is-scanoss","matchLevel":4}},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T07:18:51.574Z","originalFileLocation":"earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"SCANOSS documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/scanoss/KZfWE-Zg_gP00ddS/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/scanoss/KZfWE-Zg_gP00ddS/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/scanoss/KZfWE-Zg_gP00ddS/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/scanoss/KZfWE-Zg_gP00ddS/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/scanoss/KZfWE-Zg_gP00ddS/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/scanoss/KZfWE-Zg_gP00ddS/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/scanoss/KZfWE-Zg_gP00ddS/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/scanoss/KZfWE-Zg_gP00ddS/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/scanoss/KZfWE-Zg_gP00ddS/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Suppress or unsuppress a finding (orthogonal to triage state) - SCANOSS documentation\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"SCANOSS documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.scanoss.com/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://scanoss.mintlify.app/_mintlify/api/og/v2?division=findings\u0026amp;title=Suppress+or+unsuppress+a+finding+%28orthogonal+to+triage+state%29\u0026amp;theme=e384d94a4a6a8eabee7f937e\u0026amp;signature=d47b670673e6c16802e9a5066a2f48b5d5f96b79d0544df47f2fba5704c4b262\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Suppress or unsuppress a finding (orthogonal to triage state) - SCANOSS documentation\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://scanoss.mintlify.app/_mintlify/api/og/v2?division=findings\u0026amp;title=Suppress+or+unsuppress+a+finding+%28orthogonal+to+triage+state%29\u0026amp;theme=e384d94a4a6a8eabee7f937e\u0026amp;signature=d47b670673e6c16802e9a5066a2f48b5d5f96b79d0544df47f2fba5704c4b262\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/scanoss/KZfWE-Zg_gP00ddS/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"SCANOSS documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#FF6A1A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.scanoss.com/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.scanoss.com/#organization\",\"name\":\"SCANOSS documentation\",\"url\":\"https://docs.scanoss.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/scanoss/9UP7eHL2Z_rQPx8l/scanoss-logo-horizontal-positive.svg?fit=max\u0026auto=format\u0026n=9UP7eHL2Z_rQPx8l\u0026q=85\u0026s=686c4487013423ef804e2e83983c76ef\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.scanoss.com#website\",\"name\":\"SCANOSS documentation\",\"url\":\"https://docs.scanoss.com\",\"publisher\":{\"@id\":\"https://docs.scanoss.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.scanoss.com/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state#webpage\",\"url\":\"https://docs.scanoss.com/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state\",\"name\":\"Suppress or unsuppress a finding (orthogonal to triage state)\",\"dateModified\":\"2026-10-28T07:18:51.574Z\",\"isPartOf\":{\"@id\":\"https://docs.scanoss.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.scanoss.com/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.scanoss.com/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API Reference\",\"item\":\"https://docs.scanoss.com/en/latest/earnie/api/using-the-api\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Findings\",\"item\":\"https://docs.scanoss.com/earnie/api-reference/triage/audit/list-the-durable-audit-event-trail-for-a-subject-eg-a-finding\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"findings\",\"item\":\"https://docs.scanoss.com/earnie/api-reference/triage/findings/list-findings-with-optional-filters\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Suppress or unsuppress a finding (orthogonal to triage state)\",\"item\":\"https://docs.scanoss.com/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.scanoss.com/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state#apireference\",\"headline\":\"Suppress or unsuppress a finding (orthogonal to triage state)\",\"name\":\"Suppress or unsuppress a finding (orthogonal to triage state)\",\"url\":\"https://docs.scanoss.com/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state\",\"mainEntityOfPage\":{\"@id\":\"https://docs.scanoss.com/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state#webpage\"},\"dateModified\":\"2026-10-28T07:18:51.574Z\",\"publisher\":{\"@id\":\"https://docs.scanoss.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.scanoss.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"SCANOSS documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"SCANOSS documentation","nav":{"global":null,"versions":[{"version":"v2","default":true,"tabs":[{"tab":"Earnie","hidden":false,"groups":[{"group":"Get Started","expanded":false,"pages":[{"title":"What Is Earnie?","sidebarTitle":"What Is Earnie?","href":"/en/latest/earnie/introduction"},{"title":"Deployment Options and Data Flow","sidebarTitle":"Deployment and Data Flow","href":"/en/latest/earnie/deployment"},{"group":"Self-Hosting","expanded":false,"pages":[{"title":"Self-Hosting Requirements","sidebarTitle":"Self-Hosting Requirements","href":"/en/latest/earnie/self-hosting/self-hosting-requirements"},{"title":"Installing Earnie","sidebarTitle":"Installing Earnie","href":"/en/latest/earnie/self-hosting/installation"},{"title":"Running Earnie on a Cloud Provider","sidebarTitle":"Cloud Providers","href":"/en/latest/earnie/self-hosting/cloud-providers"},{"title":"Upgrading and Backing Up","sidebarTitle":"Upgrading and Backing Up","href":"/en/latest/earnie/self-hosting/upgrading-and-backups"},{"title":"Releases and Release Notes","sidebarTitle":"Releases","href":"/en/latest/earnie/self-hosting/releases"},{"title":"Outbound Network Calls","sidebarTitle":"Outbound Network Calls","href":"/en/latest/earnie/self-hosting/outbound-network-calls"}]},{"title":"Setting Up Your Workspace","sidebarTitle":"Workspace Setup","href":"/en/latest/earnie/getting-started/workspace-setup"},{"title":"Connecting a Repository","sidebarTitle":"Connecting a Repository","href":"/en/latest/earnie/getting-started/connecting-a-repository"},{"title":"Your First Scan","sidebarTitle":"First Scan","href":"/en/latest/earnie/getting-started/first-scan"}]},{"group":"Development","expanded":false,"pages":[{"title":"Earnie CLI","sidebarTitle":"Earnie CLI","href":"/en/latest/earnie/using-earnie/earnie-cli"},{"group":"Coding Agents (MCP)","expanded":false,"pages":[{"title":"Earnie MCP","sidebarTitle":"Overview","href":"/en/latest/earnie/mcp/overview"},{"title":"Connecting an AI Client","sidebarTitle":"Connecting a Client","href":"/en/latest/earnie/mcp/connecting-a-client"},{"title":"Using Earnie Through MCP","sidebarTitle":"Tools","href":"/en/latest/earnie/mcp/tools"},{"title":"Troubleshooting Earnie MCP","sidebarTitle":"Troubleshooting","href":"/en/latest/earnie/mcp/troubleshooting"}]},{"title":"Self-Checks","sidebarTitle":"Self-Checks","href":"/en/latest/earnie/using-earnie/self-checks"}]},{"group":"Pull Requests \u0026 CI","expanded":false,"pages":[{"title":"When the Gate Blocks a Merge","sidebarTitle":"Merge Gate","href":"/en/latest/earnie/using-earnie/merge-gate"},{"title":"Scan Configuration","sidebarTitle":"Scan Configuration","href":"/en/latest/earnie/using-earnie/scan-configuration"}]},{"group":"Governance","expanded":false,"pages":[{"title":"Reading the Dashboard","sidebarTitle":"Dashboard","href":"/en/latest/earnie/using-earnie/dashboard"},{"title":"Dependencies","sidebarTitle":"Dependencies","href":"/en/latest/earnie/using-earnie/dependencies"},{"title":"Every Algorithm in a Project","sidebarTitle":"Algorithms","href":"/en/latest/earnie/using-earnie/algorithms"},{"title":"Across Every Project","sidebarTitle":"All Projects","href":"/en/latest/earnie/using-earnie/all-projects"},{"title":"Triaging Findings","sidebarTitle":"Triaging Findings","href":"/en/latest/earnie/using-earnie/triaging-findings"},{"title":"Setting Your First Policy","sidebarTitle":"Setting Policies","href":"/en/latest/earnie/using-earnie/setting-policies"},{"title":"Notifications","sidebarTitle":"Notifications","href":"/en/latest/earnie/using-earnie/notifications"},{"group":"Domains","expanded":false,"pages":[{"title":"Cryptography","sidebarTitle":"Cryptography","href":"/en/latest/earnie/domains/cryptography"},{"title":"AI Provenance","sidebarTitle":"AI Provenance","href":"/en/latest/earnie/using-earnie/ai-provenance"}]}]},{"group":"Evidence \u0026 Audit","expanded":false,"pages":[{"title":"Exporting an SBOM","sidebarTitle":"Exporting SBOMs","href":"/en/latest/earnie/evidence/exporting-sboms"},{"title":"Reports","sidebarTitle":"Reports","href":"/en/latest/earnie/evidence/project-reports"},{"title":"Compliance Packages","sidebarTitle":"Compliance Packages","href":"/en/latest/earnie/evidence/compliance-packages"},{"title":"Audit Log","sidebarTitle":"Audit Log","href":"/en/latest/earnie/evidence/audit-log"}]},{"group":"Administration","expanded":false,"pages":[{"title":"Team and Roles","sidebarTitle":"Team \u0026 Roles","href":"/en/latest/earnie/administration/team-and-roles"},{"title":"API Keys","sidebarTitle":"API Keys","href":"/en/latest/earnie/administration/api-keys"}]},{"group":"Migrating","expanded":false,"pages":[{"title":"Migrating from SCANOSS Tools","sidebarTitle":"From SCANOSS Tools","href":"/en/latest/earnie/migrating/from-scanoss-tools"}]},{"group":"API Reference","expanded":false,"pages":[{"title":"Using the API","sidebarTitle":"Using the API","href":"/en/latest/earnie/api/using-the-api"},{"group":"Projects","pages":[{"group":"projects","pages":[{"title":"List projects for the authenticated organisation","deprecated":null,"version":null,"openapi":"/api-reference/earnie/projects-openapi.json get /v1/projects","href":"/earnie/api-reference/projects/projects/list-projects-for-the-authenticated-organisation"},{"title":"Create a new project","deprecated":null,"version":null,"openapi":"/api-reference/earnie/projects-openapi.json post /v1/projects","href":"/earnie/api-reference/projects/projects/create-a-new-project"},{"title":"Get a project by ID","deprecated":null,"version":null,"openapi":"/api-reference/earnie/projects-openapi.json get /v1/projects/{projectId}","href":"/earnie/api-reference/projects/projects/get-a-project-by-id"},{"title":"Update a project's name or description","deprecated":null,"version":null,"openapi":"/api-reference/earnie/projects-openapi.json patch /v1/projects/{projectId}","href":"/earnie/api-reference/projects/projects/update-a-projects-name-or-description"},{"title":"Resolve one accessible project for a customer CLI","deprecated":null,"version":null,"openapi":"/api-reference/earnie/projects-openapi.json get /v1/projects:resolve","href":"/earnie/api-reference/projects/projects/resolve-one-accessible-project-for-a-customer-cli"}]}]},{"group":"Scans","pages":[{"group":"scans","pages":[{"title":"The organization's AI provenance posture across a scope of projects","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/ai/posture","href":"/earnie/api-reference/scans/scans/the-organizations-ai-provenance-posture-across-a-scope-of-projects"},{"title":"The curated rules Earnie assesses crypto findings against","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/crypto/assessment-rules","href":"/earnie/api-reference/scans/scans/the-curated-rules-earnie-assesses-crypto-findings-against"},{"title":"The organization's crypto posture across a scope of projects","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/crypto/posture","href":"/earnie/api-reference/scans/scans/the-organizations-crypto-posture-across-a-scope-of-projects"},{"title":"Get the project's AI scanner settings","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/projects/{projectId}/ai-settings","href":"/earnie/api-reference/scans/scans/get-the-projects-ai-scanner-settings"},{"title":"Replace the project's AI scanner settings","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json put /v1/projects/{projectId}/ai-settings","href":"/earnie/api-reference/scans/scans/replace-the-projects-ai-scanner-settings"},{"title":"Crypto algorithms detected in one project","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/projects/{projectId}/crypto-algorithms","href":"/earnie/api-reference/scans/scans/crypto-algorithms-detected-in-one-project"},{"title":"Dependency-internal crypto inventory for one component","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/projects/{projectId}/crypto-inventory","href":"/earnie/api-reference/scans/scans/dependency-internal-crypto-inventory-for-one-component"},{"title":"Declare a model upload, or resume the one in flight","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json post /v1/projects/{projectId}/model-uploads","href":"/earnie/api-reference/scans/scans/declare-a-model-upload-or-resume-the-one-in-flight"},{"title":"Read an upload and its offset","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/projects/{projectId}/model-uploads/{uploadId}","href":"/earnie/api-reference/scans/scans/read-an-upload-and-its-offset"},{"title":"Send one window of an upload","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json put /v1/projects/{projectId}/model-uploads/{uploadId}","href":"/earnie/api-reference/scans/scans/send-one-window-of-an-upload"},{"title":"Abandon an upload","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json delete /v1/projects/{projectId}/model-uploads/{uploadId}","href":"/earnie/api-reference/scans/scans/abandon-an-upload"},{"title":"List the project's Models and its uploads in flight","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/projects/{projectId}/models","href":"/earnie/api-reference/scans/scans/list-the-projects-models-and-its-uploads-in-flight"},{"title":"Get one Model","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/projects/{projectId}/models/{modelId}","href":"/earnie/api-reference/scans/scans/get-one-model"},{"title":"Delete a Model","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json delete /v1/projects/{projectId}/models/{modelId}","href":"/earnie/api-reference/scans/scans/delete-a-model"},{"title":"List scans","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans","href":"/earnie/api-reference/scans/scans/list-scans"},{"title":"Upload a source archive and start a scan","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json post /v1/scans","href":"/earnie/api-reference/scans/scans/upload-a-source-archive-and-start-a-scan"},{"title":"Get authoritative project scan summary","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/projects/{projectId}/state","href":"/earnie/api-reference/scans/scans/get-authoritative-project-scan-summary"},{"title":"Project posture rollup for the Audit landing","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/projects/{projectId}/summary","href":"/earnie/api-reference/scans/scans/project-posture-rollup-for-the-audit-landing"},{"title":"Project crypto posture rollup","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/projects/{projectId}/summary/crypto","href":"/earnie/api-reference/scans/scans/project-crypto-posture-rollup"},{"title":"Posture for every project in scope, in one response","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/projects:posture","href":"/earnie/api-reference/scans/scans/posture-for-every-project-in-scope-in-one-response"},{"title":"Get this deployment's upload limits","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/upload-limits","href":"/earnie/api-reference/scans/scans/get-this-deployments-upload-limits"},{"title":"Fetch a single scan by id","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/{scanId}","href":"/earnie/api-reference/scans/scans/fetch-a-single-scan-by-id"},{"title":"Upload or resume a user-supplied archive object","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json put /v1/scans/{scanId}/archive","href":"/earnie/api-reference/scans/scans/upload-or-resume-a-user-supplied-archive-object"},{"title":"Read the upload offset of an archive object","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json head /v1/scans/{scanId}/archive","href":"/earnie/api-reference/scans/scans/read-the-upload-offset-of-an-archive-object"},{"title":"The Scan's Audit Trail","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/{scanId}/audit","href":"/earnie/api-reference/scans/scans/the-scans-audit-trail"},{"title":"Compare crypto findings with another completed scan","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/{scanId}/crypto/diff","href":"/earnie/api-reference/scans/scans/compare-crypto-findings-with-another-completed-scan"},{"title":"List all files in the scan (flat)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/{scanId}/files","href":"/earnie/api-reference/scans/scans/list-all-files-in-the-scan-flat"},{"title":"Stream a single file's bytes from the retained archive","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/{scanId}/files/content","href":"/earnie/api-reference/scans/scans/stream-a-single-files-bytes-from-the-retained-archive"},{"title":"Keep-set ingest cursor — received and missing paths","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/{scanId}/ingest","href":"/earnie/api-reference/scans/scans/keep-set-ingest-cursor-—-received-and-missing-paths"},{"title":"Stream kept files as a tar","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json put /v1/scans/{scanId}/ingest","href":"/earnie/api-reference/scans/scans/stream-kept-files-as-a-tar"},{"title":"Match metadata + component + licenses for one file","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/{scanId}/matches","href":"/earnie/api-reference/scans/scans/match-metadata-+-component-+-licenses-for-one-file"},{"title":"Proxy the bytes of an OSS file from the SCANOSS file-content service","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/{scanId}/oss-files/content","href":"/earnie/api-reference/scans/scans/proxy-the-bytes-of-an-oss-file-from-the-scanoss-file-content-service"},{"title":"Per-scan rollup for the results-overview dashboard","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/{scanId}/summary","href":"/earnie/api-reference/scans/scans/per-scan-rollup-for-the-results-overview-dashboard"},{"title":"Lazy folder expansion with aggregated state","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/scans/{scanId}/tree","href":"/earnie/api-reference/scans/scans/lazy-folder-expansion-with-aggregated-state"},{"title":"Cancel an in-progress scan","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json post /v1/scans/{scanId}:cancel","href":"/earnie/api-reference/scans/scans/cancel-an-in-progress-scan"},{"title":"Seal the keep-set archive and start scanning","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json post /v1/scans/{scanId}:commit-ingest","href":"/earnie/api-reference/scans/scans/seal-the-keep-set-archive-and-start-scanning"},{"title":"Explicitly rerun a scan","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json post /v1/scans/{scanId}:rerun","href":"/earnie/api-reference/scans/scans/explicitly-rerun-a-scan"},{"title":"Retry a degraded provider publication","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json post /v1/scans/{scanId}:retry-publication","href":"/earnie/api-reference/scans/scans/retry-a-degraded-provider-publication"},{"title":"Import a foreign SBOM document as a partial-coverage scan","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json post /v1/scans:import-sbom","href":"/earnie/api-reference/scans/scans/import-a-foreign-sbom-document-as-a-partial-coverage-scan"},{"title":"Create a receiving scan for a resumable archive object","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json post /v1/scans:plan-archive","href":"/earnie/api-reference/scans/scans/create-a-receiving-scan-for-a-resumable-archive-object"},{"title":"Plan a folder scan — keep engine then 202 receiving","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json post /v1/scans:plan-folder","href":"/earnie/api-reference/scans/scans/plan-a-folder-scan-—-keep-engine-then-202-receiving"},{"title":"List Self-checks","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/self-checks","href":"/earnie/api-reference/scans/scans/list-self-checks"},{"title":"Run a Self-check over an inline SourceSet","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json post /v1/self-checks","href":"/earnie/api-reference/scans/scans/run-a-self-check-over-an-inline-sourceset"},{"title":"Get one Self-check","deprecated":null,"version":null,"openapi":"/api-reference/earnie/scans-openapi.json get /v1/self-checks/{selfCheckId}","href":"/earnie/api-reference/scans/scans/get-one-self-check"}]}]},{"group":"Findings","pages":[{"group":"audit","pages":[{"title":"List the durable audit-event trail for a subject (e.g. a finding)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json get /v1/audit/events","href":"/earnie/api-reference/triage/audit/list-the-durable-audit-event-trail-for-a-subject-eg-a-finding"}]},{"group":"findings","pages":[{"title":"List findings with optional filters","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json get /v1/findings","href":"/earnie/api-reference/triage/findings/list-findings-with-optional-filters"},{"title":"Create a new finding (source=api)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings","href":"/earnie/api-reference/triage/findings/create-a-new-finding-source=api"},{"title":"Bulk-reopen findings by component/path scope","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings/actions/bulk-reopen","href":"/earnie/api-reference/triage/findings/bulk-reopen-findings-by-componentpath-scope"},{"title":"Bulk-resolve open OSS findings by component/path scope","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings/actions/bulk-resolve","href":"/earnie/api-reference/triage/findings/bulk-resolve-open-oss-findings-by-componentpath-scope"},{"title":"Bulk-resolve open OSS findings across every project","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings/actions/bulk-resolve-org-wide","href":"/earnie/api-reference/triage/findings/bulk-resolve-open-oss-findings-across-every-project"},{"title":"Count the open findings a bulk-resolve would affect","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings/actions/bulk-resolve-preview","href":"/earnie/api-reference/triage/findings/count-the-open-findings-a-bulk-resolve-would-affect"},{"title":"List findings aggregated by component (purl@version)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json get /v1/findings/components","href":"/earnie/api-reference/triage/findings/list-findings-aggregated-by-component-purl@version"},{"title":"Membership Audit Trail for a component (base purl) selection","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json get /v1/findings/components/audit-trail","href":"/earnie/api-reference/triage/findings/membership-audit-trail-for-a-component-base-purl-selection"},{"title":"List the filterable facet values a set of findings carries, with counts","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json get /v1/findings/facets","href":"/earnie/api-reference/triage/findings/list-the-filterable-facet-values-a-set-of-findings-carries-with-counts"},{"title":"List findings aggregated by source file (review queue rows)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json get /v1/findings/files","href":"/earnie/api-reference/triage/findings/list-findings-aggregated-by-source-file-review-queue-rows"},{"title":"Get a single finding by ID","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json get /v1/findings/{findingId}","href":"/earnie/api-reference/triage/findings/get-a-single-finding-by-id"},{"title":"Assign a finding to an actor (also serves as defer/reassign)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings/{findingId}/actions/assign","href":"/earnie/api-reference/triage/findings/assign-a-finding-to-an-actor-also-serves-as-deferreassign"},{"title":"Create a configuration rule directly from a finding (mark-as-original)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings/{findingId}/actions/create-rule","href":"/earnie/api-reference/triage/findings/create-a-configuration-rule-directly-from-a-finding-mark-as-original"},{"title":"Reopen a resolved or assigned finding","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings/{findingId}/actions/reopen","href":"/earnie/api-reference/triage/findings/reopen-a-resolved-or-assigned-finding"},{"title":"Resolve a finding with a reason","description":null,"deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings/{findingId}/actions/resolve","href":"/earnie/api-reference/triage/findings/resolve-a-finding-with-a-reason"},{"title":"Suppress or unsuppress a finding (orthogonal to triage state)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/findings/{findingId}/actions/suppress","href":"/earnie/api-reference/triage/findings/suppress-or-unsuppress-a-finding-orthogonal-to-triage-state"},{"title":"Stream the dependency's resolved source for a crypto finding","description":"Reads the file containing a `source: dependency` crypto occurrence's call site from the resolved-source cache crypto-finder populated during the scan, and streams its bytes.\n\nThe request carries ONLY the finding id. The module, version and path are read server-side from the finding's own stored evidence, so there is no client-supplied path to traverse with. Content-Type is `text/plain; charset=utf-8`.\n\nCoverage follows crypto-finder's own resolvers: today only Maven and Gradle populate that cache, so a finding from any other ecosystem answers `404 source_not_available`. Only the documented 404 codes `source_not_available` and `not_found` mean absence and allow fallback to the matched line. Successful immutable source bytes may be cached indefinitely.","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json get /v1/findings/{findingId}/crypto-source","href":"/earnie/api-reference/triage/findings/stream-the-dependencys-resolved-source-for-a-crypto-finding"}]},{"group":"resolutions","pages":[{"title":"List resolutions (pending review queue)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json get /v1/resolutions","href":"/earnie/api-reference/triage/resolutions/list-resolutions-pending-review-queue"},{"title":"Weekly decision throughput for a project, split by actor class","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json get /v1/resolutions/throughput","href":"/earnie/api-reference/triage/resolutions/weekly-decision-throughput-for-a-project-split-by-actor-class"},{"title":"Revert a pending_review resolution","deprecated":null,"version":null,"openapi":"/api-reference/earnie/triage-openapi.json post /v1/resolutions/{resolutionId}/actions/revert","href":"/earnie/api-reference/triage/resolutions/revert-a-pending_review-resolution"}]}]},{"group":"Policies","pages":[{"group":"policies","pages":[{"title":"List current policy verdicts for a finding","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/findings/{findingId}/policy-verdicts","href":"/earnie/api-reference/policies/policies/list-current-policy-verdicts-for-a-finding"},{"title":"List named regulatory policy template sets","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/policies/template-sets","href":"/earnie/api-reference/policies/policies/list-named-regulatory-policy-template-sets"},{"title":"List the projects a policy is attached to","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/policies/{id}/attachments","href":"/earnie/api-reference/policies/policies/list-the-projects-a-policy-is-attached-to"},{"title":"List (and page) policy approval history for a project","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/projects/{projectId}/approvals","href":"/earnie/api-reference/policies/policies/list-and-page-policy-approval-history-for-a-project"},{"title":"List policies directly attached to a project","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/projects/{projectId}/policies","href":"/earnie/api-reference/policies/policies/list-policies-directly-attached-to-a-project"},{"title":"Attach a policy directly to a project","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json put /v1/projects/{projectId}/policies/{policyId}","href":"/earnie/api-reference/policies/policies/attach-a-policy-directly-to-a-project"},{"title":"Clone a policy attached (or attachable) to a project","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json post /v1/projects/{projectId}/policies/{policyId}/clone","href":"/earnie/api-reference/policies/policies/clone-a-policy-attached-or-attachable-to-a-project"},{"title":"List immutable evaluation snapshots for an attached policy","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/projects/{projectId}/policies/{policyId}/evaluations","href":"/earnie/api-reference/policies/policies/list-immutable-evaluation-snapshots-for-an-attached-policy"},{"title":"List current findings violating an attached policy","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/projects/{projectId}/policies/{policyId}/violations","href":"/earnie/api-reference/policies/policies/list-current-findings-violating-an-attached-policy"},{"title":"Materialize an arbitrary, operator-chosen list of seeded templates","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json post /v1/projects/{projectId}/policies:from-templates","href":"/earnie/api-reference/policies/policies/materialize-an-arbitrary-operator-chosen-list-of-seeded-templates"},{"title":"Get the project's current policy posture","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/projects/{projectId}/policy-posture","href":"/earnie/api-reference/policies/policies/get-the-projects-current-policy-posture"},{"title":"Enable one named regulatory policy template set","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json post /v1/projects/{projectId}/policy-template-sets/{setSlug}:enable","href":"/earnie/api-reference/policies/policies/enable-one-named-regulatory-policy-template-set"},{"title":"Get the project's append-only posture time series","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/projects/{projectId}/posture-history","href":"/earnie/api-reference/policies/policies/get-the-projects-append-only-posture-time-series"},{"title":"What this scan was gated by","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/scans/{scanId}/policy-verdicts","href":"/earnie/api-reference/policies/policies/what-this-scan-was-gated-by"}]},{"group":"API Reference","pages":[{"title":"List policies","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/policies","href":"/earnie/api-reference/policies/list-policies"},{"title":"Create a policy","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json post /v1/policies","href":"/earnie/api-reference/policies/create-a-policy"},{"title":"Get the field catalog visible to the caller","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/policies/fields","href":"/earnie/api-reference/policies/get-the-field-catalog-visible-to-the-caller"},{"title":"Search values for an endpoint-sourced field","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/policies/fields/{path}/values","href":"/earnie/api-reference/policies/search-values-for-an-endpoint-sourced-field"},{"title":"List seeded policy templates","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/policies/templates","href":"/earnie/api-reference/policies/list-seeded-policy-templates"},{"title":"Read one policy","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json get /v1/policies/{id}","href":"/earnie/api-reference/policies/read-one-policy"},{"title":"Delete a policy","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json delete /v1/policies/{id}","href":"/earnie/api-reference/policies/delete-a-policy"},{"title":"Partial update of a policy","deprecated":null,"version":null,"openapi":"/api-reference/earnie/policies-openapi.json patch /v1/policies/{id}","href":"/earnie/api-reference/policies/partial-update-of-a-policy"}]}]},{"group":"SBOM","pages":[{"group":"sbom","pages":[{"title":"List a project's SBOM snapshots (newest first)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/sbom-openapi.json get /v1/sbom/projects/{projectId}/snapshots","href":"/earnie/api-reference/sbom/sbom/list-a-projects-sbom-snapshots-newest-first"},{"title":"Generate an SBOM snapshot from a scan","deprecated":null,"version":null,"openapi":"/api-reference/earnie/sbom-openapi.json post /v1/sbom/scans/{scanId}:generate","href":"/earnie/api-reference/sbom/sbom/generate-an-sbom-snapshot-from-a-scan"},{"title":"Fetch snapshot metadata","deprecated":null,"version":null,"openapi":"/api-reference/earnie/sbom-openapi.json get /v1/sbom/snapshots/{snapshotId}","href":"/earnie/api-reference/sbom/sbom/fetch-snapshot-metadata"},{"title":"Delete a snapshot (metadata + rendered artifacts + inventory)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/sbom-openapi.json delete /v1/sbom/snapshots/{snapshotId}","href":"/earnie/api-reference/sbom/sbom/delete-a-snapshot-metadata-+-rendered-artifacts-+-inventory"},{"title":"Download a rendered SBOM document (original bytes)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/sbom-openapi.json get /v1/sbom/snapshots/{snapshotId}/document","href":"/earnie/api-reference/sbom/sbom/download-a-rendered-sbom-document-original-bytes"},{"title":"Render an existing snapshot into another format","deprecated":null,"version":null,"openapi":"/api-reference/earnie/sbom-openapi.json post /v1/sbom/snapshots/{snapshotId}:render","href":"/earnie/api-reference/sbom/sbom/render-an-existing-snapshot-into-another-format"}]}]},{"group":"Estate Actions","pages":[{"group":"estate","pages":[{"title":"Poll a queued fan-out run","deprecated":null,"version":null,"openapi":"/api-reference/earnie/estate-openapi.json get /v1/estate/actions/{runId}","href":"/earnie/api-reference/estate/estate/poll-a-queued-fan-out-run"},{"title":"Attach a policy to every selected, eligible project","deprecated":null,"version":null,"openapi":"/api-reference/earnie/estate-openapi.json post /v1/estate/projects:apply-policy","href":"/earnie/api-reference/estate/estate/attach-a-policy-to-every-selected-eligible-project"},{"title":"Generate an SBOM snapshot for every selected, eligible project","deprecated":null,"version":null,"openapi":"/api-reference/earnie/estate-openapi.json post /v1/estate/projects:generate-sbom","href":"/earnie/api-reference/estate/estate/generate-an-sbom-snapshot-for-every-selected-eligible-project"},{"title":"Render a notice file for every selected, eligible project","deprecated":null,"version":null,"openapi":"/api-reference/earnie/estate-openapi.json post /v1/estate/projects:render-notice","href":"/earnie/api-reference/estate/estate/render-a-notice-file-for-every-selected-eligible-project"},{"title":"Request a re-scan for every selected, eligible project","deprecated":null,"version":null,"openapi":"/api-reference/earnie/estate-openapi.json post /v1/estate/projects:request-scan","href":"/earnie/api-reference/estate/estate/request-a-re-scan-for-every-selected-eligible-project"}]}]},{"group":"Organization Settings","pages":[{"group":"organization","pages":[{"title":"Get organization profile","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json get /v1/organization","href":"/earnie/api-reference/platform/organization/get-organization-profile"},{"title":"Get the organization logo","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json get /v1/organization/branding/logo","href":"/earnie/api-reference/platform/organization/get-the-organization-logo"},{"title":"List the scanners enabled for your organization","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json get /v1/organization/modules","href":"/earnie/api-reference/platform/organization/list-the-scanners-enabled-for-your-organization"},{"title":"Get the organization's pull-request controls","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json get /v1/organization/pr-feedback","href":"/earnie/api-reference/platform/organization/get-the-organizations-pull-request-controls"},{"title":"Replace the organization's pull-request controls","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json put /v1/organization/pr-feedback","href":"/earnie/api-reference/platform/organization/replace-the-organizations-pull-request-controls"},{"title":"Get the organization's Scan Configuration","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json get /v1/organization/scan-configuration","href":"/earnie/api-reference/platform/organization/get-the-organizations-scan-configuration"},{"title":"Replace the organization's Scan Configuration","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json put /v1/organization/scan-configuration","href":"/earnie/api-reference/platform/organization/replace-the-organizations-scan-configuration"},{"title":"Get a project's auto-scan-on-merge setting","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json get /v1/projects/{projectId}/auto-scan","href":"/earnie/api-reference/platform/organization/get-a-projects-auto-scan-on-merge-setting"},{"title":"Enable or pause a project's auto-scan-on-merge","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json put /v1/projects/{projectId}/auto-scan","href":"/earnie/api-reference/platform/organization/enable-or-pause-a-projects-auto-scan-on-merge"},{"title":"Get a project's pre-commit hook setting","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json get /v1/projects/{projectId}/hook-settings","href":"/earnie/api-reference/platform/organization/get-a-projects-pre-commit-hook-setting"},{"title":"Set a project's pre-commit hook setting","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json put /v1/projects/{projectId}/hook-settings","href":"/earnie/api-reference/platform/organization/set-a-projects-pre-commit-hook-setting"},{"title":"Get a project's pull-request feedback setting","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json get /v1/projects/{projectId}/pr-feedback","href":"/earnie/api-reference/platform/organization/get-a-projects-pull-request-feedback-setting"},{"title":"Set a project's pull-request controls","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json put /v1/projects/{projectId}/pr-feedback","href":"/earnie/api-reference/platform/organization/set-a-projects-pull-request-controls"},{"title":"Get a project's Scan Configuration sources","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json get /v1/projects/{projectId}/scan-configuration","href":"/earnie/api-reference/platform/organization/get-a-projects-scan-configuration-sources"},{"title":"Replace a project's Scan Configuration","deprecated":null,"version":null,"openapi":"/api-reference/earnie/platform-openapi.json put /v1/projects/{projectId}/scan-configuration","href":"/earnie/api-reference/platform/organization/replace-a-projects-scan-configuration"}]}]},{"group":"Integrations","pages":[{"group":"integrations","pages":[{"title":"Each connection's recorded health, and their aggregate","deprecated":null,"version":null,"openapi":"/api-reference/earnie/integrations-openapi.json get /v1/integrations/connections","href":"/earnie/api-reference/integrations/integrations/each-connections-recorded-health-and-their-aggregate"},{"title":"GitHub connection status (liveness-checked)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/integrations-openapi.json get /v1/integrations/github","href":"/earnie/api-reference/integrations/integrations/github-connection-status-liveness-checked"},{"title":"List GitLab connections with what their tokens were checked to be","deprecated":null,"version":null,"openapi":"/api-reference/earnie/integrations-openapi.json get /v1/integrations/gitlab/connections","href":"/earnie/api-reference/integrations/integrations/list-gitlab-connections-with-what-their-tokens-were-checked-to-be"},{"title":"List the repositories the connections can access (live)","deprecated":null,"version":null,"openapi":"/api-reference/earnie/integrations-openapi.json get /v1/integrations/repositories","href":"/earnie/api-reference/integrations/integrations/list-the-repositories-the-connections-can-access-live"}]}]},{"group":"Components","pages":[{"group":"API Reference","pages":[{"title":"Search the SCANOSS component knowledgebase","deprecated":null,"version":null,"openapi":"/api-reference/earnie/components-openapi.json get /v1/components","href":"/earnie/api-reference/components/search-the-scanoss-component-knowledgebase"}]}]},{"group":"Audit log","pages":[{"group":"API Reference","pages":[{"title":"List instance-wide audit events","deprecated":null,"version":null,"openapi":"/api-reference/earnie/audit-openapi.json get /v1/audit-log","href":"/earnie/api-reference/audit/list-instance-wide-audit-events"},{"title":"Get one audit event","deprecated":null,"version":null,"openapi":"/api-reference/earnie/audit-openapi.json get /v1/audit-log/{eventId}","href":"/earnie/api-reference/audit/get-one-audit-event"}]}]}]}]},{"tab":"Developer Tools","hidden":false,"pages":[{"title":"Developer Tools","href":"/en/latest/developer-tools/overview"}]}]},{"version":"v1","pages":[{"title":"v1","href":"/en/latest/introduction/what-is-scanoss"}]}]},"title":"Suppress or unsuppress a finding (orthogonal to triage state) - SCANOSS documentation","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":["10e4515597","c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["BannerMarkdown-m8-xYP3Y.js","dist-1ms6tsT-.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-DMKzROTp.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","OpenApiReferenceProvider-26-lDe7V.js","utils-CWQmgYtH.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-4-Aw3rSD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C2zjXYA5.js","snippetPresets-DFmpFA7C.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-FJpQavWq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-D_GvPF7k.js","shallow-Bs2ZB0NO.js","getApiPlaygroundDisplay-DCcqJJk-.js","CodeSnippet-DzDxawVe.js","CodeSnippets-aUr7fU-7.js","Page-CT9uE8Ip.js","getPastedJson-Y1fKsj_I.js","icon-DI4zTsDr.js","MethodPill-C0nDlmSQ.js","DuplicateIcon-NUXbx2nQ.js","createIcon-BdTHrPAi.js","DynamicMarkdown-CtpgKJwj.js","SectionHeading-B3x35tOt.js","axios-vUo_bRtp.js","Markdown-3OmurJMP.js","AssistantPageLink-Ke9xIMFx.js"]}