Use cases · QA + engineering teams
Test on the real engine
Your users are on iPhones. Your test grid probably isn't. Driftstack gives your tests an iPhone Safari browser in the cloud, started with one API call. It runs a build of Apple's own WebKit, the engine family behind iPhone Safari, on Macs.
The problem
The bug you can't reproduce is on a phone
Mobile Safari is its own world: its own rendering, its own JavaScript timing, its own quirks. A desktop browser shrunk to 390 pixels wide does not reproduce it. The layout break your iPhone users hit simply isn't there. Your suite stays green while your users see a broken page.
Driftstack sessions run a browser built from Apple's WebKit source — the engine family behind iPhone Safari, checked against a real iPhone where we have one to test. The rendering, the JavaScript timing and the quirks all come from that engine, not from a desktop browser in a phone-sized window. So rendering and layout problems that come from the engine can show up in your tests, not only on your users' phones. There is no hardware to buy.
Safari's own engine
Built from Apple's WebKit source code — the engine family behind Safari on every iPhone — not a desktop browser shrunk to phone width
The iPhone models your users carry
10 iPhone models (iPhone 13 → 17 Pro Max) — 22 device profiles in Safari 18.6–26.6.1; pick one, or get a random one
A fresh session for every test run
Sessions are created for each test run and removed after — nothing to keep running between runs
Wire it into CI
Your tests call the API from any tool
Your build-and-test pipeline — CI — starts a session with one call, gives it a task, and closes it when the run ends. First-party SDKs in TypeScript, Python, and Go, plus a plain HTTPS API any HTTP client can drive. Playwright test fixtures, n8n workflows, plain curl from a cron job. The snippet below is the whole session lifecycle.
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);
}
Start an agent session and give it the test as a task in plain
words: open the page, walk the flow, tell you what it found. The AI
plans the taps and page loads, runs them, and answers; your test
asserts on that answer and closes the session in the teardown. The
session goes out through one of your saved proxies, so the
proxy_id in the
create is the internet exit you chose. Every run gets a fresh
session — or reuse a persistent profile
when a test needs logged-in state that survives between runs. Through
the API, a profile snapshot saves that profile's device and name so
you can spin up a matching fresh profile later.
Webhooks tell your pipeline when a site throws a challenge. Your own command-line tools can sign in with a browser-approved device code instead of a pasted key.
Sessions are billed on one number: concurrent, meaning how many run at the same time — think browser tabs. Run your suite in parallel up to that limit. On a paid plan the hours you use are not billed (the free trial includes 2 hours of session time in total), and API calls are never billed; the AI agent counts against the credits your plan includes.
Which plan
Every plan includes the API
The API and the SDKs are on every plan, the free trial included. Plans differ by how many sessions run at once, so pick the one that matches how many tests run side by side. The AI agent is on every paid plan on offer too.
The 7-day free trial includes the API and the SDKs, so you can click through your pages by hand in the same week. The example above starts an AI agent session, so it needs a paid plan: the free trial has no AI agent.
Ready when you are
Check that your tests pass in iPhone Safari too
Start a free trial and check the rendering by hand. No card needed.