đ 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.
Current limitations: editing and deleting a Universal Parser
A Universal Parserâs lifecycle is create-only. The field-mapping configuration of an existing Universal Parser cannot be modified after it is created â only the associated Test_Type (above) is editable. There is also no in-UI option to delete a Universal Parser. This is by design: Universal Parser configurations are tied to Test_Type records that may already be referenced by 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 (or edit the underlying Test_Type and uncheck âactiveâ). Existing Tests already imported under this parser are unaffected.
- Reactivate a deactivated parser from the same screen.
The current workaround for both cases is:
- To change a parserâs field mappings: create a new Universal Parser with the desired mappings (using a representative sample file as in Step 1), and switch new imports to use the new parser. Existing Tests already imported under the old parser are unaffected. Then deactivate the old parser so it stops appearing in the Scan Type drop-down.
- To âretireâ a parser you no longer want to use: deactivate it as described above. The parser configuration itself will remain in the database for the benefit of historical Tests.
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 values from your scan file are mapped automatically:
- 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 is the same behavior as the rest of DefectDojoâs parsers. If your scanner emits severity labels that donât line up with DefectDojoâs (e.g. âwarningâ, ânoteâ, numeric CVSS scores), the recommended workaround is to transform the severity values upstream â in your CI pipeline before uploading â so the values DefectDojo receives are already one of the five DefectDojo severity names.