Skip to content

Error Handling

All errors return a consistent JSON format:

{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable description",
"request_id": "abc123"
}
}

Some error types include additional fields (e.g., upgrade_url, register_url) — see the examples below.

HTTP StatusCodeDescription
400INVALID_VAT_IDVAT ID format is invalid
401UNAUTHORIZEDMissing or invalid API key
401ANONYMOUS_LIMIT_REACHEDAnonymous trial ceiling hit; register for a free API key to continue
402quota_exceededMonthly quota exceeded on free tier; upgrade to continue
404NOT_FOUNDEndpoint or resource not found
429RATE_LIMITEDPer-minute burst limit exceeded; back off and retry (never returned for monthly quota limits)
500INTERNAL_ERRORUnexpected server error
503SOURCE_UNAVAILABLEAll upstream validation sources unavailable

When the anonymous (Tier 0) trial ceiling is reached, the API returns 401 with:

{
"error": "anonymous_limit_reached",
"message": "Register for a free API key to continue (100 calls/month, no payment required).",
"register_url": "https://api.giltiq.de/v1/register"
}

When the free-tier monthly quota is exhausted, the API returns 402 with:

{
"error": "quota_exceeded",
"message": "Monthly free tier limit reached. Upgrade to continue.",
"upgrade_url": "https://giltiq.de/pricing/"
}

Every response includes usage tracking headers:

  • X-Giltiq-Usage — Current usage vs. limit, e.g. 85/100
  • X-Giltiq-Upgrade — Upgrade URL (e.g. https://giltiq.de/pricing/); present only when usage exceeds 80% of the plan limit

On 429 responses (per-minute burst limiter only):

  • X-RateLimit-Limit — Maximum requests allowed per minute
  • X-RateLimit-Remaining — Requests remaining in the current window
  • X-RateLimit-Reset — Unix timestamp when the window resets
  • Retry-After — Seconds until the per-minute rate limit resets