By arrangement. iPhones are set up per account: we plug your phone into a Mac we run and grant it to you. The API refuses an iPhone start from an account without that grant. Contact us to set one up.
What a phone is
Every session names what it is with two words, never who runs it:GET /me tells you what you may start:
ios entry with its id, your label for it, and a state: available, or running while one of your sessions has it. If available has no ios entry, your account has no iPhone yet.
Start it
device_id is the phone’s id from available. It is optional while you hold one iPhone and required once you hold several (400 device_id names which of your phones to start). The reply is a session like any other, ready in a couple of seconds, with "platform": "ios", "kind": "device" and "device": "iPhone". One session at a time holds each iPhone; a second start on the same phone answers 409 profile_running and names the session that has it. Your iPhones run beside your Android phones and beside each other: none waits on another. Without an iPhone on your account, or for a phone you were not granted, the request answers 400 no phone of that platform and kind is available to this account.
Drive it
An iPhone has no ADB. Instead a ready session carries acontrol block:
POST <url>/opwithAuthorization: Bearer <token>and a body{"op": "input.tap", "kw": {"x": 200, "y": 400}}runs one operation: screen, touch, buttons, apps, clipboard, the same vocabulary as the Android phones.GET <url>/frame.pngreturns the current screen.GET /sessions/{sid}/owner-viewermints the live viewer, the same page the dashboard shows: tap and type on your phone from the browser.
Stop it
DELETE /sessions/{sid} ends the session in a few seconds. Your phone keeps its apps, accounts and data; nothing is reset. The session shows "billing_mode": "disabled" and costs nothing.