Bring Your Own Scanner
Import vulnerability findings from external scanners into Cortex vulnerability management. Use these endpoints to submit asset and CVE data from third-party scanners and to poll the status of async import jobs.
Imports asset and vulnerability data from a third-party scanner into Cortex vulnerability management.
Each request must include at least one asset. Each asset can carry multiple CVE findings. The platform validates all input on receipt — if validation fails, a 422 Unprocessable Entity response is returned with field-level error details.
Successful requests are processed asynchronously. The response includes a job_id that can be polled using the Get BYOS import job status endpoint, plus counts of accepted assets and vulnerabilities.
RBAC permission required: manage_vulnerabilities_action
Required licenses: Exposure Management; and either Cortex Cloud Runtime Security or Cortex Cloud Posture Management.
Within a single asset, each vulnerability_id must be unique. If duplicate vulnerability_id values are submitted for the same asset, the API returns 422 Unprocessable Entity with an error describing the duplicate.
Viewing imported findings: After successful import, findings appear in the Cortex Cloud vulnerability management console under Vulnerability Findings, filtered by finding_sources = Third Party Scanner. The number of findings shown may be lower than the vulnerabilities_count returned by the import response, because the platform deduplicates findings by asset and CVE ID.
Rate limits:
Maximum 10 requests per hour to this endpoint.
Maximum 10 jobs in PROCESSING state in any given hour. Additional submissions are rejected until active jobs complete.
""""Request body for importing vulnerable assets from an external scanner.
Vulnerability scanner vendor. Examples: TENABLE, QUALYS, RAPID7_VM, RAPID7_CLOUD.
Product name associated with the vulnerabilities.
Product version, used for (vendor, product, version) CVE mapping.
Assets accepted for asynchronous processing. The response includes import counts and the job_id for status polling.
Response for a successful vulnerable asset import. Returns counts and the async job identifier needed to poll for completion.
Total number of assets accepted in the import request.
2Total number of vulnerabilities accepted across all assets in the import request.
4Unique identifier for the async import job. Use this value with the Get BYOS Import Job Status endpoint to poll for completion.
a2b1aba2-37fe-4fb4-ba6d-829e8cf5d653Possible status values for a BYOS import job.
Validation Error — one or more request fields failed schema validation. Check the detail array for field-level error messages.
POST /public_api/vulnerability-management/v1/external-scans/assets HTTP/1.1
Host: api-yourfqdn
x-xdr-auth-id:
Authorization:
Content-Type: application/json
Accept: */*
Content-Length: 553
{
"vendor": "text",
"product": "text",
"version": "text",
"assets": [
{
"ipv4": [
"0.0.0.0"
],
"vulnerabilities": [
{
"vulnerability_id": "text",
"last_seen": 1,
"port": 1,
"protocol": "TCP",
"raw_output": "text",
"confidence": "Potential",
"description": "text",
"evidence": "text",
"scan_name": "text",
"cve_id": [
"text"
]
}
],
"origin_asset_id": "text",
"asset_name": "text",
"ipv6": [
"2001:0db8:85a3:0000:0000:8a2e:0370:7334"
],
"fqdn": [
"text"
],
"mac_address": "text",
"origin_tags": [
"env:perf-test",
"batch:stress"
],
"last_seen": 1,
"os_name": "text",
"product": "text",
"vendor": "text",
"version": "text"
}
]
}{
"assets_count": 2,
"vulnerabilities_count": 4,
"job_id": "a2b1aba2-37fe-4fb4-ba6d-829e8cf5d653",
"job_status": "INITIATED"
}Returns the current status of an asynchronous BYOS import job.
After submitting assets via the Submit assets and vulnerabilities from an external scanner endpoint, use the returned job_id to poll this endpoint until the job reaches a terminal state (COMPLETED, FAILED, or COMPLETED_WITH_ERRORS).
Possible job_status values:
INITIATED— job received, not yet queuedPROCESSING— job is actively being processedCOMPLETED— all assets imported successfullyCOMPLETED_WITH_ERRORS— import finished but some assets failed; checkerror_logFAILED— job failed entirely; checkerror_logfor details
Response codes:
200— Job status retrieved successfully. The HTTP status reflects only the poll request itself; the job's outcome is injob_status(including the terminalFAILEDandCOMPLETED_WITH_ERRORSstates).404—job_idwas not found.
422 Unprocessable Entity is only returned by the upstream Submit assets and vulnerabilities from an external scanner endpoint when the request payload fails schema validation. A 422 therefore means the job was never created; a FAILED job_status returned in a 200 response means the job ran but could not complete — see error_log for details.
RBAC permission required: manage_vulnerabilities_action
Required licenses: Exposure Management; and either Cortex Cloud Runtime Security or Cortex Cloud Posture Management.
SLA timeout: Jobs in PROCESSING state have a 24-hour SLA. After 24 hours, any job still in PROCESSING is guaranteed to transition to COMPLETED_WITH_ERRORS, which is a terminal state.
Rate limits: Maximum 10 requests per minute.
The unique identifier of the BYOS import job, returned by the Submit assets and vulnerabilities from an external scanner endpoint.
""""Job status retrieved successfully.
Status and metadata for a BYOS import job.
Unique job ID. Use this value with the Get BYOS Import Job Status endpoint to poll for completion.
ISO 8601 timestamp of when the job was received.
Possible status values for a BYOS import job.
ISO 8601 timestamp of when the job was last updated.
Error details if the job failed or completed with errors. May be null when there is no error.
Job not found — the specified job_id does not exist.
Validation Error — the job_id path parameter failed schema validation.
GET /public_api/vulnerability-management/v1/external-scans/assets/jobs/{job_id} HTTP/1.1
Host: api-yourfqdn
x-xdr-auth-id:
Authorization:
Accept: */*
{
"job_id": "text",
"created_timestamp": "2026-01-01T00:00:00.000Z",
"job_status": "INITIATED",
"last_updated": "2026-01-01T00:00:00.000Z",
"error_log": null
}Last updated
Was this helpful?
