Skip to content

How to automate data entry in an iPhone app that has no API

To automate an iPhone app that has no API, drive its screens. Mobster for Mac does that from your Mac: it reads each screen’s labeled fields and buttons, then taps and types by name, the way you would. For data entry, save one entry as a workflow. Put it in a Loop over Each row. Paste or import a CSV so each round types one row’s values into the app. On an iPhone 17 Pro simulator, adding “Dinner with Sam” to Calendar and checking it takes 26.2 s and costs $0.041. The test covers one run with Claude Sonnet 5.5. Three simulators start their tasks in the same second. This measures a Calendar task on a simulator. It does not measure a CSV loop or an app without an API.

How Mobster works an app with no API

Mobster puts one helper on the iPhone: WebDriverAgent, the open-source XCTest runner from the Appium project, signed with your Apple Account. Through it, Mobster reads each screen’s controls by the labels VoiceOver reads. It also gets a small screenshot. It identifies “Save” as a button to tap. It checks whether a switch is on. It reads back the text it enters. You don’t need to jailbreak your iPhone. The app’s developer doesn’t need to add anything.

For one record, type a task such as Add Dinner with Sam to my calendar this Friday at 7 PM. You can also attach a CSV to a task, and the agent built into Mobster reads it on your Mac.

Enter one record per row of a CSV

  1. Run one entry as a task, with real values, in the app you use.
  2. Under its answer, choose Save as workflow. Check the drafted step for the blanks you need, such as {name} and {phone}. Add any missing blanks yourself. Without an Anthropic key, Mobster marks only amounts and times as blanks.
  3. On the workflow’s page, select the step and choose Repeat these. In the loop’s inspector, set Over to Each row.
  4. Under Rows, paste one value per line, or a CSV whose header row names the blanks (name,phone). Import CSV reads a file under 1 MB. A loop runs at most 200 rows. Each value keeps its first 300 characters. Leave Rows empty and each run asks for them.
  5. Fill in the step’s When it worked, the screen shows with literal text that confirms the entry succeeded. Mobster checks the screen after the step. A failed check ends the loop.
  6. Choose Save workflow, then Run.

Through the API, a run takes the rows too: POST /api/workflows/{id}/run with rows. A workflow saved with "repeat": {"kind": "each", "rows": [...]} loops over them.

What each round does

  • It types your values. Typed text comes from the workflow’s own words, so {phone} types that row’s phone number as written.
  • Later rounds repeat the learned steps. After the first round is learned, the next rounds replay with no model, each with its own row’s words. When a screen doesn’t match, the model takes over from that step.
  • It asks before a Submit, by default. In Ask before acting, the default mode, a tap on a control labeled Submit, Send, Post, Buy or Delete waits for your OK, in every round. Ask before every change also asks before changes that stay on the phone, such as saving a note.
  • It stops automatic retries after an uncertain save. Mobster never types into a field that already holds the text. A tap on a form whose fields hold text never goes out again on its own when its first outcome is unknown: Mobster asks you, in every mode. On the canvas, a round that may have saved shows an amber ring. It does not run again on its own. These checks do not establish that your records are unique.

Read data out of the app

Use the App API to read app data as JSON from a script or your agent. It only reads: any method but GET answers 405.

mobster api tokens create "my script"mobster api serve --phone "Test iPhone"curl -H "Authorization: Bearer $TOKEN" \  'http://127.0.0.1:8780/v1/screen?app=com.example.shop&fields=title,price,rating&n=20&pages=3'

Use /v1/screen to read text exposed in an app’s accessibility tree. A small model puts the screen’s text into rows with the fields you name. With your Claude key, it uses Claude Haiku. With your OpenAI key, it uses Smart’s model. pages scrolls and reads up to 5 screens. For apps with an app pack, Mobster reads the data with code and no model. Their endpoints can return CSV with format=csv. Your coding agent gets the same reads as MCP tools, such as read_screen.

Teach a screen Mobster gets wrong

On Workflows, type the words for the task and choose Teach it. Choose Show iPhone, then Teach, and do the entry once on the live view. For each value you typed, choose Always this or Ask each time. Each taught step runs with code when its screen matches the one you teach. The model handles only steps whose screens differ. Teaching needs an iPhone on USB.

What iOS Shortcuts can do instead

Shortcuts runs actions, and Apple describes actions as “the best features of the apps on your Apple devices, broken out into smaller parts.” An app’s own shortcuts appear under App Shortcuts only if the app includes them. Developers offer those actions with Apple’s App Intents framework. When the app you use offers an action for the record you enter, Shortcuts runs it on the phone, with no Mac. When it offers none, Mobster enters the data through the app’s screens.

What you need and what it costs

You need an Apple silicon Mac, Xcode signed in to an Apple Account (a free one works), an iPhone with Developer Mode on and a USB cable. The iPhone stays unlocked during a run. Mobster can’t get past Face ID, a passcode or a CAPTCHA.

Mobster for Mac is free on any number of iPhones. The agent’s model calls use your own AI plan or API key. Each workflow stops a run at its own spending limit, $5.00 by default.

Automate your own iPhone from a Mac covers setup and approvals in more detail.

Questions

  • Does Mobster need the app's developer to add anything?

    No. Mobster reads the labels iOS gives each control, the same ones VoiceOver reads. You can use it in apps that offer no API or Shortcuts actions. Games that draw their own screens don't work.

  • Can a loop enter the same record twice?

    A round that may have saved stays as it ended and never runs again on its own. Mobster also never types into a field that already holds the text.

Sources