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. Not desktop Chrome in disguise.
iPhone Safari, on demand

7 iPhone models, from the iPhone 13 to the 15 Plus, checked against real iPhones.

Use one yourself, run it from your code, or hand the job to our AI agent on any paid plan. 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 page7 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, 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 where iPhone users are

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 just say what you want.

One session. Three ways in.

The Driftstack desktop app, AI Browser Automation 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. 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. 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. No AI cost, no AI wait.

See the code
05Why Driftstack works

Safari's engine, checked against real iPhones.

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

7 iPhone models, from the iPhone 13 to the 15 Plus, in Safari 26.4–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.

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'smatches iPhone
3D graphicsthe computer's chipan Apple graphics chip
How text looksthe computer'smatches iPhone
Script engineChrome'sSafari's

Matches iPhone = the answers a real iPhone gives. Verified device profiles are marked ✓ Verified in the app.

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 center: 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. 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. Hard to snoop on.

One main number: profiles at once.

Plans are priced by how many profiles 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 for 90 days. 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 working solo.

Profiles at once
1
Saved profiles
25
Start free trial

Pro

$249 /month

For small teams and scripts.

Profiles at once
3
Saved profiles
100
Start free trial

Team

$490 /month

For teams running several profiles at once.

Profiles at once
6
Saved profiles
300
Start free trial

Scale

$890 /month

For running 12 profiles at once. Sold by request.

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

Prices are in US dollars, plus VAT or sales tax where it applies. Businesses in an EU country other than the Netherlands, with a valid VAT number, are billed without VAT (reverse charge).

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 the packages and their terms.

See self-hosted
12Ready when you are

See it for yourself. Start free.

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