01 · Isolation
One device per user
Each session is its own Android instance with a persistent /data, sealed per user at rest.
Live · api.mobile.pairful.ai
A real, isolated Android phone per user, driven over one JSON API. Read the screen as a tree of numbered nodes, act on them by ref, and know when the screen has settled — from your code, or from Claude, Cursor and any MCP client.
/dataFeatures
01 · Isolation
Each session is its own Android instance with a persistent /data, sealed per user at rest.
02 · Observe
Every interactive node gets a ref. Act on the ref, raw coordinates, or just the label text.
03 · Settle
Each action reports whether the screen changed, so you don't sleep and hope.
04 · Input
Mark typed text sensitive and it's never logged, audited or echoed back.
05 · Apps
Launch a package the phone doesn't have — it's fetched from the app cache once, then kept.
06 · Web
A web session drives the phone's own browser over CDP with the same tap/type/swipe.
07 · Pools
Golden pools fork an already-booted phone instead of booting one per request.
08 · Sensors
Feed the phone a GPS fix; read what landed in its notification shade.
API
Every route but /health takes Authorization: Bearer $TOKEN.
Acquire a phone for a user. Their /data comes with it.
$ curl -X POST $API/sessions \ -H "Authorization: Bearer $TOKEN" \ -d '{"user":"demo","locale":"en-US"}' → 200 { "id": "s-ab12cd", "kind": "android", "serial": "emulator-5554", "app": null, "tenant": null, "user": "demo", "mode": "a11y" }
What's on screen, interactive nodes first. Refs stay valid until the next read.
$ curl $API/sessions/s-ab12cd/tree -H "Authorization: Bearer $TOKEN" → 200 [ { "ref": 12, "role": "EditText", "hint": "Email", "editable": true, ... }, { "ref": 13, "role": "EditText", "hint": "Password", "password": true, ... }, { "ref": 14, "role": "Button", "text": "Log in", "clickable": true, ... }, { "ref": 15, "role": "TextView", "text": "Forgot password?", ... } ]
Tap by ref, by x/y, or by label text.
$ curl -X POST $API/sessions/s-ab12cd/tap \ -H "Authorization: Bearer $TOKEN" \ -d '{"text":"Log in"}' → 200 { "tapped": 14, "changed": true }
The current screen as a PNG.
$ curl $API/sessions/s-ab12cd/screenshot \ -H "Authorization: Bearer $TOKEN" -o screen.png → 200 content-type: image/png
Pricing
$0/ month
Live now — no card.
/datasoon
For a project in production.
soon
For a growing fleet.
Custom
Dedicated capacity & terms.
Billing isn't switched on yet — usage is metered, nothing is charged. The free tier is the only active plan today.
Principles
/dataThe cost: apps that require hardware-backed integrity (most banks) won't run. Read the principles →
Status
api.mobile.pairful.ai — self-serve sign-up and your own API key