User guide · 2

Use your phone from the browser or over HTTP.

The phone is a full Android system that runs on our servers and keeps its apps and data between sessions. You reach it in two ways: the live screen in the dashboard, and the API your agent calls with the same key.

Checked on a live phone · 12 Oct 2026AndroidBrowser, no install

Screen in the browser

See it and touch it.

Dashboard, Phones, your phone. Nothing to install on Windows, macOS or Linux: any current browser works.

Live phone screen in the dashboard with Back, Home, Recent, volume, rotate and power keys
The live screen with the phone keys beside it.
  • Click to tap. Drag to swipe. Hold, then release to long-press.
  • The keys beside the phone are Back, Home, Recent apps, volume up and down, rotate and power. Power asks before it acts.
  • Type on the phone sends text to the field that has focus. The Input panel has Enter, Delete and "open a web page".
  • Save screenshot downloads the current picture. Pause stops the live picture without touching the phone.

The same from a terminal:

shell · curlcopy-paste
curl -s -H "X-API-Key: $ERIUS_KEY" -o screen.jpg \
  -w "%{http_code} %{content_type} %{size_download} bytes\n" \
  "$ERIUS_API/device/$ERIUS_DEVICE/screenshot?format=jpeg&maxSide=1280"
responsereal output · 12 Oct 2026
200 image/jpeg 24723 bytes

The format is a request, not a guarantee. Normally you get a JPEG in about 0.3 seconds. For up to 30 seconds after the phone's fast screen reader restarts, the API answers with a full-size PNG instead (about 2 MB, up to 4 seconds). Read the Content-Type of the answer instead of trusting the file name.

Open a web page on the phone and wait until a text is on screen:

shell · curlcopy-paste
curl -s -X POST -H "X-API-Key: $ERIUS_KEY" -H "Content-Type: application/json" \
  -d '{"url":"https://example.com"}' $ERIUS_API/device/$ERIUS_DEVICE/launch
responsereal output · 12 Oct 2026
{
  "ok": true,
  "component": "org.mozilla.firefox/org.mozilla.fenix.HomeActivity",
  "launchState": "COLD",
  "totalTimeMs": 1107,
  "foreground": {
    "package": "org.mozilla.firefox",
    "activity": "org.mozilla.fenix.HomeActivity",
    "window": "org.mozilla.firefox/org.mozilla.fenix.HomeActivity",
    "crashDialog": false,
    "crashedPackage": null
  }
}
shell · curlcopy-paste
curl -s -X POST -H "X-API-Key: $ERIUS_KEY" -H "Content-Type: application/json" \
  -d '{"text":"Example Domain","timeout":20000}' $ERIUS_API/device/$ERIUS_DEVICE/wait
responsereal output · 12 Oct 2026
{
  "ok": true,
  "snapshot": "- Group\n  - WebView \"Example Domain\" ( )\n    - View ( )\n      - View \"This domain is for use in doc…
}

Back to the home screen:

shell · curlcopy-paste
curl -s -X POST -H "X-API-Key: $ERIUS_KEY" -H "Content-Type: application/json" \
  -d '{"key":"home"}' $ERIUS_API/device/$ERIUS_DEVICE/press
responsereal output · 12 Oct 2026
{
  "ok": true
}

ADB and scrcpy

Not offered today.

We say it plainly, because many Android tools expect it.

A direct ADB connection, and with it scrcpy, Android Studio's device mirror and adb shell, is not available to customers today. The phone's ADB port is bound to the server's loopback address only and is not reachable from the internet. An attempt ends in a timeout:

shellcopy-paste
timeout 30 adb connect api.eriusphone.com:5555 | grep -v daemon; echo "exit code ${PIPESTATUS[0]} (124 = no answer within 30 seconds)"
responsereal output · 12 Oct 2026
exit code 124 (124 = no answer within 30 seconds)

This is the same on Windows, macOS and Linux, and no key or setting on your side changes it. What you use instead:

You wantedUse this
scrcpy: see and control the screenThe live screen in the dashboard, in any browser
adb install app.apkDashboard, Apps, or POST /device/:id/install (below)
adb shell input tap, input text, key events/tap, /type, /press, /swipe in the API reference
adb shell am start/launch and /intent
adb logcat for crashesDashboard, Logs, or GET /device/:id/crashes
adb push and adb pullNot offered, see Files
adb shell (a free shell)Not offered

If your work needs real ADB, tell us in a support ticket what for. It helps us decide what to build.

Install apps

From an APK, in one step.

In the dashboard: open your phone, Apps, drop the APK. One file can be up to 384 MB, and three uploads can run at once per account.

The Apps panel with an upload area for an APK
The Apps panel.

From a terminal. The example installs the open-source camera app Open Camera from a file called app.apk:

