🔗 Integrations
Overview

Integrations

NAT connects to your existing tools at both ends of the pipeline — import API definitions in any format, and export findings to your issue tracker or alerting system automatically.

  • Ingestors parse your API spec or test files and convert them into a normalized endpoint list that NAT can scan.
  • Exporters take each finding above your configured severity threshold and create a work item, alert, or webhook payload in the target system.

Everything flows through a single command: nat pipeline --config pipeline.yaml.


Import Formats (Ingestors)

NAT supports 7 built-in ingestors. Choose whichever format your team already uses — NAT normalizes it into the same internal representation before scanning.

Formatingestor_nameAccepted extensions
OpenAPI 3.x / Swagger 2.xopenapi.yaml, .json
Postman Collectionpostman.json
GraphQL Schemagraphql.graphql, .gql, introspection JSON
HAR Archivehar.har
Gherkin / BDDgherkin.feature
cURL Commandscurl.sh, .txt
BGSTM Test Plansbgstm.bgstm.json

Format details

OpenAPI 3.x / Swagger 2.x — The most common format. NAT parses every path, operation, parameter, and schema from your spec and generates targeted test cases from them. Supports both local files and remote URLs.

Postman Collection — Export your Postman workspace collection as JSON and pass it directly to NAT. All requests, folders, and variable definitions are resolved into endpoint descriptors.

GraphQL Schema — Supply a .graphql SDL file, a .gql file, or a raw introspection JSON response. NAT maps every query, mutation, and type into testable endpoints for injection and auth-bypass checks.

HAR Archive — Record real traffic with your browser DevTools or a proxy (Burp, mitmproxy), export the .har file, and feed it to NAT. Captured requests become the test corpus — no spec authoring required.

Gherkin / BDD — If your team writes .feature files with Given / When / Then API scenarios, NAT can parse them directly. Each When step that makes an HTTP call becomes a testable endpoint.

cURL Commands — Paste your saved cURL one-liners into a .sh or .txt file and use it as a spec. Useful for ad-hoc scans when you don't have a formal spec.

BGSTM Test Plans — Native format for BGSTM-generated test plans. Pass the .bgstm.json file directly; NAT will use the embedded endpoint definitions and existing test intent metadata.

Quick start

pipeline.yaml snippet:

ingestor_name: openapi          # change to: postman | graphql | har | gherkin | curl | bgstm
source_path: ./openapi.yaml     # local path …
# source_url: https://api.example.com/openapi.json  # … or remote URL

CLI shortcut — skip the config file and pass a spec directly:

nat security-scan --spec ./openapi.yaml --base-url https://api.example.com

Replace --spec ./openapi.yaml with any supported file format; NAT auto-detects the ingestor from the file extension.

See the Pipeline Quickstart for a complete walkthrough of building a pipeline.yaml from scratch, including format-specific YAML tabs for each ingestor.


Export Destinations (Exporters)

NAT includes 9 built-in exporters. Once a scan finishes, findings are automatically pushed to every configured destination — no copy-paste required.

Exporterexporter_nameDestination
GitHub Issuesgithub-issuesGitHub repository issues
Jira CloudjiraJira Cloud project
GitLab IssuesgitlabGitLab.com or self-hosted GitLab
LinearlinearLinear workspace
Azure DevOpsazure-devopsAzure DevOps work items
ShortcutshortcutShortcut (formerly Clubhouse) stories
PagerDutypagerdutyPagerDuty incidents / alerts
ServiceNowservicenowServiceNow incident table
Generic WebhookwebhookAny HTTP/HTTPS endpoint

Exporter details

GitHub Issues — Creates one issue per finding with NAT's severity label, finding title, and remediation guidance. Supports deduplication so repeated scans don't create duplicate issues. The GITHUB_TOKEN available in GitHub Actions works out of the box.

Jira Cloud — Creates Jira issues via the REST API. Configure the project key, issue type, and component. Findings are mapped to Jira priority levels automatically.

GitLab Issues — Works with both GitLab.com and self-hosted instances. Findings can be marked confidential and assigned to specific users.

Linear — Creates Linear issues via the GraphQL API. Supports project, team, assignee, and label configuration.

Azure DevOps — Creates work items (Bug, Issue, Task) with area path and iteration path support for sprint planning.

Shortcut — Creates stories in a Shortcut project with configurable story type (bug, feature, chore), epic association, and labels.

PagerDuty — Triggers PagerDuty alerts for each finding, routing through your existing on-call escalation policies. Best combined with --export-min-severity critical to avoid alert fatigue.

ServiceNow — Creates ServiceNow incident records. Supports OAuth token and username/password authentication. The target table is configurable (incident, custom tables, etc.).

Generic Webhook — POSTs a JSON payload to any URL for each finding. Supports Authorization headers, HMAC-SHA256 request signing, custom headers, and batch mode (all findings in one request).

