Skip to content

Deny codes ​

When the regional gateway rejects a tenant request before relaying to your backend, you typically receive HTTP 502 with:

  • Content-Type: application/vnd.xg3.error+json
  • JSON body: { "code": "...", "message": "..." }
  • X-Xg3-Request-Id — use with console Request Lookup

OAuth token errors (POST /oauth/token) use 401/403 with standard OAuth error JSON instead — not covered in detail here.

RateLimited is HTTP 429 (not 502) and includes Retry-After — Service ingress rate limits.

How to read the error ​

json
{
  "code": "TokenInvalid",
  "message": "Secret is corrupt"
}
FieldMeaning
codeMachine-readable deny reason (PascalCase string)
messageHuman-readable explanation
X-Xg3-Request-IdCorrelation id on response headers

Deny code reference ​

CodeTypical causeWhat to do
RegionMismatchService region does not match hostname regionUse correct regional hostname
ServiceNotFoundUnknown service id or deleted serviceCheck service id in URL; create or restore service
ServiceDisabledService or account disabledEnable in console
TokenMissingRequired auth header missing or emptySend X-Xg3-Authorization or X-Xg3-Service-Key per service auth mode
TokenInvalidBad JWT, wrong secret, or invalid service keyRe-mint token; verify credential or key
TokenExpiredJWT past expiryGet a new token from /oauth/token
TokenRevokedCredential revokedRotate credential and mint new token
PolicyDeniedBoth auth headers sent on same requestUse only one of JWT or service key
AgentUnavailableAgent disabled or not connected at authorize timeCheck agent enabled and tunnel status
RateLimitedToo many requestsHonor Retry-After; see Service ingress rate limits
CredentialDisabledOAuth credential disabled or missingEnable or recreate credential
AudienceMismatchToken or credential not valid for this service hostnameFix scope at mint; update credential allowlist
KeyNotAllowedForServiceCredential or key not allowed for this serviceAdd service to allowlist
RenewalLimitExceededAgent certificate renewal limitDo not restart agent in a loop — contact support
AgentDisabledAgent disabledEnable agent in console
AuthModeNotSupportedWrong auth mechanism for service (e.g. key on JWT-only service)Match client to service auth modes
AccountNotFoundAccount in token scope does not existVerify account id
AccountDisabledAccount disabledContact account admin
InvalidScopeOAuth scope format wrongUse account:ACCOUNT_ID service:SERVICE_ID
ScopeAccountMismatchScope account does not match credentialAlign scope with credential account
InternalBackendAccessDeniedBackend URL is private/internal and agent not permittedSee below
TrialExpiredAccount trial ended without subscriptionSubscribe on Billing

Gateway-only statuses (not in table above) include ControlPlaneUnavailable, AGENT_UNAVAILABLE (504), TUNNEL_OVERLOADED — see Troubleshooting.

Backend TLS errors ​

When the agent cannot complete a TLS handshake to your HTTPS backend under the service’s TLS Policy, the client receives HTTP 502 with:

  • Content-Type: application/vnd.xg3.error+json
  • Header X-Xg3-Status: XG3_BACKEND_TLS_ERROR (also present as error.code)
  • Nested envelope:
json
{
  "error": {
    "code": "XG3_BACKEND_TLS_ERROR",
    "message": "Backend TLS failed: the certificate was not signed by a trusted CA.",
    "request_id": "...",
    "details": {
      "policy": "strict",
      "reason": "unknown_ca",
      "sha256_spki": "...",
      "sha256_cert_der": "..."
    }
  }
}
details.reasonTypical meaning
unknown_caCertificate not issued by a trusted CA (strict mode)
hostname_mismatchCertificate does not match the backend hostname
expired / not_yet_validCertificate validity window
pin_mismatchLeaf does not match a configured pin
malformed_policyPinning configured without usable pins

Use sha256_spki or sha256_cert_der from details (or Request Lookup) as the pin algorithm and digest when configuring Pinning on the service — the console algorithm values use the same names. See TLS Policy.

TrialExpired ​

Your account’s 14-day free trial has ended and there is no active subscription.

Symptoms:

  • Ingress requests return 502 with code: "TrialExpired"
  • You cannot enable agents or Services in the console

Fix: An account admin opens Billing, chooses a plan, and completes Subscribe (Stripe Checkout). After payment, status becomes Active and access is restored.

See Billing and subscriptions for the full lifecycle.

InternalBackendAccessDenied ​

Your service backend base URL points to a private or internal network address (for example http://localhost, https://192.168.1.10, or https://app.internal.local), and the agent is not permitted to reach internal targets.

Fix (choose one):

  1. In the console, open the agent for this service → Edit settings → enable Allow internal backend targets; or
  2. Change the service backend URL to a publicly routable address reachable from your agent host.

Important: Disabling Allow internal backend targets immediately stops traffic to affected services — you do not need to edit each service separately.

Internal addresses include common private IP ranges, loopback, link-local addresses, and hostnames like localhost and *.local. Hostnames that only resolve to private IPs through DNS may not be detected unless they match these rules.

When creating or editing a service, the console may block an internal URL before submit if the agent setting is off.