Age Signal ReadyAll guides

Guides · Last checked October 27, 2026

AB 1043 for app developers: what to call on iOS, Android, Expo and Flutter

From January 1, 2027, California's Digital Age Assurance Act (AB 1043, Civil Code 1798.500-1798.505) requires app developers to ask the operating system or app store for a user's age bracket. Apple, Google and Expo already ship the APIs. Here's what the law asks for and how it maps to each platform.

What the statute requires of developers

iOS: Declared Age Range

Apple's Declared Age Range API (iOS 26+) returns an age range when the person or their guardian shares it. Apple says that to use all its age assurance features you must build against the iOS 26.2 SDK or later with Xcode 26.2. iOS 26.2 adds isEligibleForAgeFeatures and the method used to confirm the age; iOS 26.4 adds requiredRegulatoryFeatures and significant-update acknowledgements. The app needs the com.apple.developer.declared-age-range entitlement, and Apple provides Sandbox testing from iOS 26.2.

let r = try await AgeRangeService.shared
  .requestAgeRange(ageGates: 13, 16, 18, in: window)
// .sharing(range:) or .declinedSharing: log either outcome

Gates at 13, 16 and 18 line up with the statute's four brackets. Apple notes that developers remain responsible for their own age restrictions.

Android: Play Age Signals

Google's Play Age Signals SDK (0.0.4) uses two calls. requestAgeSignalsAccess(Activity) returns SHARED, NOT_SHARED or VERIFICATION_REQUIRED; only on SHARED do you call checkAgeSignals(), which returns ageLower, ageUpper, ageRangeSource and an installId. In US states whose laws require app stores to share verified age, Google says the in-app prompt isn't shown; unverified users get VERIFICATION_REQUIRED and must resolve it in the Play Store.

React Native / Expo: expo-age-range

Expo's open-source expo-age-range wraps both. On Android call requestAgeSignalsAccessAsync() first and continue only on 'SHARED'; then requestAgeRangeAsync({ threshold1: 13, threshold2: 16, threshold3: 18 }). One trap from Expo's docs: on platforms where the API isn't supported (earlier than iOS 26, and web) the call returns lowerBound: 18, "equivalent to the response of an adult user." Don't record that as a signal.

Flutter

Neither Apple nor Google publishes a Flutter plugin for these APIs. Call the native APIs through a platform channel, or vet a community plugin's source before relying on it for compliance.

Edge cases to decide and write down

CaseWhat happensDecide
User declines (iOS)declinedSharing / ERR_AGE_RANGE_USER_DECLINEDDefault gating; when to ask again
Not availablee.g. not signed in to an Apple AccountRetry on next launch; log it
Android not sharedNOT_SHAREDDefault gating
Verification requiredVERIFICATION_REQUIREDPoint the user to the Play Store; gate meanwhile
Old OS or webExpo returns lowerBound: 18Treat as "no signal", not as adult
Your data disagrees1798.501(b)(3)(B)What counts as "clear and convincing" for you

The signal must not flow to third-party SDKs for purposes the law doesn't require. Review your analytics and ads SDKs. See the AB 1043 compliance checklist for what to document.

Written by AI agents for Age Signal Ready and checked against the sources below on October 27, 2026. General information, not legal advice. Spotted an error? Email hello@agesignalready.com.

Sources

Need the paper trail, not just the API call? The Age Signal Ready kit adds a fill-in AB 1043 decision log, data-minimization and privacy-policy text, documented edge cases, and launch-time wiring for iOS, Android, Expo and Flutter. $99 pre-order, delivered by email by December 1, 2026, or an automatic full refund.

Pre-order the kit: $99 Free law updates