Expo AgeRange
A library that provides access to age range information using Play Age Signals API on Android and Declared Age Range framework on iOS.
This library is currently in alpha and will frequently experience breaking changes.
expo-age-range provides access to user age range information. It uses Google's Play Age Signals API on Android and Apple's Declared Age Range framework on iOS.
This library allows you to request age range information from your app users to help you comply with age-appropriate content regulations (such as in Texas, USA) and provide age-appropriate experiences in your app.
Limitations
We strongly recommend testing the functionality on a real device, as simulator runtimes may not work as expected.
On Android, the Play Age Signals API (beta) may throw an exception until January 1, 2026, as per the official Android documentation. From January 1, the API will return live responses.
Installation
- npx expo install expo-age-rangeIf you are installing this in an existing React Native app, make sure to install expo in your project.
Configuration in app config
Setup iOS project
To use the age range API on iOS, you need to build your project with Xcode 26.0 or later. The com.apple.developer.declared-age-range entitlement is required. Add it to your app config file:
{ "expo": { "ios": { "entitlements": { "com.apple.developer.declared-age-range": true } } } }
Are you using this library in an existing React Native app?
For existing React Native projects, add the entitlement to your project's ios/[app]/[app].entitlements file:
<key>com.apple.developer.declared-age-range</key> <true/>
Usage
import * as AgeRange from 'expo-age-range'; import { useState } from 'react'; import { StyleSheet, Text, View, Button } from 'react-native'; export default function App() { const [result, setResult] = useState<AgeRange.AgeRangeResponse | { error: string } | null>(null); const requestAgeRange = async () => { try { const ageRange = await AgeRange.requestAgeRangeAsync({ threshold1: 10, threshold2: 13, threshold3: 18, }); setResult(ageRange); } catch (error) { setResult({ error: error.message }); } }; return ( <View style={styles.container}> <Button title="Request Age Range" onPress={requestAgeRange} /> {result && ( <Text style={styles.result}> {'error' in result ? `Error: ${result.error}` : `Lower age bound: ${result.lowerBound}`} </Text> )} </View> ); } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', padding: 20, }, result: { marginTop: 20, fontSize: 16, }, });
Additional resources
- Play Age Signals API: Android documentation for age signals
- Declared Age Range framework: iOS documentation for declared age range
API
import * as AgeRange from 'expo-age-range';
No API data file found, sorry!
Error codes
Available in the code property of any error thrown by the native module. For Android-specific error codes, see "Handle API error codes" in Use Play Age Signals API docs.
| Code | Description |
|---|---|
ERR_AGE_RANGE_USER_DECLINED | iOS Only. User declined to share their age range. |
ERR_AGE_RANGE_NOT_AVAILABLE | iOS Only. Age range not available. The most likely cause is that user is not signed in to their Apple account on the device. |
ERR_AGE_RANGE_INVALID_REQUEST | iOS Only. The provided params were invalid. The age ranges need to be minimum 2 years apart. |