Quick start

nat security-scan --spec ./openapi.yaml --base-url https://api.example.com \
  --export github-issues \
  --export-config token=$GITHUB_TOKEN \
  --export-config repo=myorg/myrepo \
  --export-min-severity medium

Swap github-issues for any other exporter_name from the table above, and replace the --export-config keys accordingly.

⚠️

Never hard-code tokens or passwords in commands or pipeline.yaml. Use environment variable references ($GITHUB_TOKEN, "${JIRA_API_TOKEN}") so credentials are not stored in shell history or CI logs.

Run nat doctor after configuring an exporter to verify connectivity. NAT will call test_connection() on each configured exporter and report whether it can reach the target system before you run a full scan.

See the Exporter Configuration guide for a complete reference of every required and optional key for each exporter, including multi-exporter usage examples.


Compatibility Status

Integration compatibility is tracked in the NAT compatibility matrix. Each entry includes supported authentication methods, known quirks with workarounds, and verified configuration examples.

Exporter Compatibility

Matrix schema 1.0 · Last updated 2026-04-15

Azure DevOps stable

Auth methods: pat

Required config: organization project pat

Optional config: work_item_type area_path iteration_path tags

Docs: /docs/guides/exporter-plugins#azure-devops

Known Quirks

QuirkWorkaroundResolved In
ado-area-path
Area path mismatches can cause work item creation failures.
Validate area and iteration paths in Azure DevOps before export.

Verified Configurations

ADO Bug Export · Verified 2026-03-13 · NAT 2.4.0

{
  "organization": "myco",
  "project": "API Security",
  "pat": "$AZDO_PAT",
  "work_item_type": "Bug"
}
Bugzilla deprecated

Auth methods: api_key

Required config: base_url product component api_key

Optional config: version priority severity

Docs: /docs/guides/exporter-plugins#bugzilla

Known Quirks

QuirkWorkaroundResolved In
bugzilla-legacy-fields
Some Bugzilla instances enforce required custom fields not covered by the default exporter payload.
Use instance-specific field defaults or migrate to a supported issue tracker integration.

Verified Configurations

Bugzilla Legacy Tracker · Verified 2026-02-28 · NAT 2.3.0

Deprecated exporter retained for legacy environments.

{
  "base_url": "https://bugs.myco.com",
  "product": "Platform",
  "component": "Security",
  "api_key": "$BUGZILLA_API_KEY"
}
Generic Webhook stable

Auth methods: none bearer_token api_key_header hmac_sha256

Required config: url

Optional config: method headers timeout_seconds signing_secret batch_mode

Docs: /docs/guides/exporter-plugins#webhook

Known Quirks

QuirkWorkaroundResolved In
webhook-retries
Non-2xx webhook responses are retried and can duplicate downstream ticket creation without idempotency.
Implement idempotency keys and return 2xx quickly before asynchronous processing.

Verified Configurations

Signed Webhook Export · Verified 2026-03-21 · NAT 2.4.1

{
  "url": "https://hooks.myco.com/nat-findings",
  "method": "POST",
  "headers": {
    "Authorization": "Bearer $WEBHOOK_TOKEN"
  },
  "signing_secret": "$WEBHOOK_HMAC_SECRET",
  "batch_mode": true
}
GitHub Issues stable

Auth methods: bearer_token github_app_token

Required config: token repo

Optional config: owner labels assignees milestone

Docs: /docs/guides/exporter-plugins#github-issues

Known Quirks

QuirkWorkaroundResolved In
github-label-sync
Issue label creation requires repository permissions when labels are missing.
Pre-create labels or grant the token permission to manage labels.

Verified Configurations

GitHub Actions Token · Verified 2026-03-20 · NAT 2.4.1

{
  "token": "$GITHUB_TOKEN",
  "repo": "myorg/security-backlog",
  "labels": [
    "nat",
    "security"
  ]
}
GitLab Issues stable

Auth methods: private_token

Required config: base_url project_id private_token

Optional config: confidential assignee_ids labels milestone

Docs: /docs/guides/exporter-plugins#gitlab

Known Quirks

No known quirks.

Verified Configurations

GitLab SaaS Export · Verified 2026-03-11 · NAT 2.4.0

{
  "base_url": "https://gitlab.com",
  "project_id": "123456",
  "private_token": "$GITLAB_TOKEN",
  "confidential": true
}
Jira Cloud stable

Auth methods: basic_email_token

Required config: base_url project_key email api_token

Optional config: issue_type component

Docs: /docs/guides/exporter-plugins#jira

Known Quirks

QuirkWorkaroundResolved In
jira-custom-fields
Custom Jira fields are not auto-mapped by default payload generation.
Use standard fields or map custom fields through workflow automation after issue creation.

Verified Configurations

