
New Age Verification Laws for Mobile Apps: What You Need to Know and How to Comply
New Age Verification Laws for Mobile Apps: What You Need to Know and How to Comply
Starting in 2026, mobile app developers face a new era of age verification requirements. Here's your complete guide to compliance.
The New Legal Landscape
If you distribute mobile apps to users in the United States, you need to be aware of three major state laws taking effect in early 2026 that will fundamentally change how apps verify user ages:
Texas SB2420 - App Store Accountability Act
- Effective Date: January 1, 2026
- Status: Signed into law May 27, 2025
- Current Challenge: Under constitutional challenge by Computer and Communications Industry Association
Utah SB287 (App Store Accountability Act)
- Effective Date: May 7, 2026 (compliance deadline May 6, 2026)
- Private Right of Action: December 31, 2026
- Status: In effect since May 7, 2025
Louisiana Act 440 (HB 570)
- Effective Date: July 1, 2026
- Status: Signed into law June 30, 2025
- Enforcement: Attorney General with 45-day cure period
What These Laws Require
All three laws share similar core requirements that impact both app stores AND app developers:
Age Verification Categories
Apps must categorize users into four age groups:
- Child: Under 13 years old
- Younger Teenager: 13-15 years old
- Older Teenager: 16-17 years old
- Adult: 18 years and older
Parental Consent
- App stores must affiliate minor accounts with verified parent/guardian accounts
- Parents must provide explicit consent for EACH app download, purchase, or in-app purchase
- Consent required for each individual transaction (not blanket approval)
Developer Obligations
Even if you're just a developer (not an app store), you have responsibilities:
- Assign age ratings to your apps and in-app purchases
- Use age information provided by app stores to restrict content appropriately
- Delete personal data after completing verification (Texas)
- Implement age restrictions based on received age signals
- Notify app stores of material changes to your app
Key Differences Between States
Texas:
- Developers get safe harbor if relying on app store data
- Violations treated as deceptive trade practices
Utah:
- Includes explicit private right of action (parents can sue)
- Potential damages: $1,000 per violation plus attorney fees
- Strong safe harbor for developers acting in good faith
Louisiana:
- NO safe harbor protection for developers
- Developers must also obtain parental consent (not just app stores)
- Up to $10,000 per violation after 45-day cure period
Why This Matters for Your App
Universal Impact
These laws apply to ALL APPS distributed to users in these states, regardless of:
- App content type (even weather apps!)
- Target audience
- Business size
- Revenue
Compliance Challenges
Without proper age verification:
- Financial penalties up to $10,000 per violation
- Private lawsuits from parents (especially in Utah)
- Deceptive trade practice claims
- Reputational damage
The Bottom Line
If you have even a single user in Texas, Utah, or Louisiana, you need to comply. With Texas's law effective January 1, 2026, the time to act is NOW.
The Solution: Apple and Google's Age Verification APIs
Both Apple and Google have responded to these laws with privacy-preserving age verification APIs:
iOS: DeclaredAgeRange API
- Available in iOS 26.0+ (released 2025)
- Uses age from Apple ID (self-declared or guardian-declared)
- Returns age ranges, not exact birthdates
- Detects parental controls/supervision
Android: Play Age Signals API
- Available in Android 6.0+ with Google Play Services
- Age verified through Google Play
- Currently returns data only in Texas, Utah, and Louisiana
- Includes parental approval status
Privacy-First Design
Both APIs protect user privacy by:
- Sharing only age ranges, never exact birthdates
- Allowing users to decline sharing
- Not storing verification data in your app
- Integrating with platform parental consent systems
Introducing the Cordova Age Verification Plugin
To make compliance easy, we've created a unified Cordova plugin that works seamlessly across both iOS and Android platforms.
Key Features
✅ Single unified JavaScript API for both platforms
✅ Privacy-preserving (no exact birthdate collection)
✅ Support for multiple age gates (up to 3 thresholds)
✅ Detects parental control/supervision status
✅ TypeScript definitions included
✅ Handles all platform-specific complexity for you
✅ Free and open source (MIT License)
Step-by-Step Installation Guide
Prerequisites
Before installing the plugin, ensure you have:
For iOS:
- iOS 26.0 or later for testing
- Xcode 26 Beta or later
- Apple Developer Program membership
- Cordova iOS 7.0.0 or later
For Android:
- Android 6.0 (API level 23) or later
- Google Play Services
- App distributed via Google Play Store
- Cordova Android 10.0.0 or later
Step 1: Install the Plugin
Open your terminal in your Cordova project directory and run:
# Install from GitHub (recommended)
cordova plugin add https://github.com/intractallc/cordova-plugin-age-verification.git
# Or install from local path if you've cloned the repository
cordova plugin add ./cordova-plugin-age-verification
The plugin will automatically install its dependencies, including Swift 5.0 support for iOS.
Step 2: iOS Platform Setup
A. Set Minimum iOS Version
Edit your config.xml file and add/update the iOS deployment target:
<platform name="ios">
<preference name="deployment-target" value="26.0" />
</platform>
B. Enable the Entitlement in Xcode
- Build your iOS platform:
cordova prepare ios- Open your project in Xcode:
open platforms/ios/YourApp.xcworkspace- Select your app target in the project navigator
- Go to the Signing & Capabilities tab
- Click the + Capability button
- Search for and add Declared Age Range
- Verify the capability appears in your entitlements
Note: The plugin attempts to add this automatically, but manual verification in Xcode is highly recommended.
Step 3: Android Platform Setup
A. Verify Google Play Services
The plugin requires Google Play Services. Ensure your config.xml includes:
<platform name="android">
<!-- This is usually added automatically -->
<preference name="android-minSdkVersion" value="23" />
</platform>
B. Optional: Configure Custom Age Ranges
For Android, you can customize age ranges in the Google Play Console:
- Go to Google Play Console → Your App
- Navigate to Policy and programs → Age signals
- Select Custom age ranges tab
- Enter up to three minimum ages (must be ≥2 years apart)
Default age ranges are: 0-12, 13-15, 16-17, 18+
Step 4: Build Your App
# Build for iOS
cordova build ios
# Build for Android
cordova build android
How to Use the Plugin in Your App
Now that the plugin is installed, here's how to implement age verification in your app:
Basic Implementation
document.addEventListener('deviceready', onDeviceReady, false);
function onDeviceReady() {
// First, check if age verification is available
AgeVerification.isAvailable(
function(available) {
if (available) {
console.log('Age verification is available');
performAgeVerification();
} else {
console.log('Age verification not available - use fallback');
showTraditionalAgeGate();
}
},
function(error) {
console.error('Error checking availability:', error);
showTraditionalAgeGate();
}
);
}
Request Age Range with Compliance Gates
function performAgeVerification() {
// Use the standard compliance age gates: 13, 16, 18
// This creates ranges: <13, 13-15, 16-17, 18+
AgeVerification.requestAgeRange(
[13, 16, 18],
function(result) {
if (result.status === 'declined') {
console.log('User declined to share age');
restrictToKidsContent();
return;
}
if (result.shared) {
console.log('Age range:', result.lowerBound, '-', result.upperBound);
console.log('Source:', result.source);
// Apply age-appropriate restrictions
if (result.lowerBound >= 18) {
enableFullContent();
} else if (result.lowerBound >= 16) {
enableTeenContent();
} else if (result.lowerBound >= 13) {
enableYoungTeenContent();
} else {
restrictToKidsContent();
}
// iOS: Check parental controls
if (result.parentalControls &&
result.parentalControls.includes('communicationLimits')) {
disableSocialFeatures();
}
}
},
function(error) {
console.error('Age verification failed:', error.message);
// Android: Check if we should retry
if (error.retryable) {
console.log('Error is retryable, will try again in 5 seconds');
setTimeout(performAgeVerification, 5000);
} else {
restrictToKidsContent();
}
}
);
}
Simple Age Check
If you just need to verify a user is above a certain age:
function checkIfUserIsAdult() {
AgeVerification.isUserAboveAge(
18,
function(result) {
if (result.declined) {
console.log('User declined age verification');
restrictAccess();
} else if (result.isAboveAge) {
console.log('User is 18 or older');
allowFullAccess();
} else {
console.log('User is under 18');
restrictAccess();
}
},
function(error) {
console.error('Error:', error.message);
restrictAccess();
}
);
}
Using Predefined Constants
The plugin includes helpful constants:
// Individual age gates
AgeVerification.AGE_GATES.KIDS // 13
AgeVerification.AGE_GATES.TEENS // 16
AgeVerification.AGE_GATES.ADULTS // 18
AgeVerification.AGE_GATES.ALCOHOL_US // 21
// Predefined combinations for compliance
AgeVerification.STANDARD_GATES.FULL // [13, 16, 18]
AgeVerification.STANDARD_GATES.ADULT_ONLY // [18]
AgeVerification.STANDARD_GATES.TEEN_ADULT // [13, 18]
AgeVerification.STANDARD_GATES.US_STATE_COMPLIANCE // [13, 16, 18]
// Example usage
AgeVerification.requestAgeRange(
AgeVerification.STANDARD_GATES.US_STATE_COMPLIANCE,
successCallback,
errorCallback
);
Complete Working Example
Here's a full implementation you can use as a template:
// Initialize when device is ready
document.addEventListener('deviceready', initAgeVerification, false);
function initAgeVerification() {
// Check if age verification is supported
AgeVerification.isAvailable(
function(available) {
if (available) {
checkUserAge();
} else {
console.log('Age verification not available, using fallback');
showManualAgeGate();
}
},
function(error) {
console.error('Availability check failed:', error);
showManualAgeGate();
}
);
}
function checkUserAge() {
// Request age range with compliance gates
AgeVerification.requestAgeRange(
AgeVerification.STANDARD_GATES.US_STATE_COMPLIANCE, // [13, 16, 18]
function(result) {
handleAgeVerificationResult(result);
},
function(error) {
handleAgeVerificationError(error);
}
);
}
function handleAgeVerificationResult(result) {
console.log('Age verification result:', result);
if (result.status === 'declined') {
console.log('User declined to share age');
showRestrictedContent();
return;
}
if (!result.shared || result.lowerBound === null) {
console.log('No age data available');
showRestrictedContent();
return;
}
// Store compliance info
localStorage.setItem('ageVerified', 'true');
localStorage.setItem('ageCategory', getAgeCategory(result.lowerBound));
localStorage.setItem('verificationSource', result.source);
// Apply age-appropriate content
if (result.lowerBound >= 18) {
console.log('User is adult (18+)');
showAdultContent();
} else if (result.lowerBound >= 16) {
console.log('User is older teenager (16-17)');
showOlderTeenContent();
} else if (result.lowerBound >= 13) {
console.log('User is younger teenager (13-15)');
showYoungerTeenContent();
} else {
console.log('User is child (<13)');
showChildContent();
}
// Check for parental controls (iOS)
if (result.parentalControls && result.parentalControls.length > 0) {
console.log('Parental controls detected:', result.parentalControls);
applyParentalControlRestrictions(result.parentalControls);
}
}
function handleAgeVerificationError(error) {
console.error('Age verification error:', error);
// Log for compliance records
logComplianceEvent('age_verification_error', {
errorCode: error.error,
errorMessage: error.message,
retryable: error.retryable || false
});
// Android: Retry transient errors
if (error.retryable) {
console.log('Transient error detected, retrying in 5 seconds...');
setTimeout(checkUserAge, 5000);
return;
}
// For non-retryable errors, show restricted content
showRestrictedContent();
}
function getAgeCategory(lowerBound) {
if (lowerBound >= 18) return 'adult';
if (lowerBound >= 16) return 'older_teenager';
if (lowerBound >= 13) return 'younger_teenager';
return 'child';
}
function showAdultContent() {
document.getElementById('app-content').className = 'adult-mode';
console.log('Showing adult content');
}
function showOlderTeenContent() {
document.getElementById('app-content').className = 'older-teen-mode';
console.log('Showing older teen content');
}
function showYoungerTeenContent() {
document.getElementById('app-content').className = 'younger-teen-mode';
console.log('Showing younger teen content');
}
function showChildContent() {
document.getElementById('app-content').className = 'child-mode';
console.log('Showing child-safe content');
}
function showRestrictedContent() {
document.getElementById('app-content').className = 'restricted-mode';
console.log('Showing most restricted content');
}
function applyParentalControlRestrictions(controls) {
if (controls.includes('communicationLimits')) {
console.log('Disabling social features due to communication limits');
document.getElementById('social-features').style.display = 'none';
}
}
function showManualAgeGate() {
// Fallback for devices without API support
console.log('Showing manual age gate');
document.getElementById('age-gate-modal').style.display = 'block';
}
function logComplianceEvent(eventType, data) {
// Log to your compliance tracking system
console.log('Compliance event:', eventType, data);
}
Testing Your Implementation
iOS Testing
- Use iOS 26.0 or later simulator/device
- Ensure you're signed in with an Apple ID
- Test with different Apple ID ages:
- Child account (under 13)
- Teen account (13-17)
- Adult account (18+)
Android Testing
Important: Play Age Signals only returns real data in Texas, Utah, and Louisiana.
For testing in other locations:
- Use the
FakeAgeSignalsManagerin your test builds - Or test using Google Play's internal testing tracks with test accounts
- See Google's testing documentation
Troubleshooting Common Issues
iOS: "Framework not available" Error
Solution:
- Ensure iOS 26.0 or later
- Verify DeclaredAgeRange capability in Xcode
- Check that entitlement is properly configured
iOS: "Invalid request" Error
Solution:
- Age gates must create ranges of at least 2 years
- Maximum 3 age gates allowed
- Example:
[13, 16, 18]is valid,[13, 14, 15, 16]is not
Android: "app_not_owned" Error
Solution:
- App must be installed from Google Play
- Use Play's internal testing tracks for testing
- Cannot test with side-loaded APKs
Android: "play_store_outdated" Error
Solution:
- Update Google Play Store app on device
- Ensure using latest Play Age Signals library
Android: No Data Returned
Solution:
- Play Age Signals only returns data in TX, UT, LA
- Use
FakeAgeSignalsManagerfor testing elsewhere - Verify app is properly configured in Play Console
Plugin Not Found After Installation
Solution:
# Clean and prepare
cordova clean
cordova prepare ios
cordova prepare android
# Rebuild
cordova build ios
cordova build android
Best Practices for Compliance
1. Document Everything
Keep detailed records of:
- When age verification was performed
- What age range was returned
- What content restrictions were applied
- Any errors that occurred
2. Handle All Cases
Your app must gracefully handle:
- User declining to share age (default to most restrictive)
- API unavailable (use fallback age gate)
- Network errors on Android (implement retry logic)
- Missing age data (default to restricted content)
3. Respect Privacy
- Never store exact birthdates
- Delete verification data after use (Texas requirement)
- Only collect age data when necessary
- Be transparent about data usage
4. Update Age Ratings
- Assign accurate age ratings to your app
- Update ratings when content changes significantly
- Notify app stores of material changes
5. Monitor Changes
- These laws may be challenged in court
- Implementation details may evolve
- Stay informed about enforcement actions
- Update your compliance as needed
Important Compliance Dates
Mark your calendar:
- January 1, 2026: Texas SB2420 takes effect
- May 6, 2026: Utah compliance deadline
- May 7, 2026: Utah enforcement begins
- July 1, 2026: Louisiana Act 440 takes effect
- December 31, 2026: Utah private lawsuits begin
Additional Resources
Official Documentation
Legal Resources
Testing & Development
Conclusion
The new age verification laws represent a significant shift in how mobile apps handle minor users. While compliance may seem daunting, the combination of Apple's and Google's privacy-preserving APIs with our unified Cordova plugin makes implementation straightforward.
Key Takeaways:
- Act now - Texas law takes effect January 1, 2026
- All apps serving TX, UT, or LA users must comply
- Use platform APIs for privacy-preserving verification
- The Cordova plugin handles all platform complexity
- Document your compliance efforts thoroughly
By following this guide and implementing the age verification plugin, you'll be well-positioned to meet these new regulatory requirements while protecting user privacy and maintaining a great user experience.
Need Help?
- Report Issues: GitHub Issues
- Plugin Development: Intracta LLC
- Legal Guidance: Consult with your attorney about specific compliance requirements
Last Updated: December 2025
Plugin Version: 1.0.0
License: MIT
