Skip to main content
Watch it live
Watch any session live, and take over by hand when you start it for that.
Your network
Bring your own proxy or VPN: SOCKS5 on every plan, OpenVPN or WireGuard on paid plans.
Safari's engine
Built from WebKit, the engine inside Safari. It is not desktop Chrome made to look like a phone.
iPhone Safari, on demand

22 iPhone setups to choose from, iPhone 13 to 17 Pro Max.

Use one yourself, run it from your code, or hand the job to our AI agent on every paid plan on offer. A saved profile keeps its own logins, so it's still signed in next time.

7-day free trial. No card needed.
No fee per page10 iPhone modelsApp, API or AI agentSaved logins per profileExits through your own proxy or VPNAccount data on EU servers7-day trial, no card
01What is Driftstack?

iPhone Safari, in the cloud

Each profile is its own iPhone, with its own logins and its own exit country, ready when you are.

  • Phone-shaped cardsEach one shows the profile's iPhone, its city, and whether it's live.
  • Folders and tagsSort profiles by client, by region or by job. Tags cover anything folders don't.
See the app
The Driftstack desktop app, Profiles view: eight iPhone profile cards, each drawn as a small phone showing its name — amsterdam shopper, tokyo sneakers, london checkout, paris fashion and more — the iPhone model it runs as, whether it is Live or Idle, the city it browses from (Amsterdam, Tokyo, Zurich, Berlin, London, Paris), the connection it uses, and a Launch button.
02How it works

Up and running in three steps

Step 1

Add your proxy and pick an iPhone

A profile is one saved iPhone: it keeps its own logins, cookies and site data, so it stays signed in. Pick its iPhone, or take a random one.

Step 2

Launch it

One click in the app, or one call from code.

Step 3

Use it

Tap, swipe, scroll and type, like on a phone. Or, on a paid plan, describe the job in plain English and let the AI agent drive.

Bring your own proxy or VPN: SOCKS5 on every plan, OpenVPN or WireGuard on paid plans.

03Use cases

Three jobs it's built for

Test on the real engine

Run automated tests on Safari's own engine, not a resized desktop browser.

See QA on iPhone Safari
04Three ways to drive it

Point and click, or say what you want

One session, with three ways to drive it.

The Driftstack desktop app, AI agent view, mid-task: the iPhone Safari session lit up in its dark stage, showing a shop’s search results, beside the mission bar (task title, a Running status, budget remaining, the profile and model in use) and the six-step plan running alongside it.
A floating session window in the Driftstack desktop app, lifted over the app behind it — the Profiles view, its grid of iPhone profile cards showing around the window. The window toolbar names the profile (tokyo sneakers) and the iPhone model (iPhone 17) with a Live badge, the same profile the grid behind shows running. On the iPhone-shaped screen an example shop page, searched for a rain jacket, showing four jackets with their prices in euros, and the iPhone keyboard open below it. Beside the screen a panel lists the session link, how fast the video is running, its exit — a residential connection in Tokyo, with the time zone to match — and the identity readouts.
You drive

The desktop app

Point and click, live. Profiles in folders and tags. Each session opens in a session window.

See the app
It drives

The AI agent

Say what you want in plain English and watch it happen. Your account setting decides whether it stops for your OK when a step looks like a purchase, a payment or an account deletion.

The AI agent is on every paid plan on offer. Starter to Scale include AI credits each month, and you can add your own AI key instead.

See it run
Your code drives

The API

Write the job once and run it as often as you like, with no AI cost and no AI wait.

See the code
05Why Driftstack works

Safari's engine, checked against a real iPhone where we have one to test

Most tools take a desktop browser and change what it reports. Driftstack's browsers don't. Each one runs WebKit, the engine inside Safari, on Macs in a data centre, so what a page measures in the browser comes from that engine.

iPhone models

The models your users carry

10 iPhone models, from the iPhone 13 to the 17 Pro Max, in Safari 18.6–26.6.1. New profiles get a randomly chosen iPhone model from those your plan includes that are open for new profiles; you can also pick a model yourself. Every paid plan offers all of them; the trial runs the iPhone 13.

