{"id":13607,"date":"2026-10-04T05:01:45","date_gmt":"2026-10-04T05:01:45","guid":{"rendered":"https:\/\/pvapins.com\/blog\/?p=13607"},"modified":"2026-10-04T05:01:45","modified_gmt":"2026-10-04T05:01:45","slug":"firebase-keeps-saying-wrong-otp","status":"publish","type":"post","link":"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/","title":{"rendered":"Why Firebase Keeps Saying Wrong OTP? Fix It Now"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13608\" src=\"https:\/\/pvapins.com\/blog\/wp-content\/uploads\/2026\/10\/Firebase-Wrong-OTP-Fix-Guide.png\" alt=\"Firebase Keeps Saying Wrong OTP\" width=\"1448\" height=\"1086\" srcset=\"https:\/\/pvapins.com\/blog\/wp-content\/uploads\/2026\/10\/Firebase-Wrong-OTP-Fix-Guide.png 1448w, https:\/\/pvapins.com\/blog\/wp-content\/uploads\/2026\/10\/Firebase-Wrong-OTP-Fix-Guide-300x225.png 300w, https:\/\/pvapins.com\/blog\/wp-content\/uploads\/2026\/10\/Firebase-Wrong-OTP-Fix-Guide-1024x768.png 1024w, https:\/\/pvapins.com\/blog\/wp-content\/uploads\/2026\/10\/Firebase-Wrong-OTP-Fix-Guide-768x576.png 768w\" sizes=\"auto, (max-width: 1448px) 100vw, 1448px\" \/><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-flat ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#Why_Firebase_Keeps_Saying_Wrong_OTP_The_Real_Reason_Its_Not_a_Typo\">Why Firebase Keeps Saying Wrong OTP: The Real Reason It&#8217;s Not a Typo<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#Firebase_OTP_Mismatch_Error_What_the_API_Is_Actually_Telling_You\">Firebase OTP Mismatch Error: What the API Is Actually Telling You<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#The_6-Minute_Clock_Problem_Why_Your_Code_Expires_Before_You_Enter_It\">The 6-Minute Clock Problem: Why Your Code Expires Before You Enter It<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#Firebase_Wrong_OTP_API_Response_Decoding_authinvalid-verification-code\">Firebase Wrong OTP API Response: Decoding auth\/invalid-verification-code<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#Firebase_Wrong_OTP_API_Error_Code_authmissing-verification-id_vs_Code_Mismatch\">Firebase Wrong OTP API Error Code: auth\/missing-verification-id vs. Code Mismatch.<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#The_Resend_Trap_Why_Requesting_a_Second_Code_Breaks_the_First_One\">The Resend Trap: Why Requesting a Second Code Breaks the First One<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#Firebase_Auto_Read_OTP_Wrong_Why_SMS_Retrieval_Fetches_the_Last_Code\">Firebase Auto Read OTP Wrong: Why SMS Retrieval Fetches the Last Code<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#Firebase_SMS_Auto_Read_Incorrect_Code_The_Broadcast_Receiver_Formatting_Bug\">Firebase SMS Auto Read Incorrect Code: The Broadcast Receiver Formatting Bug<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#Firebase_OTP_Autofill_Wrong_Verification_Androids_SMS_Retriever_vs_App_Check\">Firebase OTP Autofill Wrong Verification: Android&#8217;s SMS Retriever vs. App Check<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#Firebase_Wrong_OTP_from_Auto_Retrieval_Test_the_Manual_Entry_Path_First\">Firebase Wrong OTP from Auto Retrieval: Test the Manual Entry Path First<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#How_to_Fix_Firebase_OTP_Not_Matching_Entered_Code\">How to Fix Firebase OTP Not Matching Entered Code<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#Firebase_Verification_API_Wrong_Code_Handling_Best_Practices_for_Your_Backend\">Firebase Verification API Wrong Code Handling: Best Practices for Your Backend<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#When_the_Number_Is_the_Problem_Testing_Without_a_Real_SIM\">When the Number Is the Problem: Testing Without a Real SIM<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#Preventing_Wrong_OTP_Errors_in_Production_A_Checklist_for_Developers\">Preventing Wrong OTP Errors in Production: A Checklist for Developers<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#Key_Takeaways\">Key Takeaways<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/pvapins.com\/blog\/firebase-keeps-saying-wrong-otp\/#FAQ\">FAQ<\/a><\/li><\/ul><\/nav><\/div>\n\n<p><span style=\"font-weight: 400;\">You implemented Firebase Phone Authentication, tested it once in the emulator, and shipped it. Now your users are hitting a wall: Firebase keeps saying the OTP is wrong even when they copy the code from the SMS perfectly. The frustration is real, and the cause is rarely a user typo.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This guide is for Android, iOS, and web developers who need to diagnose why Firebase rejects a one-time passcode. You&#8217;ll learn the exact API error codes that indicate deeper configuration problems, why auto-read features fetch stale codes, and a step-by-step fix path. By the end, you&#8217;ll have a checklist to eliminate 90% of OTP mismatch complaints before they reach your support inbox.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Use this when you see auth\/invalid-verification-code in logs or when users report wrong code errors. Do not use this guide for issues with SMS delivery delays (codes arriving after expiry) or for re CAPTCHA flow failures that have different root causes.<\/span><\/p>\n<h3><b>Quick Answer: Why Firebase Keeps Saying Wrong OTP<\/b><\/h3>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">The submitted code doesn&#8217;t match the verificationId in the current session, not necessarily a user typo.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">The 60-second default TTL expires before submission, returning a mismatch instead of an expiry error.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Auto-read parsing bugs (regex, leading zeros, stale SMS) submit the wrong digits.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Resending a code invalidates the previous verificationId users entering the old code get a mismatch.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">A missing or stale verificationId (after Activity recreation) causes auth\/missing-verification-id, which looks like a wrong code to users.<\/span><\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Why_Firebase_Keeps_Saying_Wrong_OTP_The_Real_Reason_Its_Not_a_Typo\"><\/span><b>Why Firebase Keeps Saying Wrong OTP: The Real Reason It&#8217;s Not a Typo<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Here&#8217;s the thing most developers miss: when Firebase says the OTP is wrong, it&#8217;s usually not because the user typed it incorrectly. The real culprit is often a mismatch between the verification ID stored in your app&#8217;s memory and the code being submitted.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Firebase links each OTP to a specific verification Id. If your app overwrites or clears that ID before the code is entered, Firebase rejects the code as invalid even when the code itself is perfectly correct. That&#8217;s the dirty little secret of Firebase&#8217;s error messaging: it&#8217;s vague by design, and wrong code can mean a half-dozen different things.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Let&#8217;s break down the usual suspects:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Session state loss:<\/b><span style=\"font-weight: 400;\"> The verification Id is held in memory, not persisted. If the Activity is recreated or the app is background, the ID is lost, and the submitted code references a dead session.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Multi-instance conflict:<\/b><span style=\"font-weight: 400;\"> If two Phone Auth Provider.verify Phone Number calls fire simultaneously, only the last verification Id is valid. The earlier code will always return invalid-verification-code.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>User error vs. system error:<\/b><span style=\"font-weight: 400;\"> A wrong OTP alert can mask an expired token. Firebase&#8217;s default time-to-live is 60 seconds; a user who waits too long gets a mismatch, not an expiry message.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Format stripping:<\/b><span style=\"font-weight: 400;\"> If your code strips the leading zero or adds a whitespace, the token mismatch triggers a false negative.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The core issue is that Firebase&#8217;s error messaging is generic. It says wrong code for what are actually four distinct failures: expired token, stale ID, malformed input, or an actual typo. Your debugging job is to distinguish between them.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Firebase_OTP_Mismatch_Error_What_the_API_Is_Actually_Telling_You\"><\/span><b>Firebase OTP Mismatch Error: What the API Is Actually Telling You<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The Firebase OTP mismatch error is a server-side rejection, not a client-side validation failure. When you call sign In With Credential, Firebase compares the hash of the submitted code against the hash of the code sent to the device. A mismatch error means the code you submitted does not match the one-time token issued to that specific verification Id in that specific session.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Here&#8217;s what&#8217;s happening under the hood:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Hash comparison:<\/b><span style=\"font-weight: 400;\"> Firebase stores a salted hash of the OTP, not the raw code. This is why you cannot retrieve the correct code from the token; you must capture the SMS text.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>verification Id is the key:<\/b><span style=\"font-weight: 400;\"> The ID points to the user&#8217;s phone number and the generated code. Incorrect code + correct ID = mismatch; correct code + incorrect ID = mismatch, too.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Timeout is baked in:<\/b><span style=\"font-weight: 400;\"> Firebase invalidates the code after the TTL expires. If the user submits after the window, the API returns a mismatch, not an expiration notice.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Multi-factor interplay:<\/b><span style=\"font-weight: 400;\"> If you have multiple Firebase projects (dev and prod) with the same SHA-1 fingerprint, the backend may route the SMS to the wrong project, causing a permanent mismatch.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Understanding this architecture changes how you debug. You stop asking why is the code wrong? and start asking which verification Id is my app submitting, and is it the one tied to this code?<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"The_6-Minute_Clock_Problem_Why_Your_Code_Expires_Before_You_Enter_It\"><\/span><b>The 6-Minute Clock Problem: Why Your Code Expires Before You Enter It<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Here&#8217;s a misconception that bites developers hard: many assume Firebase OTPs last long enough for slow users, but the default time-to-live is 60 seconds, not 6 minutes. If a user takes longer than that, the server invalidates the code, and the client receives a generic wrong OTP message.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This is the most common cause of the wrong OTP after a complaint. Here&#8217;s the typical scenario: users type the first code after the window passes, then request a resend, and enter the old code. Mismatch. Every time.<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Default TTL:<\/b><span style=\"font-weight: 400;\"> Firebase&#8217;s SMS code expires after 60 seconds. You can set force Resending Token to manage resends, but you cannot extend the TTL.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>User experience gap:<\/b><span style=\"font-weight: 400;\"> On average, it takes users 25+ seconds to switch from the SMS app back to your app. If they pause to read the text or get distracted, they lose the race.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>The resend paradox:<\/b><span style=\"font-weight: 400;\"> Requesting a new code does not invalidate the first one immediately. However, the first code&#8217;s TTL is still running. Entering the old code after a resend will cause a mismatch.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Fix: Persist the timestamp:<\/b><span style=\"font-weight: 400;\"> Store the verification Id and a timestamp in your app&#8217;s View Model so you can show a Code Expired, Resend state instead of a generic wrong code error.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The solution is not to ask users to type faster. It&#8217;s to make your UI aware of the clock. If the user&#8217;s submission arrives after the 60-second window, show Code expired. Resend now. instead of Incorrect code.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Firebase_Wrong_OTP_API_Response_Decoding_authinvalid-verification-code\"><\/span><b>Firebase Wrong OTP API Response: Decoding auth\/invalid-verification-code<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The most common wrong OTP API response is auth\/invalid-verification-code. This error means Firebase received a code that doesn&#8217;t match the one issued for the given verification Id. It is not a network error; it is a definitive token mismatch. If you see this error in your logs, the issue is almost always in the code submission flow, not in the SMS delivery.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Let&#8217;s get specific about what this error does and doesn&#8217;t tell you:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Distinct from auth\/invalid-phone-number:<\/b><span style=\"font-weight: 400;\"> This error confirms the phone number was accepted; the problem is isolated to the code itself.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Check the credential object:<\/b><span style=\"font-weight: 400;\"> Ensure you are passing Phone Auth Provider credential(verification Id, code) with the correct ID. A stale ID in a singleton is a frequent bug.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Log the full response:<\/b><span style=\"font-weight: 400;\"> The Firebase Auth API returns a detailed message alongside the error code. Capture error. message to see if it specifies invalid verification code or expired.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Retry logic is essential:<\/b><span style=\"font-weight: 400;\"> You should not let the user retry the same code. The correct UX is to force a resend, and use force Resending Token to ensure a fresh token.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Refer to the Firebase Auth Error Codes Reference for the full taxonomy. When you see this error, your first move should be to log the verification Id and the code separately. Nine times out of ten, one of them is not what you expect.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Firebase_Wrong_OTP_API_Error_Code_authmissing-verification-id_vs_Code_Mismatch\"><\/span><b>Firebase Wrong OTP API Error Code: auth\/missing-verification-id vs. Code Mismatch<\/b><span style=\"font-weight: 400;\">.<\/span><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The error auth\/missing-verification-id is distinct from a code mismatch. It means Firebase never received a verification Id to associate with the code. This error occurs when your app sends the credential without the ID a classic mistake after an Activity gets killed in the background. The code itself might be correct, but without a valid ID, Firebase cannot look up the token and returns a missing error.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Here&#8217;s when it shows up and how to handle it:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>When it appears:<\/b><span style=\"font-weight: 400;\"> This error surfaces when the user backgrounds the app after requesting the code and returns after the OS has to recover the Activity&#8217;s memory.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>The fix:<\/b><span style=\"font-weight: 400;\"> Save the verification Id to a Saved State Handle or persistent storage (like DataStore). Do not rely on a static variable.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Compare error codes:<\/b><span style=\"font-weight: 400;\"> missing-verification-id means the request is unroutable; invalid-verification-code means the code was wrong with a valid ID.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Logging strategy:<\/b><span style=\"font-weight: 400;\"> Always log both the error code and the verification Id nonce to correlate errors. Never log the raw phone number.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The distinction matters for your user messaging. If the ID is missing, telling the user to check the code is wrong they need to restart the verification process entirely.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"The_Resend_Trap_Why_Requesting_a_Second_Code_Breaks_the_First_One\"><\/span><b>The Resend Trap: Why Requesting a Second Code Breaks the First One<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">When a user taps Resend Code, Firebase issues a new OTP and a new verification Id. The old verification Id becomes invalid for code submission, but the old code is still technically valid until it expires. If your app updates the verification Id but the user enters the code from the first SMS, the API returns a mismatch error.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This is the Firebase wrong otp after resend scenario, and it&#8217;s almost 100% a client-side state handling issue. Here&#8217;s what&#8217;s happening:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Server behavior:<\/b><span style=\"font-weight: 400;\"> Firebase allows multiple codes to be issued, but it accepts only the most recent verification Id for sign-in.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>UI clarity:<\/b><span style=\"font-weight: 400;\"> Your app should visually deprecate the first SMS. Change the button text to New Code Sent and clear the input field.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>The force Resending Token requirement:<\/b><span style=\"font-weight: 400;\"> If you resend without this token, Firebase may block the request or return an error like quota Exceeded, which confuses the user into thinking the OTP is wrong.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Timer reset:<\/b><span style=\"font-weight: 400;\"> Reset your countdown timer to 60 seconds on every resend. A user hitting the submit button on a stale UI is a recipe for mismatches.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The fix is straightforward: when the user requests a resend, clear the input field and change the helper text to Use the code from the latest message. Never keep the old code visible next to a new verification Id.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Firebase_Auto_Read_OTP_Wrong_Why_SMS_Retrieval_Fetches_the_Last_Code\"><\/span><b>Firebase Auto Read OTP Wrong: Why SMS Retrieval Fetches the Last Code<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">If Firebase auto-read returns the wrong code, the issue is often that your app reads the SMS inbox for the latest message instead of parsing the specific sender&#8217;s message. Carrier SMS aggregation can delay messages, and if a user receives two messages, your app may parse the first (older) code while the user submits the second. The result is a Firebase auto read otp wrong error that is entirely a data-sourcing issue.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Let&#8217;s unpack the scenarios:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>SMS Retriever API only reads its own messages:<\/b><span style=\"font-weight: 400;\"> Google&#8217;s SMS Retriever does not read the whole inbox. If you&#8217;ve implemented a custom receiver, you might be hijacking messages you shouldn&#8217;t.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Hash collision:<\/b><span style=\"font-weight: 400;\"> The SMS Retriever requires an 11-character hash in the SMS body. If the hash is wrong, you won&#8217;t auto-read at all but if the hash is from an old build, you might read a previous message.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Multi-sender conflict:<\/b><span style=\"font-weight: 400;\"> If the user has WhatsApp or Telegram verification running in parallel, your app might pick the wrong code from the notification shade.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Best practice:<\/b><span style=\"font-weight: 400;\"> Bind the auto-read to the verification Id generation timestamp. Only accept a code parsed within 60 seconds of the SMS receipt time.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The SMS Retriever API is designed only to <a href=\"https:\/\/pvapins.com\/receive-sms\">receive SMS<\/a> that contain your app&#8217;s hash. Still, if your hash is outdated (because you didn&#8217;t re-register the SHA-1 after a keystore change), it can pick up messages from a previous build.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Firebase_SMS_Auto_Read_Incorrect_Code_The_Broadcast_Receiver_Formatting_Bug\"><\/span><b>Firebase SMS Auto Read Incorrect Code: The Broadcast Receiver Formatting Bug<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">A common bug in Firebase SMS auto-read is the regex pattern used to extract the code. Firebase sends codes in a standardized format, but your Broadcast Receiver might trim digits, split the string incorrectly, or grab a non-numeric character. When the submitted code has a mismatched length (e.g., 5 digits instead of 6), Firebase returns a mismatch or an invalid-code error.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Here&#8217;s what to watch for:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Message format:<\/b><span style=\"font-weight: 400;\"> Firebase SMS codes appear like [#] Your code is 123456 with a hash signature. If you parse the hash before the code, your auto-fill logic grabs the signature instead.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Regex pitfalls:<\/b><span style=\"font-weight: 400;\"> Use a pattern that matches exactly 6 digits, not any digits or all digits after the last colon. Test with leading zeros many parsers strip them.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Simulator vs. real device:<\/b><span style=\"font-weight: 400;\"> Android emulators often deliver SMS with different formatting than real carriers. Always test on physical hardware and at least one US carrier and one EU carrier.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Manual fallback is mandatory:<\/b><span style=\"font-weight: 400;\"> Never rely solely on auto-read. Always offer a manual input field so the user can type the code if parsing fails.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Refer to the<\/span> <a href=\"https:\/\/developers.google.com\/identity\/sms-retriever\/overview\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Android SMS Retriever API Guide<\/span><\/a><span style=\"font-weight: 400;\"> for the exact message format. The most common regex mistake is using \\d{4,6} instead of \\d{6} ; this grabs the hash digits first.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Firebase_OTP_Autofill_Wrong_Verification_Androids_SMS_Retriever_vs_App_Check\"><\/span><b>Firebase OTP Autofill Wrong Verification: Android&#8217;s SMS Retriever vs. App Check<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">The Android SMS Retriever API can return a wrong code if your app has a SHA-1 fingerprint mismatch between the debug and release builds. Firebase uses the SHA-1 to validate the SMS sender. If the hash in the SMS body doesn&#8217;t match your app&#8217;s registered fingerprint, the auto-read fails or reads a stale hash from a previous build. The result is a verification mismatch that is impossible to fix client-side.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This is one of those issues that makes you want to throw your laptop across the room, because it works perfectly in development and breaks exactly when you go live. Key points:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>SHA-1 fingerprint check:<\/b><span style=\"font-weight: 400;\"> Register both debug and release keystore fingerprints in the Firebase console. A missing fingerprint is a top cause of autofill wrong verification.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>App Check conflict:<\/b><span style=\"font-weight: 400;\"> If App Check is enabled and the token is stale, OTP verification can fail with a permission-denied error that appears like a code mismatch. See the<\/span> <a href=\"https:\/\/firebase.google.com\/docs\/app-check\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Firebase App Check documentation<\/span><\/a><span style=\"font-weight: 400;\"> for token refresh best practices.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Proguard\/R8 obfuscation:<\/b><span style=\"font-weight: 400;\"> Obfuscation can break the reflection-based SMS Retriever callback. Add proper keep rules for the auth library.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Test the manual path:<\/b><span style=\"font-weight: 400;\"> If auto-read fails but manual entry works, the problem is in the SMS parsing layer, not the OTP server logic.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The debug\/release SHA-1 mismatch is the sneakiest issue here because it works in development and breaks in production. Always verify both fingerprints in the Firebase console before release.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Firebase_Wrong_OTP_from_Auto_Retrieval_Test_the_Manual_Entry_Path_First\"><\/span><b>Firebase Wrong OTP from Auto Retrieval: Test the Manual Entry Path First<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">When auto-retrieval delivers the wrong code, the fastest diagnostic is to hide auto-fill and prompt the user to enter the code manually. If the manual entry succeeds with the same code, your parsing pipeline is broken. If the manual entry also fails, the problem is upstream: either the code expired, or the verification Id is stale. This one test halves your debugging space.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Here&#8217;s your diagnostic workflow:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Debugging workflow:<\/b><span style=\"font-weight: 400;\"> Log the exact code parsed by your auto-read logic and compare it to the code in the SMS content manually.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>The off-by-one issue:<\/b><span style=\"font-weight: 400;\"> Sometimes the SMS contains a code with a trailing period or space. Your parser might include that character, creating a 7-character string that fails validation.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Carrier SMS delay:<\/b><span style=\"font-weight: 400;\"> SMS latency can be high on certain global carriers (e.g., India, Brazil). The code may be delivered after the TTL expires, causing a mismatch.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>User education:<\/b><span style=\"font-weight: 400;\"> Tell the user to check for a second message from your app&#8217;s sender if the first one times out. This reduces wrong OTP complaints significantly.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The manual-entry test is non-negotiable. It isolates the problem to either your parsing logic or your session management. Write a unit test for your regex with a code that starts with zero (e.g., 048201) to catch the most common parsing failure.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"How_to_Fix_Firebase_OTP_Not_Matching_Entered_Code\"><\/span><b>How to Fix Firebase OTP Not Matching Entered Code<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">To fix a mismatch, systematically test three variables: verification Id persistence, code parsing, and the timestamp. Step one: ensure the verification Id is saved in a lifecycle-aware container (ViewModel or persisted storage). Step two: log the raw code after parsing to confirm it&#8217;s exactly 6 digits. Step three: verify the user submits within 60 seconds. The fix is almost always one of these three.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Walk through this checklist in order:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Step 1 Persistence:<\/b><span style=\"font-weight: 400;\"> Store verification Id in Saved State Handle. Never in a companion object or static field. This fixes 80% of wrong OTP issues where the user switches apps.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Step 2 Parsing:<\/b><span style=\"font-weight: 400;\"> Write a unit test for your regex. Test with a leading-zero code (e.g., 048201), which is the most common cause of parse failures.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Step 3 Timing:<\/b><span style=\"font-weight: 400;\"> Add a visible countdown timer in the UI. When the timer hits zero, turn off the submit button and prompt for a resend.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Step 4 Resend token:<\/b><span style=\"font-weight: 400;\"> Always call resend Code with force Resending Token. Without it, the SDK may silently fail and return the old token, causing a false mismatch.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Step 5 Cleanup:<\/b><span style=\"font-weight: 400;\"> Clear the SMS input field on any error so the user cannot submit stale data.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Consult the official Firebase Phone Auth documentation for the complete force Resending Token flow. After Step 5, your Definition of Done is: the user can resend, wait, and verify within 60 seconds without a mismatch.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Stuck on a carrier that delays SMS and makes your OTP expire? Use a disposable number to test your flow without burning your real SIM. Get a number instantly at PVAPins pay per activation, no subscription.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Firebase_Verification_API_Wrong_Code_Handling_Best_Practices_for_Your_Backend\"><\/span><b>Firebase Verification API Wrong Code Handling: Best Practices for Your Backend<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">If you are using Firebase&#8217;s REST API for verification, wrong code handling is about error mapping. The REST endpoint returns a structured error object with a code field. You should map auth\/invalid-verification-code to a user-facing Incorrect code message, auth\/expired-verification-code to Code expired, resend, and auth\/invalid-verification-id to Session lost, restart. Do not catch all errors with a single generic message.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Here&#8217;s how to handle it properly:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Server-side validation:<\/b><span style=\"font-weight: 400;\"> If you handle OTP via a Cloud Function, always validate the ID token returned from sign In With Credential before issuing your own session cookie.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Rate limiting:<\/b><span style=\"font-weight: 400;\"> Firebase has aggressive quota limits for SMS sends. A quota Exceeded error can appear as a wrong OTP in the client if you don&#8217;t map the error code server-side.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Error code taxonomy:<\/b><span style=\"font-weight: 400;\"> Create a client-side mapping table for all Firebase Auth error codes. This prevents UX confusion like showing wrong code when the actual issue is too many requests.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Logging (GDPR-safe):<\/b><span style=\"font-weight: 400;\"> Do not log the full phone number. Hash the last 4 digits. Log the error code and the timestamp to correlate failures.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The backend is where you prevent the wrong code message from being a lie. If the user is rate-limited, tell them. If the session expired, tell them. Only show Incorrect code when Firebase actually means it.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"When_the_Number_Is_the_Problem_Testing_Without_a_Real_SIM\"><\/span><b>When the Number Is the Problem: Testing Without a Real SIM<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Sometimes the wrong OTP error is not a code problem, it&#8217;s a carrier or number problem. Firebase&#8217;s SMS delivery depends on the number being valid and provisioned for SMS. If you are testing with a VoIP number or a recycled prepaid SIM, the SMS may be delivered late or blocked entirely, causing the code to expire. Using a fresh, SMS-capable number can eliminate these environmental failures.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This is where things get interesting, because it&#8217;s also where most devs waste hours. Consider:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>VoIP number issue:<\/b><span style=\"font-weight: 400;\"> Google&#8217;s SMS Retriever API often fails with VoIP numbers because the carrier does not route the SMS correctly.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Recycled numbers:<\/b><span style=\"font-weight: 400;\"> A number previously registered for Firebase on another account may trigger a silent block that never delivers the SMS.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Global carrier latency:<\/b><span style=\"font-weight: 400;\"> In some regions (e.g., parts of Southeast Asia and Latin America), SMS delivery can take 30+ seconds, cutting your testing window in half.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Use a disposable number:<\/b><span style=\"font-weight: 400;\"> For automated testing, rent a temporary number to validate your SMS flow end-to-end without burning your personal SIM.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">If your Firebase setup looks correct but codes still fail, the issue may be the incoming number itself. Test with a fresh virtual number from PVAPins to isolate the issue. You can get a<\/span>\u00a0<span style=\"font-weight: 400;\">temporary virtual phone number<\/span><span style=\"font-weight: 400;\"> delivered instantly, view codes in a real-time <a href=\"https:\/\/pvapins.com\/sms-verification\">SMS verification<\/a> dashboard, or rent a number for longer testing windows (1, 3, 7, 30 days) to test repeat OTPs and resend flows. Compare our SMS pricing by country to fit your testing budget. Higher acceptance starts with a clean number.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">PVAPins is not affiliated with any app or website. Please follow each app&#8217;s terms and local regulations.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Preventing_Wrong_OTP_Errors_in_Production_A_Checklist_for_Developers\"><\/span><b>Preventing Wrong OTP Errors in Production: A Checklist for Developers<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Prevention beats debugging. Lock down your OTP flow with a hard checklist: persist the verification Id lifecycle-aware, use force Resending Token for all resends, add a 60-second in-app countdown, parse the SMS with a strict 6-digit regex, and map every Firebase error code to a specific user message. This combination eliminates roughly 90% of wrong OTP complaints before they reach support.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Here&#8217;s what a solid production setup looks like:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>QA testing matrix:<\/b><span style=\"font-weight: 400;\"> Test on 3 phone types (Pixel, Samsung, and a low-end Chinese OEM), 2 networks (one US, one non-US), and both manual entry and auto-read paths.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Analytics events:<\/b><span style=\"font-weight: 400;\"> Fire an otp_submit_attempt, otp_auto_read_success, and otp_expired event to track failure rates post-launch.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Alerting:<\/b><span style=\"font-weight: 400;\"> Set an alert threshold. If the invalid-verification-code error rate spikes above 5% in a 24-hour window, investigate your SDK version or carrier config immediately.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Fallback channel:<\/b><span style=\"font-weight: 400;\"> If you need a longer verification window than 60 seconds, consider allowing users to request a voice call code as an alternative, which Firebase supports natively.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>Documentation link:<\/b><span style=\"font-weight: 400;\"> Point your team to Firebase&#8217;s official Auth documentation for edge cases around Android 14&#8217;s new credential manager behavior. Align your implementation with NIST guidelines for OTP security (SP 800-63B) to ensure your fallback channels meet best practices.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Need a number that lasts beyond 60 seconds? Rent a <a href=\"https:\/\/pvapins.com\/temp-number\">temporary number<\/a> for 1, 3, or 7 days to test repeat OTPs, resend flows, and multi-session logins without interruption. Set up your rental in minutes. For automated testing, use our developer API to request numbers and poll OTP status programmatically. Browse our<\/span> <span style=\"font-weight: 400;\">developer resources<\/span><span style=\"font-weight: 400;\"> for more integration patterns.<\/span><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Key_Takeaways\"><\/span><b>Key Takeaways<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Firebase&#8217;s wrong OTP error is a server-side hash mismatch, not a user typo the verification Id and the code must be a matched pair.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">The 60-second TTL is non-negotiable. Your UI must enforce a visible countdown to prevent stale submissions.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Auto-read failures are usually parsing bugs (leading zeros, regex, stale SMS) or SHA-1 fingerprint mismatches between debug and release builds.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Always test the manual entry path first. If manual works but auto-read fails, your parsing is broken, not Firebase.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">For production, map every error code to a specific user message. Never show Incorrect code for an expired or missing session.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">If the problem persists, the number itself may be the issue. Test with a fresh, SMS-capable virtual number to isolate carrier problems.<\/span><\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"FAQ\"><\/span><b>FAQ<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><b>Is using a temporary number for Firebase verification legal?<\/b><\/p>\n<p><span style=\"font-weight: 400;\">It depends on the app&#8217;s terms of service, not just local law. For testing your own app&#8217;s SMS flow, using a temporary number is standard practice. Never use a temp number to create fake accounts on services that prohibit it. PVAPins is not affiliated with any app or website. Please follow each app&#8217;s terms and local regulations.<\/span><\/p>\n<p><b>How long does a Firebase OTP code last?<\/b><\/p>\n<p><span style=\"font-weight: 400;\"> The default time-to-live is 60 seconds. After that, the code is invalid, and resubmitting it triggers a wrong OTP error. Your UI should enforce a visible countdown to avoid this.<\/span><\/p>\n<p><b>What is the difference between a one-time number and a rental number for testing?<\/b><\/p>\n<p><span style=\"font-weight: 400;\">A one-time number is a single-use temporary number for one OTP. A rental number stays active for 1, 3, 7, or up to 30 days, which is essential for testing resend flows, repeat logins, or multi-step verification in an app. PVAPins lets you choose by cost per activation.<\/span><\/p>\n<p><b>What should I NOT use a temporary phone number for?<\/b><\/p>\n<p><span style=\"font-weight: 400;\"> Don&#8217;t use temporary numbers to bypass fraud detection, create multiple fake accounts for incentives, or violate any app&#8217;s terms. Use them for legitimate app development testing and privacy.<\/span><\/p>\n<p><b>Does Firebase deliver the wrong code to my auto-read feature?<\/b><\/p>\n<p><span style=\"font-weight: 400;\">It can if your parser reads a stale SMS or if your SHA-1 fingerprint is outdated. Always log the parsed code to confirm the exact logic before blaming the server.<\/span><\/p>\n<p><b>Can I extend Firebase&#8217;s OTP timeout window?<\/b><\/p>\n<p><span style=\"font-weight: 400;\">No, you cannot configure the 60-second timeout on Firebase&#8217;s side. The fix is to trigger an automatic resend when the timer expires, so the user never sits on a dead code.<\/span><\/p>\n<p><b>Compliance Note:<\/b><span style=\"font-weight: 400;\"> <a href=\"https:\/\/pvapins.com\/faqs\">PVAPins<\/a> is not affiliated with any app or website. Please follow each app&#8217;s terms and local regulations.<\/span><\/p>\n<p><b>Also Helpful:<\/b><span style=\"font-weight: 400;\"> The same privacy-friendly tricks work across platforms. See our guide on \u201c<\/span><a href=\"https:\/\/pvapins.com\/blog\/fetch-keeps-saying-wrong-otp\/\"><span style=\"font-weight: 400;\">Fetch Keeps Saying Wrong OTP<\/span><\/a><span style=\"font-weight: 400;\">\u201d if you use multiple inboxes.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>You implemented Firebase Phone Authentication, tested it once in the emulator, and shipped it. Now your users are hitting a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":13608,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1],"tags":[],"class_list":["post-13607","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-general-category"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/pvapins.com\/blog\/wp-json\/wp\/v2\/posts\/13607","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pvapins.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pvapins.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pvapins.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pvapins.com\/blog\/wp-json\/wp\/v2\/comments?post=13607"}],"version-history":[{"count":4,"href":"https:\/\/pvapins.com\/blog\/wp-json\/wp\/v2\/posts\/13607\/revisions"}],"predecessor-version":[{"id":13612,"href":"https:\/\/pvapins.com\/blog\/wp-json\/wp\/v2\/posts\/13607\/revisions\/13612"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pvapins.com\/blog\/wp-json\/wp\/v2\/media\/13608"}],"wp:attachment":[{"href":"https:\/\/pvapins.com\/blog\/wp-json\/wp\/v2\/media?parent=13607"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pvapins.com\/blog\/wp-json\/wp\/v2\/categories?post=13607"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pvapins.com\/blog\/wp-json\/wp\/v2\/tags?post=13607"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}