File imports

File import is the fastest way to get value out of Sinterly and works with effectively any tool. Upload through the browser, or post the file from your CI pipeline using the ingest API.

How an upload behaves

  1. You select a file, up to 25 MB, in SARIF, CSV or OTM format.
  2. Sinterly parses it without writing anything and shows you a preview: the finding count, the severity breakdown and the first few titles.
  3. You confirm. Only then does anything enter your tenant.
  4. The pipeline deduplicates, enriches, scores and, if configured, creates tickets and evaluates the gate.
  5. A run report tells you what was created, updated and merged.

If the file cannot be parsed, the message tells you the specific reason rather than showing a generic failure.

SARIF import

Any SARIF 2.1.0 file is accepted. Severity is read the way each tool intends, including from the rule's default configuration when an individual result carries none, so a Semgrep file and a Trivy file both arrive with sensible severities rather than everything defaulting to medium.

Two commands that produce real SARIF:

semgrep --config p/owasp-top-ten <repo> --sarif > results.sarif
trivy fs <repo> --format sarif --output results.sarif

Where a SARIF file includes taint flow information, Sinterly stores the scanner's steps verbatim, so a developer can see the path the tool traced from source to sink.

CSV import

For tools with no SARIF export. Your file needs a header row. Columns are matched case insensitively against the aliases below, and the first match wins.

FieldRecognised column names
Identifierid, finding_id, issue_id, vulnerability_id, vuln_id, uid, ref, reference
Titletitle, name, vulnerability, issue, summary, description_short, rule, vulnerability_name, issue_title
Descriptiondescription, details, detail, message, info
Severityseverity, risk, priority, level, criticality, cvss_severity, severity_level
CVSS scorecvss_score, cvss, score, cvss3_score, cvss2_score, cvss_base_score, base_score, cvss_v3_score
CVEcve, cve_id, cve_number, cve_ids
CWEcwe, cwe_id, cwe_number, cwe_ids, cwes, weakness, weakness_id
File pathfile, file_path, path, location, filename, filepath
Line numberline, line_number, line_no, lineno, start_line
Componentcomponent, package, package_name, library, module, affected_component, dependency, dependency_name, artifact, pkg
Repositoryrepository, repo, project, target, source
Tooltool, scanner, source, source_tool
Vulnerability classtype, vulnerability_type, category, class, finding_type
Fixed versionfixed_version, installed_version

Only a title and a severity are strictly required. Everything else improves scoring accuracy. Supplying a CVE is particularly valuable, because it unlocks the KEV and EPSS enrichment that drives the exploitability verdict.

Threat model import

OTM files are covered separately, because they behave differently from scanner output. See Threat models.

Uploads and connectors together

You can use both. A finding's identity is derived from the project, the source tool and the identifier the tool gave it, not from how it arrived. That means moving a scanner from manual upload to a connector does not duplicate anything.

One thing worth planning. Closure detection works per project and per source tool. If you pile several repositories into a single project and then upload a scan covering only one of them, findings belonging to the others will start accruing absences. Give each repository its own project and this cannot happen.