Reference version

This is documentation for the next SDK version. For up-to-date documentation, see the latest version (SDK 54).

Expo AgeRange

GitHub

Changelog

npm

A library that provides access to age range information using Play Age Signals API on Android and Declared Age Range framework on iOS.

Android
iOS

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 API allows you to request age range information from users to help you comply with age-appropriate content regulations (such as in Texas) 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) throws an exception until January 1, 2026, as per the official Android documentation. From January 1, the API will return live responses.

Installation

Terminal
npx expo install expo-age-range

If 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 add the com.apple.developer.declared-age-range entitlement to your app. Add it to your app config file:

app.json
{ "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

Age Range 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

API

import * as AgeRange from 'expo-age-range';

Methods

AgeRange.requestAgeRangeAsync(options)

Android
iOS 26.0+
ParameterType
optionsAgeRangeRequest

Prompts the user to share their age range with the app. Responses may be cached by the OS for future requests.

A promise that resolves with user's age range response, or rejects with an error. The user needs to be signed in on the device to get a valid response. When not supported (earlier than iOS 26 and web), the call returns lowerBound: 18, which is equivalent to the response of an adult user.

Types

AgeRangeRequest

iOS

Options for requesting age range information from the user.

PropertyTypeDescription
threshold1number

The required minimum age for your app.

threshold2(optional)number

An optional additional minimum age for your app.

threshold3(optional)number

An optional additional minimum age for your app.

AgeRangeResponse

Android
iOS

Response containing the user's age range information.

Contains age boundaries and platform-specific metadata.

PropertyTypeDescription
activeParentalControls(optional)string[]
Only for:
iOS

List of parental controls enabled and shared as a part of age range declaration.

ageRangeDeclaration(optional)'selfDeclared' | 'guardianDeclared'
Only for:
iOS

Indicates whether the age range was declared by the user themselves or someone else (parent, guardian, or Family Organizer in a Family Sharing group).

installId(optional)string
Only for:
Android

An ID assigned to supervised user installs by Google Play, used to notify you of revoked app approval.

lowerBound(optional)number

The lower limit of the person’s age range.

upperBound(optional)number

The upper limit of the person’s age range.

userStatus(optional)'VERIFIED' | 'SUPERVISED' | 'SUPERVISED_APPROVAL_PENDING' | 'SUPERVISED_APPROVAL_DENIED' | 'UNKNOWN'
Only for:
Android

The user's age verification or supervision status.

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

CodeDescription
ERR_AGE_RANGE_USER_DECLINEDiOS Only. User declined to shar their age range.
ERR_AGE_RANGE_NOT_AVAILABLEiOS 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_REQUESTiOS Only. The provided params were invalid. The age ranges need to be minimum 2 years apart.