Code
37
SDK error · code 37
What it means
signatureVerificationFailed (code 37 on iOS, 36 on Android) means a response did not pass the SDK's signature check. The SDK raises it only when verification is enforced. In the usual informational mode it logs the failure and marks customer info FAILED but still works. The stock SDK checks RevenueCat's key, which RevenueDot cannot sign with, so turn verification off.
Code
37
iOS (Swift)
ErrorCode.signature
Android (Kotlin)
PurchasesErrorCode.Signature
Causes
SignatureVerificationException becomes SignatureVerificationError (errors.kt). Android numbers it 36, while iOS uses 37.Fix
Set the entitlement verification mode to disabled in the SDK configuration. Native iOS and Android default to informational, so they log a failure against RevenueDot until you do.
It would reject every RevenueDot response. Use the stock SDK in disabled mode.
To get VERIFIED, give the server a signing key and build the SDK forks with its public key. See signature verification failed in proxy mode.
GET /.well-known/revenuedot-signing-key on your server returns the public key it signs with. Compare it with the key in your SDK build.
In your app
// Swift
do {
let result = try await Purchases.shared.purchase(package: package)
} catch let error as ErrorCode where error == .signatureVerificationFailed {
// handle signature verification failed
}
// Kotlin
if (error.code == PurchasesErrorCode.SignatureVerificationError) { /* ... */ } On RevenueDot: RevenueDot signs every 2xx and 3xx response under /v1 and /rcbilling when REVENUEDOT_SIGNING_KEY is set, with Ed25519, and serves the public key at /.well-known/revenuedot-signing-key. The stock SDK cannot trust that key, so it reads every RevenueDot response as FAILED until you disable verification or use a fork built with the key. See Trusted Entitlements.
FAQ
The stock SDK trusts only RevenueCat's signing key, and RevenueDot cannot sign with it. In informational mode access still works. Set the verification mode to disabled to silence it.
The Android enum numbers SignatureVerificationError 36, while iOS and the hybrid enums use 37. Match by name.
The React Native PURCHASES_ERROR_CODE enum in the SDK source has no member for it, so compare error.code with the string "37". In Flutter, convert the PlatformException with PurchasesErrorHelper.getErrorCode(e) and compare the result with PurchasesErrorCode.signatureVerificationFailed. On iOS the readable name in userInfo is SIGNATURE_VERIFICATION_FAILED.
Get started
RevenueDot answers the same SDK calls with the same error codes. Start free on RevenueDot Cloud, free up to $10,000 a month in tracked revenue.
Already have an account? Sign in · Prefer your own servers? Self-host free