Jira Cloud + Basic Auth · Verified 2026-03-15 · NAT 2.4.0

{
  "base_url": "https://myco.atlassian.net",
  "project_key": "NAT",
  "email": "ci-bot@myco.com",
  "api_token": "$JIRA_API_TOKEN",
  "issue_type": "Bug"
}
Linear stable

Auth methods: api_key_header

Required config: api_key team_id

Optional config: project_id label_ids assignee_id priority

Docs: /docs/guides/exporter-plugins#linear

Known Quirks

QuirkWorkaroundResolved In
linear-rate-limit
Bulk export can trigger Linear API rate limiting on large scans.
Enable NAT export batching and reduce concurrency for large finding sets.

Verified Configurations

Linear Team Export · Verified 2026-03-19 · NAT 2.4.0

Validated with labels and assignee mapping enabled.

{
  "api_key": "$LINEAR_API_KEY",
  "team_id": "ENG",
  "project_id": "security-hardening"
}
PagerDuty stable

Auth methods: api_token integration_key

Required config: routing_key

Optional config: severity_map dedup_key_prefix component group

Docs: /docs/guides/exporter-plugins#pagerduty

Known Quirks

QuirkWorkaroundResolved In
pagerduty-dedup
Repeated findings can deduplicate unexpectedly if the same dedup key is reused.
Set a deterministic dedup key prefix that includes environment and service context.

Verified Configurations

PagerDuty Critical Alerts · Verified 2026-03-18 · NAT 2.4.1

Best used with export-min-severity=critical.

{
  "routing_key": "$PAGERDUTY_ROUTING_KEY",
  "dedup_key_prefix": "nat-prod",
  "severity_map": {
    "critical": "critical",
    "high": "error",
    "medium": "warning"
  }
}
Sentry beta

Auth methods: bearer_token

Required config: organization project auth_token

Optional config: environment tags release

Docs: /docs/guides/exporter-plugins#sentry

Known Quirks

QuirkWorkaroundResolved In
sentry-event-grouping
Sentry may group similar NAT findings into a single issue depending on fingerprinting.
Set explicit fingerprint fields in exporter config when unique issue separation is required.

Verified Configurations

Sentry SaaS Export · Verified 2026-03-24 · NAT 2.5.0

Beta exporter for teams already using Sentry incident workflows.

{
  "organization": "myco",
  "project": "api-security",
  "auth_token": "$SENTRY_AUTH_TOKEN",
  "environment": "production"
}
ServiceNow beta

Auth methods: oauth_token basic_username_password

Required config: instance_url table

Optional config: oauth_token username password assignment_group caller_id

Docs: /docs/guides/exporter-plugins#servicenow

Known Quirks

QuirkWorkaroundResolved In
servicenow-custom-table
Custom table schemas may reject default NAT payload fields.
Use incident table or configure transform map to align payload fields.

Verified Configurations

ServiceNow OAuth Incident · Verified 2026-03-22 · NAT 2.5.0

Beta exporter; validated on incident table.

{
  "instance_url": "https://myco.service-now.com",
  "table": "incident",
  "oauth_token": "$SERVICENOW_OAUTH_TOKEN"
}
Shortcut stable

Auth methods: api_token

Required config: token project_id

Optional config: story_type workflow_state_id owner_ids labels

Docs: /docs/guides/exporter-plugins#shortcut

Known Quirks

No known quirks.

Verified Configurations

Shortcut Story Export · Verified 2026-03-12 · NAT 2.4.0

{
  "token": "$SHORTCUT_TOKEN",
  "project_id": "5001",
  "story_type": "bug"
}

Ingestor Compatibility

Matrix schema 1.0 · Last updated 2026-04-15

GraphQL Schema stable

Auth methods: none

Required config: source_path_or_url

Optional config: introspection_headers operation_allowlist max_depth

Docs: /docs/guides/graphql-testing

Known Quirks

QuirkWorkaroundResolved In
graphql-introspection-disabled
Production GraphQL endpoints may disable introspection.
Provide an SDL file or introspection JSON exported from a non-production environment.

Verified Configurations

SDL File Ingestion · Verified 2026-03-10 · NAT 2.4.0

{
  "source_path": "./schema.graphql",
  "max_depth": 8
}
gRPC Protobuf beta

Auth methods: none

Required config: proto_path

Optional config: import_paths service_allowlist emit_http_mapping

Docs: /docs/guides/grpc-scanning

Known Quirks

QuirkWorkaroundResolved In
grpc-reflection
Server reflection is not required but missing imports can break proto parsing.
Provide explicit import paths and compile-ready proto bundles.

Verified Configurations

Proto Directory Ingestion · Verified 2026-03-26 · NAT 2.5.0

Beta ingestor for teams with gRPC-heavy services.

{
  "proto_path": "./proto",
  "import_paths": [
    "./proto",
    "./third_party/proto"
  ]
}
HAR Archive stable

