Documentation
Guides
Billing & Plans

Billing & Plans

This guide covers NAT's pricing tiers, how quota enforcement works, how to upgrade or downgrade your plan, and how to respond to usage alerts.

Pricing tiers

NAT offers four plans designed to match teams of all sizes:

FeatureFreePro ($79/mo)Team ($199/mo)Enterprise
Functional scans / month505002,000Unlimited
Security scans / monthβ€”100500Unlimited
Requests / minute301203001,000
Concurrent scans131050
Functional testingβœ…βœ…βœ…βœ…
Security scanningβŒβœ…βœ…βœ…
WebhooksβŒβŒβœ…βœ…
API specs15UnlimitedUnlimited
Export formatsHTML, JSON, CSVHTML, JSON, CSV, PDFHTML, JSON, CSV, PDFHTML, JSON, CSV, PDF (white-label)
AI queries/month5UnlimitedUnlimitedUnlimited
Compliance reports/monthβ€”5UnlimitedUnlimited
Dashboard AI chatβŒβœ…βœ…βœ…
Proactive insightsβŒβœ…βœ…βœ…
BGSTM audit trailβŒβŒβœ…βœ…
Priority supportβŒβŒβœ…βœ…
SSO / SAMLβŒβŒβŒβœ…
Dashboard accessβœ…βœ…βœ…βœ…
API accessβœ…βœ…βœ…βœ…

The Free plan is available without a credit card. Sign up at app.nat-testing.io/signup (opens in a new tab) to get started.

Enterprise plans include custom quotas, SLAs, and dedicated support. Contact us for pricing.


Quota enforcement

Each scan you start counts against your monthly quota. Quota resets on the first day of each billing period.

What happens when quota is exhausted

When you have consumed all scans for the period, any new POST /api/v1/scan request returns:

HTTP/1.1 402 Payment Required
Content-Type: application/json
 
{
  "error": "QUOTA_EXCEEDED",
  "message": "Monthly scan quota exhausted. Quota resets on 2026-02-01.",
  "quota_reset_date": "2026-02-01T00:00:00Z"
}

In-flight scans are not interrupted β€” only new scan requests are blocked.

Checking your current usage

Use the Usage API to see your current consumption at any time:

curl https://api.nat-testing.io/api/v1/usage \
  -H "X-API-Key: $NAT_API_KEY"

See Usage & Quotas API for the full response schema.


Approaching-limit warnings

When your usage crosses 80% of your monthly quota, NAT sets approaching_limit: true in the /api/v1/usage response and sends a usage_update event over the WebSocket connection.

NAT also sets the X-NAT-Usage-Warning response header on every API response once you cross the 80% threshold:

X-NAT-Usage-Warning: Approaching quota limit (85% used). Upgrade at https://app.nat-testing.io/dashboard

You can check for this header in your integration code to surface proactive warnings:

response = requests.post(...)
if "X-NAT-Usage-Warning" in response.headers:
    print("Warning:", response.headers["X-NAT-Usage-Warning"])

You can also poll the alerts history endpoint:

curl https://api.nat-testing.io/api/v1/usage/alerts \
  -H "X-API-Key: $NAT_API_KEY"
⚠️

Plan ahead β€” if you are running automated scans in CI/CD, set up an alert handler early so you are not caught off guard at quota exhaustion.


Upgrading your plan

Via the dashboard

  1. Log in at app.nat-testing.io (opens in a new tab)
  2. Navigate to Settings β†’ Billing
  3. Click Upgrade Plan
  4. Choose Pro or Team and complete the Stripe checkout flow

Your quota is updated immediately upon payment confirmation. The API key remains the same.

Via the API

Create a checkout session programmatically:

curl -X POST https://api.nat-testing.io/api/v1/billing/checkout \
  -H "X-API-Key: $NAT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "price_id": "price_pro_monthly",
    "success_url": "https://app.nat-testing.io/dashboard?checkout=success",
    "cancel_url": "https://app.nat-testing.io/pricing"
  }'

Redirect the user to the returned checkout_url. See Billing API for full details.


Downgrading your plan

To downgrade, open the Stripe billing portal:

curl -X POST https://api.nat-testing.io/api/v1/billing/portal \
  -H "X-API-Key: $NAT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "return_url": "https://app.nat-testing.io/dashboard"
  }'

Redirect the user to the returned portal_url. In the portal, they can change plan, update payment details, or cancel their subscription.

⚠️

Downgrading from Pro or Team to a lower tier will reduce your quota on the next billing cycle. Pro/Team-only features (AI Assistant, compliance reports, visual regression, accessibility, performance) will no longer appear in scan results.


Stripe webhook integration

NAT listens for Stripe events at POST /api/v1/billing/webhook to keep tenant state in sync:

Stripe eventAction
checkout.session.completedTenant provisioned, API key issued
customer.subscription.updatedPlan tier and quota updated
customer.subscription.deletedTenant downgraded to Free
invoice.payment_failedPayment failure notification sent
invoice.paidSubscription renewed, quota reset
charge.refundedRefund processed, plan downgraded if applicable

If you are self-hosting NAT, set the STRIPE_WEBHOOK_SECRET environment variable to the signing secret from your Stripe dashboard. See the self-hosted setup guide for full environment variable documentation.


See also

Was this helpful?