You have two options for connecting devices to your session:
Connect App (Whitelabel)
Custom SDK Integration
Use Uplink’s whitelabel Connect app by presenting a QR code to your users:
1
Display QR code
Display the session.qrUrl as a QR code in your application. You can use any QR code library like qrcode or react-qr-code:
import QRCode from 'qrcode'// Generate QR code imageconst qrCodeImage = await QRCode.toDataURL(session.qrUrl)// Display in your UI// <img src={qrCodeImage} alt="Scan to connect" />
2
User scans QR code
Your user scans the QR code with their device camera. This opens the Uplink Connect app (iOS App Clip or Android instant app)
3
Device connects
The device automatically connects to your session as a worker
No installation required! The Connect app opens automatically via iOS App Clip or Android deeplink when users scan the QR code.
Own the complete UI experience by integrating the Uplink SDK into your own mobile app:
1
Add SDK to your app
Follow the mobile SDK integration guide for iOS or Android
2
Pass session URL to device
Deliver the session.sessionUrl to your mobile app through your own means (push notification, deep link, API call, etc.)
3
Connect in your app
Use the Uplink SDK in your mobile app to connect to the session URL.
With custom SDK integration, you control the entire user experience and can integrate Uplink into your existing mobile app.
Once you’re comfortable with the basics, try these common automation scenarios:
Wait for user login, then automate
await page.goto('https://app.example.com/login')// User logs in on their device (handles 2FA, authentication, etc.)await page.waitForAuthentication( async (page) => { const url = await page.url() return url.includes('/dashboard') }, { timeout: 120000 })// Now automate actions in the authenticated sessionawait page.click('#export-button')
Extract data from a page
await page.goto('https://example.com/products')// Manual extractionconst products = await page.evaluate(() => { return Array.from(document.querySelectorAll('.product')).map(el => ({ name: el.querySelector('.name').textContent, price: el.querySelector('.price').textContent }))})console.log(products)// Or use AI extraction with type safety (requires @uplink-code/ai)import { z } from 'zod'const result = await page.extract( 'Extract all products with name and price', z.object({ products: z.array(z.object({ name: z.string(), price: z.number() })) }))console.log(result.data.products) // Fully typed!
AI-powered form filling
// Requires: npm install @uplink-code/aiimport ai from '@uplink-code/ai'const agent = ai.createAgent({ provider: 'anthropic', options: { apiKey: process.env.ANTHROPIC_API_KEY }})const session = await uplink.session('<project-api-key>', { projectId: '<project-id>', include: { ecdsa: true, ecdh: true }})const client = await uplink.client.fromSession(session, { agent })const browser = await client.launch()const page = await browser.newPage()await page.goto('https://example.com/contact')// Let AI fill out the formawait page.act('Fill in name with "John Doe" and email with "john@example.com"')await page.act('Click the submit button')