Checked against a real iPhone where we have one to test

Any mismatch is fixed as a bug

We compare what websites can measure against a real iPhone where we have one to test. Any difference counts as a bug in the engine.

See the checks side by side, on one profile
Set in the engine

The iPhone setup lives in the engine

Model, screen size and touch are set inside the browser engine itself. Driftstack adds no script to a page to change what it reads about the browser. The steps you ask for do run in the page, as they do in any automated browser.

What websites see

Five signals, side by side

A browser that only changes the line where it names itself still gives away its real engine. It shows in how it draws and how it shows 3D.

Tool-by-tool detail is on the comparison page.

SignalDesktop Chrome posing as an iPhoneDriftstack
What it says it isrewrittenSafari's own
How it drawsChrome'sApple's own (WebKit)
3D graphicsthe computer's chipan Apple graphics chip
How text looksthe computer'sApple's own (WebKit)
Script engineChrome'sSafari's

Device identities are measured against a real iPhone where we have one to test. Some details still differ from a real iPhone, for example canvas drawing on Safari 26.4 and later.

06Human by design

It even moves like a person

Taps, swipes and typing follow timing taken from real people. On by default. Pages react the way they do for someone holding a phone.

Touch & scroll

Flicks carry momentum. Taps vary in length, like a real thumb. When you drive by hand, your finger's path curves like a real one.

Typing rhythm

Letters arrive one at a time, with the small pauses of real thumbs. Nothing is pasted in at once.

07For developers

iPhone Safari, programmable from any language

driftstack-typescript-sdk

Describe the task in plain words. The AI plans each step, runs it, and sends back its answer.

import { Driftstack } from '@driftstack/sdk';

const ds = new Driftstack({ apiKey: process.env.DRIFTSTACK_API_KEY! });

// Every session goes out through one of your saved proxies.
let session = await ds.agentSessions.create({ proxy_id: process.env.DRIFTSTACK_PROXY_ID! });

try {
  // Wait up to two minutes for its browser to start.
  for (let i = 0; session.ready === false && i < 60; i++) {
    if (session.status === 'closed') throw new Error('The session did not start');
    await new Promise((resolve) => setTimeout(resolve, 2_000));
    session = await ds.agentSessions.get(session.id);
  }

  // Say what you want. The AI plans the steps and runs them;
  // the call returns when its turn ends.
  const reply = await ds.agentSessions.message(
    session.id,
    'Open https://books.toscrape.com, go to the Travel category ' +
      'and tell me the cheapest book there and its price.',
    { onStep: ({ index, result }) => console.log('step', index + 1, result.kind) },
  );

  // A turn that stops early (a limit, or a question for you) carries a notice.
  if (reply.kind !== 'plan-executed' || reply.notice !== undefined || reply.answer === undefined) {
    throw new Error('The task did not finish');
  }
  console.log(reply.answer);
} finally {
  await ds.agentSessions.close(session.id);
}

Up to 8 steps you write, run exactly as written. No AI, and none of the AI budget used.

import { Driftstack } from '@driftstack/sdk';

const ds = new Driftstack({ apiKey: process.env.DRIFTSTACK_API_KEY! });

let session = await ds.agentSessions.create({ proxy_id: process.env.DRIFTSTACK_PROXY_ID! });

try {
  // Wait up to two minutes for its browser to start.
  for (let i = 0; session.ready === false && i < 60; i++) {
    if (session.status === 'closed') throw new Error('The session did not start');
    await new Promise((resolve) => setTimeout(resolve, 2_000));
    session = await ds.agentSessions.get(session.id);
  }

  // Open a page, type, tap, wait, read: each step runs as written.
  const run = await ds.agentSessions.runSteps(session.id, [
    { kind: 'navigate', url: 'https://quotes.toscrape.com/login' },
    { kind: 'interact', action: 'type', selector: '#username', value: 'demo' },
    { kind: 'interact', action: 'type', selector: '#password', value: 'demo', sensitive: true },
    { kind: 'interact', action: 'tap', selector: 'input[type="submit"]' },
    { kind: 'wait', condition: 'selector_visible', selector: 'a[href$="logout"]' },
    { kind: 'extract', selector: '.quote .text' },
  ]);

  const quote = run.kind === 'plan-executed' && run.ok ? run.results.at(-1) : undefined;
  if (quote?.kind !== 'success') throw new Error('A step failed');
  console.log(quote.summary); // the first quote on the signed-in page
} finally {
  await ds.agentSessions.close(session.id);
}

