đ Universal Parser | DefectDojo Documentation
đ Universal Parser (Pro)
Note: The Universal Parser is only available in DefectDojo Pro.
The Universal Parser is currently in Beta. See our announcement presentation for more information.
About Universal Parser
DefectDojo has a large, regularly updated library of parsers to help security teams ingest data. However, sometimes users have a tool thatâs unsupported by the parsers, or they may want to import data into the DefectDojo model differently from the way the parser does.
DefectDojoâs Universal Parser is meant to give our users with unsupported report types a path forward, to import and map any JSON, CSV or XML file.
The Universal Parser is:
- A quick way to support file formats for which we do not have Community parsers, such as reports produced by internal tools
- A tool to help you ingest data, even if a Community parser is out-of-date or doesnât structure findings the way you would like
- An alternative to custom scripting to transform tool reports into the CSV/JSON format expected by the âGeneric Findings Importâ scan type
- Designed to be easy to use for anyone, with no coding and minimal configuration required
The Universal Parser is not:
- A comprehensive replacement for open source parsers, Connectors, or carefully-massaged âGeneric Findings Importâ reports
- Capable of handling nuanced, branching logic to structure findings
The Universal Parser configuration is only available in the Pro UI, though you can still import scans using a Universal Parser via the old UI or API.
Step 1: Creating a new Universal Parser
You can create a new Universal Parser by clicking the âNew Universal Parserâ button in the navigation bar under the âImportâ section, or from the link on the âAdd Findingsâ page.
The first screen will ask you for a scan file and a parser name.
The file should:
- Have a recognized extension (see supported file extensions below)
- Contain enough finding-like objects to be representative of real reports - i.e., one that includes values in all optional fields
- Not be larger than about 1-2MB - beyond this point it will generally just take longer to parse the file, without any benefit
The parser name will be used when creating the Test_Type for this new parser. Youâll find your newly-created Universal Parser in the scan types drop-down on the âAdd Findingsâ page with a name like âUniversal Parser - MyCustomParserâ. Parser names must be unique to prevent confusion when selecting a scan type for imports.
Step 2: Mapping your Finding fields
After uploading an example scan file, selecting a parser name, and clicking âNextâ, the following page will let you configure the way this Universal Parser will populate finding fields when using this configuration to perform imports. On the right, you will find a selection of DefectDojo finding fields (output fields). Drop-down menus to the left of each output field allow you to select which item(s) (input fields) from your scan fileâs structure should be used to populate them.
Example:
If youâve uploaded a scan file in JSON format that looks like this:
{
"findings": [
{
"title": "Finding 1 Title",
"description": "Finding 1 Description",
"severity": "CRITICAL",
"CVE": "CVE-2025-12345",
...
},
{
"title": "Finding 2 Title",
"description": "Finding 2 Description",
"severity": "LOW",
"CVE": "CVE-2025-54321",
...
},
...
]
}
Youâll see a hierarchical representation of the unique fields we detected based on the structure of the input file, with icons indicating the type of each field (if we can determine this). You can then select the âtitleâ input field in the drop-down menu that populates the âTitleâ output field, the âdescriptionâ input field can go with the âDescriptionâ output field, and so on.
Required fields
The following output fields require an input field mapping:
- Title
- Severity
- Description
About severities
A Universal Parser will accept any case variation of the DefectDojo severities - âCRITICALâ, âCriticalâ, âcRiTiCaLâ, etc. - and apply it to your findings. Any value that doesnât match a DefectDojo severity will be replaced with âInfoâ. This mirrors how parsers and Connectors work today: unknown values are generally mapped to âInfoâ.
Multi-select fields
Some output fields will accept multiple input fields. If you decide to select more than one input field, we will provide that fieldâs value under a header with that input fieldâs name.
Example
description
This was pulled from a field called âdescriptionâ in the input file
detailed_description
This was pulled from a field called âdetailed_descriptionâ in the input file
Step 3: Previewing your Findings
Once youâve selected your mappings from input fields to output fields, you can click the âNextâ button to see a preview of what the Findings from your input file will look like once they are imported to DefectDojo with your chosen configuration. Some fields will have an âexpandâ button next to them to allow you to see the full, rendered MarkDown of what that field will look like. We will only render previews of the first 25 Findings from your input file, but you can also see how many findings were detected in the whole scan file.
If the previews donât look like you expected, you can hit the âBackâ button to tweak the mappings. Once you are satisfied with your configuration, click the âSubmitâ button to create your new Universal Parser. This will not perform an import automatically.
Once your Universal Parser is created, youâll be redirected to the âAdd Findingsâ page where you can upload and import a scan file matching the structure of the example file you provided in Step 1.
Additional notes about Universal Parser configuration
Choosing the right input fields
Each vendor may produce very different scan report formats, some of which will map more closely to DefectDojoâs finding model than others. We allow for significant flexibility in what we will accept, but we must impose some structure to ensure that findings donât get garbled in the translation from input to output. While we can accommodate optional input fields, we donât accept âglobalâ fields, or fields that occur a different number of times than the number of finding objects.
Example
{
"scan_type": "MyToolScan", // <- There is only one instance of this field, which doesn't match the number of findings
"findings": [
{
"title": "Finding 1 Title",
"description": "Finding 1 Description",
"severity": "CRITICAL",
"CVE": "CVE-2025-12345", // <- This optional field only appears in Finding 1 - that's okay!
...
},
{
"title": "Finding 2 Title",
"description": "Finding 2 Description",
"severity": "CRITICAL",
... // <- While there is no "CVE" field here, we can still query for it and simply default to a null value
},
... 5 more findings ...
],
"global_details": [
{
"nested_detail": "Global detail 1"
},
{
"nested_detail": "Global detail 2" // <- The number of "global_details" objects (2) does not match the number of individual finding objects (7)
}
]
}
After saving a Universal Parser
You can edit the Test_Type associated with your Universal Parser to change:
- Whether it is âactiveâ or not. If not, it will not appear as an option in the âScan Typeâ drop-down on the âAdd Findingsâ page
- Whether its findings should be marked âstaticâ or âdynamicâ
- You can tweak the same-tool and cross-tool deduplication hash codes, as well as the reimport hash codes, for your Universal Parser under âEnterprise Settingsâ. By default, only same-tool deduplication and reimport hash codes are populated, with the required values Title, Severity, and Description.
Lifecycle: create, deactivate, reactivate
A Universal Parserâs lifecycle is create-only, with no in-UI edit or delete. Once a parser has been created, the field-mapping configuration cannot be modified, and the parser itself cannot be removed from the UI â this is by design, because Universal Parser configurations are tied to Test_Type records that may be referenced by existing Findings, Tests, and import history.
What you can do from the UI:
- Deactivate a parser to hide it from the âScan Typeâ drop-down on import. Open Import â Universal Parser in the sidebar to see all of your Universal Parsers, and toggle âActiveâ off. (Alternatively, you can edit the underlying Test_Type and uncheck âactiveâ.) Deactivated parsers no longer appear as a Scan Type option on the Add Findings page, but existing Tests that were imported with this parser are unaffected and continue to work.
- Reactivate a parser from the same screen by toggling âActiveâ back on.
- Edit the Test_Type fields described in the section above (active/inactive, static/dynamic, deduplication hash codes).
Recommended workflow when a scannerâs report format changes
Because the field-mapping configuration is locked once a parser is created, the standard workflow for handling a format change in the underlying scanner is to roll forward to a new parser rather than try to edit the old one:
- Create a new Universal Parser using a sample of the new report format (see Step 1). Give it a distinct name â e.g. append
v2or a date to the original name. - Switch new imports in your CI/CD pipeline or UI workflow to use the new parserâs scan type.
- Deactivate the old parser once youâve confirmed the new one is producing the findings you expect. Tests already imported under the old parser remain in DefectDojo and can still be triaged; only new imports route to the new parser.
If you need a parser configuration permanently removed (for example, because it contains sensitive field names), contact DefectDojo Support.
A note about severity mapping
The Universal Parser does not have a configurable severity-mapping field. Severity is mapped automatically with these rules:
- Any case variation of a DefectDojo severity is accepted â
CRITICAL,Critical,cRiTiCaL,criticalall map to Critical. The same applies toHigh,Medium,Low, andInfo. - Any value that does not match one of DefectDojoâs five severities is mapped to Info.
This behavior is the same for all parsers in DefectDojo (built-in parsers, Connectors, and Universal Parsers).
If a scanner youâre trying to ingest uses severity labels that donât line up with DefectDojoâs (e.g. âwarningâ, ânoteâ, or numeric CVSS scores), the Universal Parser will map all of those non-matching values to Info. If you need a different mapping, the best workaround today is to transform the severity values upstream â for example, in your CI pipeline before uploading â so the values DefectDojo receives are already one of the five DefectDojo severity names.