This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

Start a remote Android Emulator or iOS Simulator session

Edit page

Start an Expo Simulators session from EAS CLI, the REST API, or expo.dev, then confirm that the remote device is ready to use.


An Expo Simulators session is one remote Android Emulator or iOS Simulator that runs on EAS infrastructure for a limited time. To start a session, run eas simulator:start with a platform and a session type. The command waits until the device is ready, then writes the connection details to .env.eas-simulator.

This page shows the four ways to start a session and how to confirm that the session is ready. For a first-time walkthrough that includes account setup, see Get started with Expo Simulators.

Choose how to start the session

Start fromUse it when
EAS CLIYou work in a terminal, or an agent works in a project directory.
REST APIYour own service or CI system creates sessions over HTTP, without EAS CLI.
Create session linkA person starts a browser preview from a pull request, CI result, or internal tool.
expo.devYou want to start a session from the project's Simulator sessions page in a browser.

Start a session with EAS CLI

Run the command from the project directory. Pass the platform, the session type, and a name that describes the purpose of the session:

Terminal
- eas simulator:start --platform android --type agent-device --name "Checkout flow screenshots" --non-interactive

EAS CLI shows a warning when you start an Android session. Android Emulator support is still in development, and some features that work on iOS may not work on Android yet.

The start command does these steps:

  1. It creates the session and prints the session page URL on expo.dev.
  2. It waits while the session is in the queue. Queue time does not count toward the startup timeout.
  3. It waits up to 15 minutes for the device and controller to start.
  4. It writes .env.eas-simulator and prints the connection instructions.

If the session stops or fails before it is ready, the command reports the failure and links to the session page. If the startup timeout expires, EAS CLI stops the session.

Stay attached or return immediately

ModeBehavior
InteractiveThe command stays attached until the session ends. Press Ctrl + C once to stop the session. This is the default in an interactive terminal.
--non-interactiveThe command returns when the session is ready. Stop the session later with eas simulator:stop. This is the default when CI is set or there is no terminal.
--jsonSame as --non-interactive, and the output is a JSON object for scripts and agents.

Add an app, a device, or limits

You can add more flags to the same command:

GoalFlagsMore information
Install and launch an app during startupOne of --build-id, --build-fingerprint, --application-archive-url, or --expo-goInstall your app
Select a device model--device <avd-profile> on Android, or --device "<name-or-UDID>" on iOSDevices
Stop the session automatically--max-duration-minutes <minutes>, --max-idle-time-minutes <minutes>Session lifetime
Group the session with others--tag <tag>, repeated for each tagOrganize sessions
Route device network traffic through your computer--egress localNetwork inspection

Start a session with the REST API

Send a POST request with an Expo access token. The response returns before the device is ready:

Terminal
- curl -X POST "https://api.expo.dev/v2/device-run-sessions" \
-H "Authorization: Bearer $EXPO_TOKEN" \ -H "Content-Type: application/json" \ -d '{"appId":"<project-id>","platform":"ios","type":"agent-device","name":"Checkout flow screenshots","maxDurationMinutes":30}'

Save data.id from the response. Then poll the session every five seconds until it is ready. See Get a session.

Start a session on expo.dev

Open the project's Simulator sessions page and select New simulator. The Create new simulator dialog has these fields:

FieldOptions
Session nameOptional. Up to 255 characters.
PlatformAndroid or iOS. The default is iOS.
ControllerAgent Device, Argent, or Appium. The default is Agent Device.
Build sourceOptional. Latest app build, Expo Go, From URL, or Upload build file.
DeviceOptional. See Expo Simulators devices.
Metro URLOptional. A tunneled Metro URL, from EXPO_UNSTABLE_TUNNEL_V2=1 npx expo start --tunnel.
Advanced optionsLaunch arguments and tags.

An uploaded build file must be 1 GB or smaller. Upload an APK for Android or an iOS Simulator .tar.gz archive for iOS. The dialog does not set a maximum duration or an idle limit, so the maximum duration is your account limit. You need the Developer role or higher to start a session.

Confirm that the session is ready

A session is ready when its status is in progress and its connection details are present. Check both values:

Terminal
- eas simulator:get --json --non-interactive

Continue when status is IN_PROGRESS and remoteConfig is present.

EAS CLI shows status values in uppercase, such as IN_PROGRESS. The REST API returns lowercase values, such as in-progress.

Do not use the .env.eas-simulator file alone as proof that the device is live. The file can contain the ID of a session that has already stopped.

Start a second session safely

eas simulator:start creates a new session by default, even when .env.eas-simulator already contains a session ID. The command replaces the file, but it does not stop the earlier remote session. EAS CLI prints a warning with the stop command for the earlier session.

To make the start command fail instead of creating a second session, pass --no-force:

Terminal
- eas simulator:start --platform ios --type agent-device --name "Checkout flow screenshots" --no-force --non-interactive

To run more than one session at the same time from one directory, see How EAS CLI and agents select an Expo Simulators session.

Stop the session

Stop each session when you finish:

Terminal
- eas simulator:stop

The command stops the session in .env.eas-simulator. Pass --id <session-id> to stop a different session. Running simulator:stop on a session that already stopped succeeds, so you can run it again safely.

Common questions

How long does a session take to start?

Startup time varies with capacity. A session can wait in a queue, then take time to start the device. EAS CLI shows when the session is in the queue. The 15-minute startup timeout starts after the session leaves the queue.

Can I start a session without an Expo project?

Yes. You need an EAS project, but not a local Expo project directory. The REST API, expo.dev, and create session links need only the EAS project. EAS CLI needs a project directory with package.json and an app config that contains the EAS project ID. See Run a native Android or iOS app on Expo Simulators.

Does closing the terminal stop the session?

No. Closing the terminal does not stop the session, even when EAS CLI is attached. The session runs until you stop it or until it reaches its maximum duration or idle limit.