shell · curlcopy-paste
curl -s -X POST -H "X-API-Key: $ERIUS_KEY" \
  -F apk=@app.apk "$ERIUS_API/device/$ERIUS_DEVICE/install"
responsereal output · 12 Oct 2026
{
  "ok": true,
  "device": "ca9a4ca3f-p1",
  "package": "net.sourceforge.opencamera",
  "versionCode": "96",
  "versionName": "1.56.2",
  "label": "Open Camera",
  "launchActivity": "net.sourceforge.opencamera.MainActivity",
  "minSdk": 23,
  "targetSdk": 36,
  "abis": [],
  "adbOutput": "Performing Streamed Install\nSuccess",
…

List what you installed, open it, stop it, remove it:

shell · curlcopy-paste
curl -s -H "X-API-Key: $ERIUS_KEY" "$ERIUS_API/device/$ERIUS_DEVICE/apps?thirdParty=1"
responsereal output · 12 Oct 2026
{
  "count": 1,
  "packages": [
    "net.sourceforge.opencamera"
  ]
}
shell · curlcopy-paste
curl -s -X POST -H "X-API-Key: $ERIUS_KEY" -H "Content-Type: application/json" \
  -d '{"package":"net.sourceforge.opencamera"}' $ERIUS_API/device/$ERIUS_DEVICE/launch
responsereal output · 12 Oct 2026
{
  "ok": true,
  "component": "net.sourceforge.opencamera/.MainActivity",
  "launchState": "COLD",
  "totalTimeMs": 551,
…
shell · curlcopy-paste
curl -s -X POST -H "X-API-Key: $ERIUS_KEY" -H "Content-Type: application/json" \
  -d '{"package":"net.sourceforge.opencamera"}' $ERIUS_API/device/$ERIUS_DEVICE/stop
responsereal output · 12 Oct 2026
{
  "ok": true
}
shell · curlcopy-paste
curl -s -X DELETE \
  -H "X-API-Key: $ERIUS_KEY" $ERIUS_API/device/$ERIUS_DEVICE/apps/net.sourceforge.opencamera
responsereal output · 12 Oct 2026
{
  "ok": true,
  "package": "net.sourceforge.opencamera",
  "output": "Success"
}
  • Google Play is on the phone. Signing in with a Google account is done by you, on the phone's screen. We have not yet verified a Google sign-in end to end on a new phone, so do not plan around it until you have tried it yourself.
  • A freshly opened app usually asks for permissions first. Add ?grant=1 to the install address to grant everything the app requests at install time (we ran it with the same file; the answer has the same shape).
  • The upload area in the dashboard still says "up to 1 GB". The service accepts 384 MB per file today.
  • Removing an app also removes its data.

Lock-screen password

A PIN or password on the phone itself.

Dashboard, your phone, Screen lock. Or the API below. A PIN is 4 to 16 digits; a password is 4 to 16 characters without spaces.

The Screen lock panel with fields for a new PIN
The Screen lock panel.
shell · curlcopy-paste
curl -s -H "X-API-Key: $ERIUS_KEY" $ERIUS_API/device/$ERIUS_DEVICE/screen-lock
responsereal output · 12 Oct 2026
{
  "device": "ca9a4ca3f-p1",
  "enabled": false,
  "type": "none",
  "resettable": true,
  "setAt": null
}

Set a PIN:

shell · curlcopy-paste
curl -s -X POST -H "X-API-Key: $ERIUS_KEY" -H "Content-Type: application/json" \
  -d '{"pin":"482913"}' $ERIUS_API/device/$ERIUS_DEVICE/screen-lock
responsereal output · 12 Oct 2026
{
  "ok": true,
  "changed": true,
  "device": "ca9a4ca3f-p1",
  "enabled": true,
  "type": "pin",
  "resettable": true,
  "setAt": "2026-10-12T20:22:31.382Z"
}

Change it to a password. Because the lock was set through the API, the old value is not needed:

shell · curlcopy-paste
curl -s -X POST -H "X-API-Key: $ERIUS_KEY" -H "Content-Type: application/json" \
  -d '{"password":"blue-kettle-42"}' $ERIUS_API/device/$ERIUS_DEVICE/screen-lock
responsereal output · 12 Oct 2026
{
  "ok": true,
  "changed": true,
  "device": "ca9a4ca3f-p1",
  "enabled": true,
  "type": "password",
  "resettable": true,
  "setAt": "2026-10-12T20:22:31.821Z"
}

Wake the phone and unlock it:

shell · curlcopy-paste
curl -s -X POST -H "X-API-Key: $ERIUS_KEY" $ERIUS_API/device/$ERIUS_DEVICE/unlock
responsereal output · 12 Oct 2026
{
  "ok": true,
  "unlocked": true,
  "type": "password",
  "alreadyUnlocked": true
}

Remove the lock:

shell · curlcopy-paste
curl -s -X DELETE -H "X-API-Key: $ERIUS_KEY" $ERIUS_API/device/$ERIUS_DEVICE/screen-lock
responsereal output · 12 Oct 2026
{
  "ok": true,
  "changed": true,
  "device": "ca9a4ca3f-p1",
  "enabled": false,
  "type": "none",
  "resettable": true,
  "setAt": null
}
  • Forgot it? A lock that was set through the dashboard or the API can always be changed or removed with your key ("resettable": true). A lock you set in the phone's own Settings app is not known to us: changing it needs the current value, and if you forget that we cannot recover it.
  • While the PIN pad is on screen, screenshots of it fail. That is Android protecting the PIN pad, as on any phone.
  • We have not tested calls on a locked phone. Unlock it before you start a call.

Files

No file transfer yet.

There is no endpoint to copy a file to the phone or read one back.

shell · curlcopy-paste
curl -s -w "\nHTTP %{http_code}\n" \
  -H "X-API-Key: $ERIUS_KEY" $ERIUS_API/device/$ERIUS_DEVICE/files
responsereal output · 12 Oct 2026
{
  "ok": false,
  "error": "not_found",
  "message": "no route GET /device/ca9a4ca3f-p1/files",
  "requestId": "4f2c203fe4d498ff"
}

HTTP 404

What you can send today: an APK (install), an audio file (microphone) and a video file (camera). Apps on the phone can download from the internet as usual, for example in Firefox. What apps store stays on the phone between sessions.

Camera and microphone

Decide what the phone sees and hears.

The phone has a virtual microphone and a virtual camera. Apps on the phone use them like real ones.

Microphone Upload an audio file (the example is an MP3). The next app that records from the microphone hears it:

shell · curlcopy-paste
curl -s -X POST -H "X-API-Key: $ERIUS_KEY" \
  -F audio=@hello.mp3 "$ERIUS_API/device/$ERIUS_DEVICE/mic"
responsereal output · 12 Oct 2026
{
  "ok": true,
  "device": "ca9a4ca3f-p1",
  "format": {
    "sampleRate": 48000,
    "channels": 1,
    "encoding": "pcm_s16le"
  },
  "bytes": 552960,
  "durationMs": 5760,
  "truncated": false,
  "loop": false,
…
shell · curlcopy-paste
curl -s -H "X-API-Key: $ERIUS_KEY" $ERIUS_API/device/$ERIUS_DEVICE/mic/status
responsereal output · 12 Oct 2026
{
  "device": "ca9a4ca3f-p1",
  "state": "queued",
  "playedMs": 0,
  "totalMs": 5760,
  "loop": false,
…

Stop it. The microphone returns to silence:

shell · curlcopy-paste
curl -s -X DELETE -H "X-API-Key: $ERIUS_KEY" $ERIUS_API/device/$ERIUS_DEVICE/mic
responsereal output · 12 Oct 2026
{
  "ok": true,
  "device": "ca9a4ca3f-p1",
  "state": "idle",
  "playedMs": 0,
…

Camera (beta) Upload a video file. Camera apps on the phone then show that video instead of the test card:

shell · curlcopy-paste
curl -s -X POST -H "X-API-Key: $ERIUS_KEY" \
  -F video=@clip.mp4 "$ERIUS_API/device/$ERIUS_DEVICE/camera"
responsereal output · 12 Oct 2026
{
  "ok": true,
  "restarted": true,
  "restartMs": 303,
  "device": "ca9a4ca3f-p1",
  "beta": true,
  "feeding": true,
  "output": {
    "size": "1280x720",
    "fps": 30,
    "format": "MJPEG"
  },
  "feed": {
    "bytes": 34072,
…

Back to the test card:

shell · curlcopy-paste
curl -s -X DELETE -H "X-API-Key: $ERIUS_KEY" $ERIUS_API/device/$ERIUS_DEVICE/camera
responsereal output · 12 Oct 2026
{
  "ok": true,
  "restarted": true,
  "restartMs": 402,
  "device": "ca9a4ca3f-p1",
  "beta": true,
…

During a call the microphone and camera belong to the phone's AI persona: its voice goes into the microphone and its face into the camera. Uploads made while a call is up are replaced by the persona. See Your agent's voice.

More

Everything else the phone can do.

The Device API reference lists every endpoint: reading the screen as a tree (/snapshot, /observe), tapping by label, swipes and scrolls, intents, rotation and crash logs. There is no endpoint to restart or reset a phone; if yours is stuck, see Troubleshooting.

Stuck on something?

Open a ticket from your dashboard and we answer there. No key yet? Write to info@eriusphone.com.

Open a support ticket