Auth methods: none

Required config: source_path

Optional config: dedupe_requests host_allowlist strip_cookies

Docs: /docs/getting-started/pipeline-quickstart

Known Quirks

QuirkWorkaroundResolved In
har-noise
Large browser captures can include static assets and unrelated API calls.
Use host allowlists and request filtering before ingestion.

Verified Configurations

Proxy-Captured HAR · Verified 2026-03-16 · NAT 2.4.0

{
  "source_path": "./captures/app.har",
  "dedupe_requests": true,
  "strip_cookies": true
}
OpenAPI 3.x stable

Auth methods: none

Required config: source_path_or_url

Optional config: resolve_remote_refs strict_validation server_override

Docs: /docs/getting-started/pipeline-quickstart

Known Quirks

No known quirks.

Verified Configurations

OpenAPI File Ingestion · Verified 2026-03-17 · NAT 2.4.1

{
  "source_path": "./openapi.yaml",
  "resolve_remote_refs": true
}
Postman Collection stable

Auth methods: none

Required config: source_path

Optional config: environment_path resolve_variables folder_filter

Docs: /docs/getting-started/pipeline-quickstart

Known Quirks

QuirkWorkaroundResolved In
postman-pre-request
Dynamic pre-request scripts are not fully evaluated outside Postman runtime.
Materialize critical variables in an exported environment file.

Verified Configurations

Collection + Environment · Verified 2026-03-14 · NAT 2.4.0

{
  "source_path": "./postman/collection.json",
  "environment_path": "./postman/env.json",
  "resolve_variables": true
}
Swagger 2.0 deprecated

Auth methods: none

Required config: source_path_or_url

Optional config: auto_convert_to_openapi3 server_override

Docs: /docs/getting-started/pipeline-quickstart

Known Quirks

QuirkWorkaroundResolved In
swagger2-conversion
Some Swagger 2 vendor extensions may be dropped during OpenAPI 3 conversion.
Run pre-conversion with explicit extension handling or provide native OpenAPI 3 specs.

Verified Configurations

Swagger 2 Legacy Spec · Verified 2026-03-03 · NAT 2.3.1

Deprecated path; migrate to native OpenAPI 3 when possible.

{
  "source_path": "./swagger.json",
  "auto_convert_to_openapi3": true
}
WSDL beta

Auth methods: none

Required config: source_path_or_url

Optional config: soap_version binding_allowlist flatten_imports

Docs: /docs/getting-started/pipeline-quickstart

Known Quirks

QuirkWorkaroundResolved In
wsdl-import-resolution
Nested WSDL imports with private network paths can fail in CI.
Vendor all imported schemas locally and reference them with relative paths.

Verified Configurations

WSDL Contract Ingestion · Verified 2026-03-27 · NAT 2.5.0

Beta ingestor focused on SOAP migration workloads.

{
  "source_path": "./contracts/service.wsdl",
  "flatten_imports": true
}

Pipeline overview

The nat pipeline command runs the full Ingest → Prioritize → Scan → Export → Learn loop in a single command:

nat pipeline --config pipeline.yaml
┌─────────────┐     ┌──────────────────────┐     ┌───────────────┐
│   Ingest    │ ──▶ │ Transform + Prioritize│ ──▶ │     Scan      │
│  (parse     │     │  (rank endpoints by   │     │  (OWASP tests │
│   spec)     │     │   belief-guided risk) │     │   vs live API)│
└─────────────┘     └──────────────────────┘     └───────┬───────┘

                    ┌─────────────┐     ┌────────────────▼───────┐
                    │    Learn    │ ◀── │        Export          │
                    │ (save scan  │     │  (send findings to     │
                    │  feedback)  │     │   GitHub, Jira, etc.)  │
                    └─────────────┘     └────────────────────────┘

Using nat pipeline instead of running each step manually gives you structured ingestion, belief-guided prioritization, automatic export, and a feedback loop that improves future runs — all configured in a single YAML file.

See the Pipeline Quickstart for a complete step-by-step guide.


Custom integrations

Both ingestors and exporters are pluggable. You can write your own by extending the base classes:

  • Custom ingestor — extend BaseIngestor and implement the ingest() method. Load your plugin with --ingestors-dir ./ingestors.
  • Custom exporter — extend BaseExporter and implement export_finding() (and optionally test_connection()). Load your plugin with --exporters-dir ./exporters.
# Load a custom exporter from a local directory
nat security-scan --spec ./openapi.yaml --base-url https://api.example.com \
  --export my-custom-exporter \
  --exporters-dir ./exporters
 
# Load a custom ingestor from a local directory
nat pipeline --config pipeline.yaml \
  --ingestors-dir ./ingestors

See the Custom Check Plugins guide for patterns on writing and registering plugins.


Next steps

Was this helpful?