---
title: "Create a saved custom report"
method: POST
path: "/api/v2/custom-reports/create"
tags: ["Custom Reports"]
---

# Create a saved custom report

`POST /api/v2/custom-reports/create`

## Request

- Base URL: `https://zeropath.com`
- URL: `https://zeropath.com/api/v2/custom-reports/create`
- Auth: API key in header `X-ZeroPath-API-Token-Id` and API key in header `X-ZeroPath-API-Token-Secret`

Create a new saved custom report with a name and filter configuration. Call `customReports.filterSchema` first and use the returned canonical field and operator keys exactly. Requires CUSTOM_REPORT_CREATE permission.

## Request body

- CustomReportCreateInput: Input for creating a new saved custom report. A custom report is a named set of filters that can be applied to view security issues matching specific criteria.
  - `organizationId` string: Organization ID to create the custom report in. If omitted, resolved from the authenticated session.
  - `name` string, required: Display name for the new custom report
  - `filters` CustomReportFilter[], required: Array of filters that define this custom report
    - `id` string, required: Unique identifier for this filter within the report
    - `fieldKey` 'severityLevel' | 'severity' | 'score' | 'status' | 'vulnCategory' | 'vulnClass' | 'validated' | 'reachability' | 'runtimeValidationVerdict' | 'cvssAttackVector' | 'cvssAttackComplexity' | 'cvssPrivilegesRequired' | 'cvssUserInteraction' | 'runtimeValidationSetupRequirement' | 'isNew' | 'hasWizExposure' | 'secretVerified' | 'search' | 'language' | 'detectedDate' | 'resolvedDate' | 'repositoryName' | 'branch' | 'tag' | 'scanType', required: Canonical field key for this filter. Do not invent field names; use `customReports.filterSchema` to discover supported values.
    - `operatorKey` 'is' | 'isNot' | 'isAnyOf' | 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'contains' | 'equals' | 'startsWith' | 'isUnknown' | 'isTrue' | 'before' | 'after' | 'inLastNDays' | 'onOrAfter' | 'onOrBefore', required: Canonical operator key for this filter. Valid operators depend on the chosen field. Call `customReports.filterSchema` first.
    - `value` union, required: The filter value; shape depends on the selected field and operator. Use the filter schema endpoint to determine the correct format.
      - string
      - number
      - boolean
      - string[]: Array of string values for multi-select filters
      - string[]: Tuple of two strings for range filters (e.g. date range)
      - number[]: Tuple of two numbers for numeric range filters

## Response `200`

Custom report created successfully

- CustomReportCreateResponse: Response after creating a custom report
  - `id` string, required: Unique identifier for the newly created custom report
  - `name` string, required: Display name of the custom report
  - `filters` CustomReportFilter[], required: Array of filters that define this custom report
    - `id` string, required: Unique identifier for this filter within the report
    - `fieldKey` 'severityLevel' | 'severity' | 'score' | 'status' | 'vulnCategory' | 'vulnClass' | 'validated' | 'reachability' | 'runtimeValidationVerdict' | 'cvssAttackVector' | 'cvssAttackComplexity' | 'cvssPrivilegesRequired' | 'cvssUserInteraction' | 'runtimeValidationSetupRequirement' | 'isNew' | 'hasWizExposure' | 'secretVerified' | 'search' | 'language' | 'detectedDate' | 'resolvedDate' | 'repositoryName' | 'branch' | 'tag' | 'scanType', required: Canonical field key for this filter. Do not invent field names; use `customReports.filterSchema` to discover supported values.
    - `operatorKey` 'is' | 'isNot' | 'isAnyOf' | 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'contains' | 'equals' | 'startsWith' | 'isUnknown' | 'isTrue' | 'before' | 'after' | 'inLastNDays' | 'onOrAfter' | 'onOrBefore', required: Canonical operator key for this filter. Valid operators depend on the chosen field. Call `customReports.filterSchema` first.
    - `value` union, required: The filter value; shape depends on the selected field and operator. Use the filter schema endpoint to determine the correct format.
      - string
      - number
      - boolean
      - string[]: Array of string values for multi-select filters
      - string[]: Tuple of two strings for range filters (e.g. date range)
      - number[]: Tuple of two numbers for numeric range filters
  - `createdAt` string, date-time, required: Timestamp when the custom report was created

## Other responses

- `400`: Error Response
- `401`: Error Response

---

[API](https://skmtc.dev/zeropath/apis/zeropath-api.md) - [All operations](https://skmtc.dev/zeropath/apis/zeropath-api/llms.txt) - [OpenAPI document](https://skmtc.dev/zeropath/apis/zeropath-api/revisions/126e9c80ba0d?raw)