A profile is one saved iPhone. Every session you start with it is that same device, with its cookies and logins.

import { Driftstack } from '@driftstack/sdk';

const ds = new Driftstack({ apiKey: process.env.DRIFTSTACK_API_KEY! });

// Save an iPhone once. The device is chosen for you unless you name one.
const profile = await ds.profiles.create({ name: 'Example shop account' });

try {
  // Start sessions as this iPhone with
  // agentSessions.create({ profile_id: profile.id, proxy_id }).
  const saved = await ds.profiles.get(profile.id);
  console.log(saved.name, 'runs as', saved.archetype);
} finally {
  // This example cleans up after itself; yours would keep the profile.
  await ds.profiles.delete(profile.id);
}

A few lines to an iPhone Safari session.

SDKs for TypeScript, Python and Go, or call the API from any tool.

Read the docs
SDKTypeScript@driftstack/sdk
SDKPythondriftstack-sdk
SDKGodriftstack-go
Using Playwright, Puppeteer or Selenium?

Driftstack doesn't plug into Playwright, Puppeteer or Selenium. Your tests call its API instead.

08The console

Each profile keeps its iPhone, its logins and its exit country

The Driftstack desktop app, Command centre: a greeting that asks what to automate, with one session running, eight profiles and three healthy proxies, above four tiles for profiles, active sessions, proxies and the plan.

Each profile keeps its iPhone

Your saved profile keeps its device until you change it: the same iPhone model, Safari version and fonts, each time you come back.

The Driftstack desktop app, Proxies view: the header counts three proxies, all healthy, above three editors side by side for your own internet exits — a SOCKS5 proxy with an example host, a WireGuard tunnel showing the server, address and routes it saved, and an OpenVPN tunnel with its config file in the box — each with a Test button and Save changes.

Exit anywhere and know what gets through

Give each profile its own proxy or VPN, and its own country. A VPN carries everything the profile does, live audio and video included.

Test your connection before you launch: see what the Test button checks.

The session's time zone follows the country your proxy or VPN exits from.

09Billing & privacy

Simple to pay for and hard to snoop on

One main number: sessions at once

Plans are priced by how many sessions run at the same time — like browser tabs open at once.

No fee per page.

Where your data lives

Your account data lives on our EU servers. Sessions run on Macs in data centres in the US and the Netherlands. Stored files, like avatars and each profile's encrypted browser data, use a storage network that can copy them outside the EU.

We keep a short record of each browser session in our database for 90 days, then in an archive. Live video is never stored.

10Pricing

One plan for the app and the API

Every plan, the trial too, includes the desktop app and the API. Paid plans have no hour limit (fair use). Run as many sessions as you like, up to your plan's number at the same time.

Starter

$90 /month

For one-person businesses.

Sessions at once
1
Saved profiles
25
Start free trial

Pro

$249 /month

For small teams and scripts.

Sessions at once
3
Saved profiles
100
Start free trial

Team

$490 /month

For teams running several sessions in parallel.

Sessions at once
6
Saved profiles
300
Start free trial

Scale

$890 /month

For running 12 sessions at once. Sold by request.

Sessions at once
12
Saved profiles
1,000
Talk to us

Prices are in US dollars, plus VAT or sales tax where it applies. EU businesses with a valid VAT number may be billed without VAT (reverse charge), depending on where they are established.

Pay yearly and get 2 months free.

Enterprise, every limit and the FAQ are on the pricing page.

See pricing
11Self-hosted

Or run it on hardware you own

Driftstack on Macs you own.

We install it with you and send every update and new device profile. You run the machines. For full control, extra privacy or steady high volume.

See self-hosted
12Ready when you are

Start free and see it for yourself

7-day free trial. No card needed.
7-day free trial. No card needed.
Start free trial