const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://api.smooth.sh/api/v1';
async function request(method, path, body = null) {
const response = await fetch(`${BASE_URL}${path}`, {
method,
headers: {
'apikey': API_KEY,
'Content-Type': 'application/json'
},
body: body ? JSON.stringify(body) : null
});
return response.json();
}
async function sendEvent(taskId, event) {
return request('POST', `/task/${taskId}/event`, event);
}
async function pollForResult(taskId, eventId, lastEventT = 0) {
while (true) {
const { r: task } = await request('GET', `/task/${taskId}?event_t=${lastEventT}`);
if (task.status !== 'running' && task.status !== 'waiting') {
throw new Error(`Task ended with status: ${task.status}`);
}
if (task.events) {
for (const event of task.events) {
if (event.id === eventId) {
if (event.payload.code === 200) {
return { result: event.payload.output, lastEventT: event.timestamp };
} else {
throw new Error(event.payload.output);
}
}
}
// Update timestamp for next poll
lastEventT = task.events[task.events.length - 1].timestamp;
}
await new Promise(r => setTimeout(r, 1000));
}
}
async function main() {
// 1. Create session
console.log('Creating session...');
const { r: session } = await request('POST', '/task', {
task: null,
url: 'https://example.com',
device: 'desktop'
});
const taskId = session.id;
console.log(`Session created: ${taskId}`);
console.log(`Live URL: ${session.live_url}`);
let lastEventT = 0;
// 2. Navigate to login page
console.log('Navigating to login...');
const gotoId = 'evt_goto_' + Date.now();
await sendEvent(taskId, {
name: 'browser_action',
payload: { name: 'goto', input: { url: 'https://example.com/login' } },
id: gotoId
});
const gotoResult = await pollForResult(taskId, gotoId, lastEventT);
lastEventT = gotoResult.lastEventT;
console.log('Navigation complete');
// 3. Run login task
console.log('Logging in...');
const loginId = 'evt_login_' + Date.now();
await sendEvent(taskId, {
name: 'session_action',
payload: {
name: 'run_task',
input: {
task: 'Fill in the login form with email "test@example.com" and password "secret123", then click the login button',
max_steps: 16
}
},
id: loginId
});
const loginResult = await pollForResult(taskId, loginId, lastEventT);
lastEventT = loginResult.lastEventT;
console.log('Login complete:', loginResult.result);
// 4. Extract user data
console.log('Extracting user data...');
const extractId = 'evt_extract_' + Date.now();
await sendEvent(taskId, {
name: 'browser_action',
payload: {
name: 'extract',
input: {
schema: {
type: 'object',
properties: {
username: { type: 'string' },
email: { type: 'string' },
accountType: { type: 'string' }
}
},
prompt: 'Extract the logged-in user profile information'
}
},
id: extractId
});
const extractResult = await pollForResult(taskId, extractId, lastEventT);
console.log('Extracted data:', extractResult.result);
// 5. Close session
console.log('Closing session...');
const closeId = 'evt_close_' + Date.now();
await sendEvent(taskId, {
name: 'session_action',
payload: { name: 'close' },
id: closeId
});
console.log('Session closed');
}
main().catch(console.error);