Riddle Distributed Computing
Your agent's browser
Stop managing browsers. Elevate your agents.
Send JSON. Get screenshots. Debug with console logs and network HAR.
No infrastructure. Navigate, click, fill forms—all without spinning up Chrome.
5 minutes free. No credit card.
Workflow API
Send JSON steps. Get screenshots, console logs, and network HAR.
One call, multiple actions
const { screenshot, console, har } = await fetch("https://api.riddledc.com/v1/run", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
steps: [
{ goto: "https://example.com/login" },
{ fill: { selector: "#email", value: "user@example.com" } },
{ fill: { selector: "#password", value: "secret" } },
{ click: "button[type=submit]" },
{ waitForUrl: "**/dashboard**" },
{ screenshot: "dashboard" }
],
include: ["console", "har"] // Get everything in one call
})
}).then(r => r.json());
// screenshot.data - base64 PNG of your dashboard
// console.entries - every console.log, warn, error
// har.log.entries - full network trace with all requestsRich results
Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels.
No Playwright required
Your agent generates JSON, not code. No syntax errors, no script injection risks.
Pack work into sessions
30s minimum per job. Do multiple navigations and screenshots in one call for maximum value.
Assert without vision
Use assert steps to check page state. Only screenshot when you need to.
Need full control? Write Playwright.
When JSON steps aren't enough—loops, conditionals, data extraction—send a Playwright script instead. Same endpoint, full browser power.
const result = await fetch("https://api.riddledc.com/v1/run", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
script: `
const viewports = [
{ width: 1440, height: 900, name: "desktop" },
{ width: 768, height: 1024, name: "tablet" },
{ width: 375, height: 812, name: "mobile" }
];
const results = [];
for (const vp of viewports) {
await page.setViewportSize({ width: vp.width, height: vp.height });
await page.goto("https://example.com");
await page.waitForLoadState("networkidle");
// Check for layout issues
const overflow = await page.evaluate(() =>
document.body.scrollWidth > window.innerWidth
);
results.push({
viewport: vp.name,
hasOverflow: overflow,
title: await page.title()
});
await saveScreenshot(vp.name);
}
console.log(JSON.stringify(results));
`,
include: ["console"]
})
}).then(r => r.json());
// Multiple screenshots + structured data in one callFull Playwright, zero infra
Write any valid Playwright code. We handle the browser, you handle the logic.
Built-in helpers
saveScreenshot(), saveJson(), and console.log() pipe results back to you automatically.
Same billing
Script mode runs on the same per-second billing. No premium. No add-on.
Or just grab a screenshot
Same endpoint, simpler input
const response = await fetch("https://api.riddledc.com/v1/run", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({ url: "https://example.com" })
});
const { screenshot } = await response.json();
// screenshot contains your PNGBuilt for agents
🔍 Vision when needed
Your agent thinks, then acts. Batch navigation, form fills, and checks into one job. Screenshot only at decision points.
🔐 Authenticated sessions
Inject cookies, headers, or localStorage. Log in once with your agent, reuse the session across calls.
✅ Assertions without vision
Check if a selector exists or URL matches before deciding to screenshot. Cheaper than sending every page to a vision model.
🎭 Script mode
When JSON isn't enough, send full Playwright. Loops, conditionals, try/catch, data extraction—anything you can write in code.
Simple pricing
Billed per second, 30s minimum
One screenshot or many
No subscriptions. No monthly minimums. Pay for what you use (30s minimum).
5 minutes free to start. No credit card.
Why not self-host?
Chromium is 280MB. Lambda's limit is 250MB.
Lambda ran out of memory launching Chrome.
Cold start + Chrome launch exceeded API Gateway's limit.
We run browsers at scale so you don't have to.
See the full comparison →
Give your agent eyes
Create an account and start making API calls in minutes. 5 minutes free.