Tierux API error codes and how to resolve them. All errors follow a consistent format with machine-readable codes and human-readable messages.
All Tierux API errors follow this structure:
// Error response { "ok": false, "error": "ERROR_CODE", "message": "Human-readable description" }
HTTP status codes are used appropriately: 400 for client errors, 401 for authentication, 404 for not found, 500 for server errors.
UNAUTHORIZED (401) → API key missing or invalid. Check your Authorization header. FORBIDDEN (403) → Valid key, but insufficient permissions for this resource. INVALID_API_KEY (401) → API key format is invalid (must be pe_live_… prefix).
INVALID_TOKEN (400) → The purchase token failed store verification. Possible: token expired, revoked, or from different app. TOKEN_ALREADY_VERIFIED (409) → This purchase token was already verified. The existing entitlement state is returned in the response body. INVALID_REQUEST (400) → Required fields missing (appId, userId, productId, etc.) or JSON body is malformed. Also returned when userId, productId, or entitlementId contain characters outside [A-Za-z0-9._:-] — these are opaque keys, so emails or any value with '/', '@', or spaces are rejected. Use a Firebase uid or a random customer key. APP_NOT_FOUND (404) → The specified appId does not exist in this project. PRODUCT_NOT_MAPPED (400) → The productId has no entitlement mapping configured. Map products via MCP or dashboard before verifying.
ENTITLEMENT_NOT_FOUND (404) → No entitlement record for this userId + entitlement. This is normal for users who have never purchased. USER_NOT_FOUND (404) → This userId has no entitlements at all in this project. ENTITLEMENT_EXPIRED (200 — not an error) → The entitlement exists but has expired. active = false.
WEBHOOK_VALIDATION_FAILED (400) → Incoming webhook JWT signature or audience validation failed. INTERNAL_ERROR (500) → Unexpected server error. Tierux logs the full details. If persistent, check the status page or contact support. RATE_LIMITED (429) → Too many requests. Retry after the Retry-After header value.
PLAY_API_ERROR (502) → Google Play Developer API returned an error. Check that your Google Play service account is valid. PLAY_QUOTA_EXCEEDED (429) → Google Play API quota exceeded. Tierux retries with exponential backoff; if persistent, contact support.
How Tierux handles purchase tokens — hashing, encryption, and verification.
Webhook configuration — RTDN, App Store Notifications, and event handling.
Checklist for Tierux configuration, required store-console work, REST integration, and purchase verification.
Free tier — unlimited apps, 1 paywall. No credit card, no revenue share.
Start free