API reference

Simulators

iOS simulator lifecycle, inspection, and input.

Create

GET /api/v1/simulator-creation-options returns installed device types and runtimes. Then:

POST /api/v1/simulators
{ "name": "Fleet iPhone", "deviceTypeIdentifier": "…", "runtimeIdentifier": "…" }

The new simulator stays shut down until you boot it through the fleet.

Lifecycle

POST /api/v1/simulators/{udid}/boot       # body { "stock": true } boots without slimming
POST /api/v1/simulators/{udid}/slim
POST /api/v1/simulators/{udid}/restore
POST /api/v1/simulators/{udid}/shutdown
POST /api/v1/simulators/{udid}/open       # show in Device Hub (Xcode 27+) or Simulator.app

Each returns 202 with a job and pollUrl (GET /api/v1/simulators/jobs/{jobId}). Boots succeed only after simslim verify confirms the profile, with one automatic retry; cold boots can take a few minutes when several devices contend for CoreSimulator. restore and stock boots record an opt-out from auto-slim; slim and a normal boot clear it.

Inspect

RequestReturns
GET /api/v1/simulators/{udid}/uiAccessibility tree with frames in points
GET /api/v1/simulators/{udid}/ui?x=20&y=40Hit test at a point
GET /api/v1/simulators/{udid}/screenshotJPEG
GET /api/v1/simulators/{udid}/definitionScreen and device geometry

Input

POST /api/v1/simulators/{udid}/input with one of:

{ "kind": "tap", "x": 200, "y": 436, "width": 400, "height": 872 }
{ "kind": "double-tap", "x": 200, "y": 436, "width": 400, "height": 872 }
{ "kind": "swipe", "startX": 200, "startY": 700, "endX": 200, "endY": 200, "width": 400, "height": 872 }
{ "kind": "text", "text": "hello" }
{ "kind": "key", "code": "Enter", "modifiers": ["command"] }
{ "kind": "button", "button": "home" }
{ "kind": "orientation", "orientation": "landscape-left" }
{ "kind": "open-url", "url": "myapp://path" }
{ "kind": "shake" }

width and height describe the frame your coordinates are in; pass the size from /definition to use device points directly. Key codes are W3C KeyboardEvent.code values.