> ## Documentation Index
> Fetch the complete documentation index at: https://docs.autosana.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Real Device Testing

> Run flows on real iOS and Android phones in the cloud.

Run any mobile flow on real hardware — actual iPhones, Pixels, and Galaxy devices — instead of an emulator or simulator. Same flows, same agent, real devices.

<Note>Real device testing is currently in **free beta**.</Note>

## Build requirements

What you can run depends on the build you upload:

| Platform | Build               | Runs on                        |
| -------- | ------------------- | ------------------------------ |
| iOS      | `.app` / `.app.zip` | Simulator only                 |
| iOS      | `.ipa`              | Real devices only              |
| Android  | `.apk` / `.aab`     | Emulators **and** real devices |

For iOS, upload an `.ipa` built for physical devices. Android builds work on both targets with no changes.

## Running on a real device

<Tabs>
  <Tab title="Dashboard">
    Click **Run** on a flow (or suite), set **Target** to **Real device**, and pick a device model and OS version. The picker lists the live device catalog — newest models first — and defaults to the newest available device.

    If your app's active build is an `.ipa`, the dialog opens on **Real device** automatically.
  </Tab>

  <Tab title="API">
    Pass `physical_device` (and optionally `device_filter`) in the body — see [API → Run Flows](/api-runs).

    ```bash theme={null}
    curl -X POST https://backend.autosana.ai/api/v1/flows/run \
      -H "X-API-Key: $AUTOSANA_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "bundle_id": "com.example.app",
        "platform": "ios",
        "flow_ids": ["660e8400-e29b-41d4-a716-446655440001"],
        "physical_device": true,
        "device_filter": {
          "model": "iPhone 16 Pro",
          "os_version": { "exact": "18" }
        }
      }'
    ```

    Omit `device_filter` to run on the best available device for the platform.
  </Tab>
</Tabs>

## Picking a device

`device_filter` narrows which device the run lands on. All fields are optional:

* `model` — e.g. `"iPhone 16 Pro"`, `"Pixel 9"`. Matches the names shown in the dashboard picker.
* `os_version` — `{ "exact": "18" }` matches any 18.x; `{ "exact": "18.3.1" }` matches only that version.
* `manufacturer` — e.g. `"Samsung"`, or a list of acceptable manufacturers.
* `form_factor` — `"phone"` or `"tablet"`.

If no device matches your criteria, the run fails immediately with a clear error — pick a different model or OS version. Device availability is checked at run time; a model that's momentarily busy is still attempted.

## What you get

Real-device runs flow through the same pipeline as every other run:

* **Full video recording** of the session, with per-action replay markers
* **Screenshots and annotations** for every agent action
* **Device identity on the run page** — the exact model and OS the run executed on (e.g. `Pixel 9 · Android 16 · Real device`)
* Suites share one device session across their flows, so back-to-back flows start fast

<Note>
  Real-device runs take \~1–2 minutes longer to start than emulator runs while a device is acquired, and iOS sessions take a few extra minutes to finalize their video after the run completes.
</Note>

## Push notifications

End-to-end push-notification testing on physical iOS and Android devices uses private devices that preserve the app's original signing and notification entitlements. This requires an enterprise contract. [Contact us](mailto:founders@autosana.ai) for availability and setup.

For self-service APNs and FCM testing, see [Testing Push Notifications](/guides-push-notifications) for the iOS Simulator and Android Emulator workflow.
