Developers · Test keys

The real engine, off the meter.

A sk_test_ key runs the same validation and patching as a live key. The response says so in a header and in the body, and nothing is counted or stored as a flow.

Two kinds of test key
KeyRequestsValidWhere
Instant key10 in total1 hourPOST /api/developers/instant-key, no account, 10 keys a day per address.
Account test keynot metereduntil revokedCreated next to your live key; shown under Dashboard → API.
Instant key
curl -X POST https://www.invoicenavigator.eu/api/developers/instant-key

Both are rate-limited to 100 requests an hour, regardless of plan.

Test versus live
sk_test_sk_live_
EngineThe same rules, patches and re-validation.The same.
Monthly quotaNot counted.100 (Free) or 5,000 (Team) requests.
Requests per hour10060 (Free) or 100 (Team).
Flow recordNone: no flowId, no fixWithInput link, no stored XML.Stored; fixWithInput available when input is needed.
ResponseX-Test-Mode: true header, meta.testMode: true.Neither.
WebhooksPayload carries testMode: true.No testMode field.
When the hour is used up
HTTP/1.1 429 Too Many Requests
Retry-After: 1800
X-Test-Mode: true

{
  "success": false,
  "error": {
    "code": "RATE_LIMITED",
    "message": "Test mode rate limit exceeded (100 requests/hour). Use a production key for higher limits."
  }
}

Wait for Retry-After. Instant keys additionally answer 402 QUOTA_EXCEEDED after their 10 requests and 401 KEY_EXPIRED after the hour.

Webhooks in test mode

A webhookUrl given to POST /v1/validate is called for test keys as well. Filter on the top-level flag.

{
  "event": "validation.completed",
  "testMode": true,
  "timestamp": "…",
  "data": { "validationRef": "VAL-…", "isValid": true, "format": "ubl" }
}
Switching to live

Replace the key. Endpoints, parameters and response shape are identical; the base URL stays https://www.invoicenavigator.eu/api. Calls to POST /v2/validate-and-fix then count as 2 requests each. The production page lists what to check first.