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.
| Format | ingestor_name | Accepted extensions |
|---|---|---|
| OpenAPI 3.x / Swagger 2.x | openapi | .yaml, .json |
| Postman Collection | postman | .json |
| GraphQL Schema | graphql | .graphql, .gql, introspection JSON |
| HAR Archive | har | .har |
| Gherkin / BDD | gherkin | .feature |
| cURL Commands | curl | .sh, .txt |
| BGSTM Test Plans | bgstm | .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 URLCLI shortcut — skip the config file and pass a spec directly:
nat security-scan --spec ./openapi.yaml --base-url https://api.example.comReplace --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.
| Exporter | exporter_name | Destination |
|---|---|---|
| GitHub Issues | github-issues | GitHub repository issues |
| Jira Cloud | jira | Jira Cloud project |
| GitLab Issues | gitlab | GitLab.com or self-hosted GitLab |
| Linear | linear | Linear workspace |
| Azure DevOps | azure-devops | Azure DevOps work items |
| Shortcut | shortcut | Shortcut (formerly Clubhouse) stories |
| PagerDuty | pagerduty | PagerDuty incidents / alerts |
| ServiceNow | servicenow | ServiceNow incident table |
| Generic Webhook | webhook | Any 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 mediumSwap 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
| Quirk | Workaround | Resolved 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
BaseIngestorand implement theingest()method. Load your plugin with--ingestors-dir ./ingestors. - Custom exporter — extend
BaseExporterand implementexport_finding()(and optionallytest_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 ./ingestorsSee the Custom Check Plugins guide for patterns on writing and registering plugins.