{
  "version": "riddle-proof.profile-result.v1",
  "profile_name": "riddle-site-v490-home-simple-screenshot-response",
  "runner": "riddle",
  "status": "product_regression",
  "baseline_policy": "invariant_only",
  "route": {
    "requested": "https://riddledc.com/",
    "observed": "/",
    "expected_path": "/",
    "matched": true,
    "http_status": 200
  },
  "artifacts": {
    "screenshots": [
      "riddle-site-v490-home-simple-screenshot-response-desktop",
      "riddle-site-v490-home-simple-screenshot-response-phone",
      "riddle-site-v490-home-simple-screenshot-response-ipad-mini",
      "riddle-site-v490-home-simple-screenshot-response-ipad"
    ],
    "console": "console.json",
    "proof_json": "proof.json",
    "dom_summary": "dom-summary.json"
  },
  "checks": [
    {
      "type": "route_loaded",
      "label": "route_loaded",
      "status": "passed",
      "evidence": {
        "expected_path": "/",
        "observed_paths": [
          "/",
          "/",
          "/",
          "/"
        ],
        "http_statuses": [
          200,
          200,
          200,
          200
        ]
      }
    },
    {
      "type": "selector_visible",
      "label": "selector_visible",
      "status": "passed",
      "evidence": {
        "selector": ".landing-page",
        "visible_counts": [
          1,
          1,
          1,
          1
        ]
      }
    },
    {
      "type": "text_visible",
      "label": "text_visible",
      "status": "passed",
      "evidence": {
        "text": "Your agent's browser",
        "matches": [
          true,
          true,
          true,
          true
        ]
      }
    },
    {
      "type": "text_visible",
      "label": "text_visible",
      "status": "passed",
      "evidence": {
        "text": "Or just grab a screenshot",
        "matches": [
          true,
          true,
          true,
          true
        ]
      }
    },
    {
      "type": "selector_text_visible",
      "label": "selector_text_visible",
      "status": "passed",
      "evidence": {
        "selector": ".code-block-wrapper",
        "text": "include: [\"screenshots\", \"console\", \"har\"]",
        "pattern": null,
        "viewports": [
          {
            "viewport": "desktop",
            "selector_count": 2,
            "visible_count": 2,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "Copy 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: ` await page.goto(\"https://example."
            ]
          },
          {
            "viewport": "phone",
            "selector_count": 2,
            "visible_count": 2,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "Copy 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: ` await page.goto(\"https://example."
            ]
          },
          {
            "viewport": "ipad-mini",
            "selector_count": 2,
            "visible_count": 2,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "Copy 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: ` await page.goto(\"https://example."
            ]
          },
          {
            "viewport": "ipad",
            "selector_count": 2,
            "visible_count": 2,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "Copy 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: ` await page.goto(\"https://example."
            ]
          }
        ]
      }
    },
    {
      "type": "selector_text_visible",
      "label": "selector_text_visible",
      "status": "failed",
      "evidence": {
        "selector": ".code-block-wrapper",
        "text": "response.arrayBuffer()",
        "pattern": null,
        "viewports": [
          {
            "viewport": "desktop",
            "selector_count": 2,
            "visible_count": 2,
            "matched_count": 0,
            "matched": false,
            "samples": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ]
          },
          {
            "viewport": "phone",
            "selector_count": 2,
            "visible_count": 2,
            "matched_count": 0,
            "matched": false,
            "samples": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ]
          },
          {
            "viewport": "ipad-mini",
            "selector_count": 2,
            "visible_count": 2,
            "matched_count": 0,
            "matched": false,
            "samples": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ]
          },
          {
            "viewport": "ipad",
            "selector_count": 2,
            "visible_count": 2,
            "matched_count": 0,
            "matched": false,
            "samples": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ]
          }
        ]
      },
      "message": "Selector .code-block-wrapper text assertion failed in 4 viewport(s)."
    },
    {
      "type": "selector_text_absent",
      "label": "selector_text_absent",
      "status": "failed",
      "evidence": {
        "selector": ".landing-page",
        "text": "const { screenshot } = await response.json();",
        "pattern": null,
        "viewports": [
          {
            "viewport": "desktop",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ]
          },
          {
            "viewport": "phone",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ]
          },
          {
            "viewport": "ipad-mini",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ]
          },
          {
            "viewport": "ipad",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ]
          }
        ]
      },
      "message": "Selector .landing-page text assertion failed in 4 viewport(s)."
    },
    {
      "type": "selector_text_absent",
      "label": "selector_text_absent",
      "status": "failed",
      "evidence": {
        "selector": ".landing-page",
        "text": "screenshot contains your PNG",
        "pattern": null,
        "viewports": [
          {
            "viewport": "desktop",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ]
          },
          {
            "viewport": "phone",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ]
          },
          {
            "viewport": "ipad-mini",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ]
          },
          {
            "viewport": "ipad",
            "selector_count": 1,
            "visible_count": 1,
            "matched_count": 1,
            "matched": true,
            "samples": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ]
          }
        ]
      },
      "message": "Selector .landing-page text assertion failed in 4 viewport(s)."
    },
    {
      "type": "link_status",
      "label": "link_status",
      "status": "passed",
      "evidence": {
        "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
        "expected_count": null,
        "min_count": 5,
        "allowed_statuses": [
          "2xx",
          "3xx"
        ],
        "require_nonzero_bytes": true,
        "min_bytes": 1000,
        "allowed_content_types": [
          "text/html"
        ],
        "viewports": [
          {
            "viewport": "desktop",
            "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
            "total_count": 7,
            "discovered_count": 21,
            "ok_count": 7,
            "failed_count": 0,
            "truncated": false,
            "max_links": 20,
            "result_count": 7,
            "stored_result_count": 7,
            "omitted_result_count": 0,
            "omitted_success_count": 0,
            "results_compacted": false,
            "min_bytes": 1000,
            "allowed_content_types": [
              "text/html"
            ],
            "status_counts": {
              "206": 7
            },
            "failures": []
          },
          {
            "viewport": "phone",
            "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
            "total_count": 7,
            "discovered_count": 21,
            "ok_count": 7,
            "failed_count": 0,
            "truncated": false,
            "max_links": 20,
            "result_count": 7,
            "stored_result_count": 7,
            "omitted_result_count": 0,
            "omitted_success_count": 0,
            "results_compacted": false,
            "min_bytes": 1000,
            "allowed_content_types": [
              "text/html"
            ],
            "status_counts": {
              "206": 7
            },
            "failures": []
          },
          {
            "viewport": "ipad-mini",
            "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
            "total_count": 7,
            "discovered_count": 21,
            "ok_count": 7,
            "failed_count": 0,
            "truncated": false,
            "max_links": 20,
            "result_count": 7,
            "stored_result_count": 7,
            "omitted_result_count": 0,
            "omitted_success_count": 0,
            "results_compacted": false,
            "min_bytes": 1000,
            "allowed_content_types": [
              "text/html"
            ],
            "status_counts": {
              "206": 7
            },
            "failures": []
          },
          {
            "viewport": "ipad",
            "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
            "total_count": 7,
            "discovered_count": 21,
            "ok_count": 7,
            "failed_count": 0,
            "truncated": false,
            "max_links": 20,
            "result_count": 7,
            "stored_result_count": 7,
            "omitted_result_count": 0,
            "omitted_success_count": 0,
            "results_compacted": false,
            "min_bytes": 1000,
            "allowed_content_types": [
              "text/html"
            ],
            "status_counts": {
              "206": 7
            },
            "failures": []
          }
        ],
        "failures": []
      }
    },
    {
      "type": "no_horizontal_overflow",
      "label": "no_horizontal_overflow",
      "status": "passed",
      "evidence": {
        "max_overflow_px": 1,
        "overflow_px": [
          0,
          0,
          0,
          0
        ],
        "bounds_overflow_px": [
          0,
          0,
          0,
          0
        ],
        "overflow_offender_counts": [
          0,
          0,
          0,
          0
        ],
        "viewports": [
          "desktop",
          "phone",
          "ipad-mini",
          "ipad"
        ]
      }
    },
    {
      "type": "no_fatal_console_errors",
      "label": "no_fatal_console_errors",
      "status": "passed",
      "evidence": {
        "console_fatal_count": 0,
        "page_error_count": 0,
        "total_console_fatal_count": 0,
        "total_page_error_count": 0,
        "allowed_console_fatal_count": 0,
        "explicitly_allowed_console_fatal_count": 0,
        "allowed_expected_network_mock_console_count": 0,
        "allowed_expected_network_mock_console_events": [],
        "allowed_page_error_count": 0,
        "allowed_console_texts": [],
        "allowed_console_patterns": [],
        "allowed_page_error_texts": [],
        "allowed_page_error_patterns": []
      }
    },
    {
      "type": "no_console_warnings",
      "label": "no_console_warnings",
      "status": "passed",
      "evidence": {
        "console_warning_count": 0,
        "total_console_warning_count": 0,
        "allowed_console_warning_count": 0,
        "allowed_console_texts": [],
        "allowed_console_patterns": [],
        "unallowed_console_warning_samples": [],
        "allowed_console_warning_samples": []
      }
    }
  ],
  "summary": "riddle-site-v490-home-simple-screenshot-response failed 3 product invariant(s) across 4 viewport(s).",
  "captured_at": "2026-05-17T12:16:46.636Z",
  "evidence": {
    "version": "riddle-proof.profile-evidence.v1",
    "profile_name": "riddle-site-v490-home-simple-screenshot-response",
    "target_url": "https://riddledc.com/",
    "baseline_policy": "invariant_only",
    "captured_at": "2026-05-17T12:16:46.636Z",
    "viewports": [
      {
        "name": "desktop",
        "width": 1280,
        "height": 900,
        "url": "https://riddledc.com/",
        "route": {
          "requested": "https://riddledc.com/",
          "observed": "/",
          "expected_path": "/",
          "matched": true,
          "http_status": 200
        },
        "title": "Riddle - Hosted Execution for AI Agents",
        "body_text_length": 3793,
        "body_text_sample": "Skip to main content Riddle Docs Proof MCP Pricing Blog Playground Sign Up Log In RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs Riddle Distributed Computing Product Riddle Proof Good Catch Diary Pricing Maximize Value Documentation MCP Recipes Playground Use Cases AI Agents Agent Guide Serverless Authenticated Pages vs Self-Hosted Blog Evidence Over Summaries Frontend Dev Without a Browser E2E Testing Tips Chatty Agents (Part I) Batching Heuristics (Part II) Vision Agents Teaching AI to Ski Support FAQ Status Contact Legal Terms Privacy © 2026 Riddle. All rights reserved.",
        "scroll_width": 1280,
        "client_width": 1280,
        "overflow_px": 0,
        "bounds_overflow_px": 0,
        "overflow_offenders": [],
        "selectors": {
          ".landing-page": {
            "count": 1,
            "visible_count": 1
          },
          ".code-block-wrapper": {
            "count": 2,
            "visible_count": 2
          }
        },
        "frames": {},
        "text_sequences": {
          ".code-block-wrapper": {
            "count": 2,
            "visible_count": 2,
            "texts": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ],
            "visible_texts": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ],
            "match_texts": [
              "Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace",
              "Copy 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 PNG"
            ],
            "visible_match_texts": [
              "Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace",
              "Copy 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 PNG"
            ]
          },
          ".landing-page": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ],
            "visible_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ],
            "match_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs"
            ],
            "visible_match_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs"
            ]
          }
        },
        "text_matches": {
          "text:Your agent's browser": true,
          "text:Or just grab a screenshot": true
        },
        "http_statuses": {},
        "link_statuses": {
          "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']": {
            "version": "riddle-proof.link-status.v1",
            "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
            "max_links": 20,
            "same_origin_only": true,
            "dedupe": true,
            "require_nonzero_bytes": true,
            "min_bytes": 1000,
            "allowed_content_types": [
              "text/html"
            ],
            "allowed_statuses": [
              "2xx",
              "3xx"
            ],
            "discovered_count": 21,
            "total_count": 7,
            "truncated": false,
            "ok_count": 7,
            "failed_count": 0,
            "status_counts": {
              "206": 7
            },
            "failures": [],
            "result_count": 7,
            "stored_result_count": 7,
            "omitted_result_count": 0,
            "omitted_success_count": 0,
            "results_compacted": false,
            "results": [
              {
                "url": "https://riddledc.com/docs/",
                "tag": "a",
                "text": "Docs",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/docs/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/",
                "tag": "a",
                "text": "Proof",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/",
                "error": null
              },
              {
                "url": "https://riddledc.com/pricing/",
                "tag": "a",
                "text": "Pricing",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/pricing/",
                "error": null
              },
              {
                "url": "https://riddledc.com/register/",
                "tag": "a",
                "text": "Sign Up",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/register/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/",
                "tag": "a",
                "text": "Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Re",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/evidence/",
                "tag": "a",
                "text": "View evidence manifest",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/evidence/",
                "error": null
              },
              {
                "url": "https://riddledc.com/vs-self-hosted/",
                "tag": "a",
                "text": "See why teams switch to Riddle →",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/vs-self-hosted/",
                "error": null
              }
            ]
          }
        },
        "setup_action_results": [],
        "screenshot_label": "riddle-site-v490-home-simple-screenshot-response-desktop"
      },
      {
        "name": "phone",
        "width": 390,
        "height": 844,
        "url": "https://riddledc.com/",
        "route": {
          "requested": "https://riddledc.com/",
          "observed": "/",
          "expected_path": "/",
          "matched": true,
          "http_status": 200
        },
        "title": "Riddle - Hosted Execution for AI Agents",
        "body_text_length": 3739,
        "body_text_sample": "Skip to main content Riddle RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs Riddle Distributed Computing Product Riddle Proof Good Catch Diary Pricing Maximize Value Documentation MCP Recipes Playground Use Cases AI Agents Agent Guide Serverless Authenticated Pages vs Self-Hosted Blog Evidence Over Summaries Frontend Dev Without a Browser E2E Testing Tips Chatty Agents (Part I) Batching Heuristics (Part II) Vision Agents Teaching AI to Ski Support FAQ Status Contact Legal Terms Privacy © 2026 Riddle. All rights reserved.",
        "scroll_width": 390,
        "client_width": 390,
        "overflow_px": 0,
        "bounds_overflow_px": 0,
        "overflow_offenders": [],
        "selectors": {
          ".landing-page": {
            "count": 1,
            "visible_count": 1
          },
          ".code-block-wrapper": {
            "count": 2,
            "visible_count": 2
          }
        },
        "frames": {},
        "text_sequences": {
          ".code-block-wrapper": {
            "count": 2,
            "visible_count": 2,
            "texts": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ],
            "visible_texts": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ],
            "match_texts": [
              "Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace",
              "Copy 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 PNG"
            ],
            "visible_match_texts": [
              "Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace",
              "Copy 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 PNG"
            ]
          },
          ".landing-page": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ],
            "visible_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ],
            "match_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs"
            ],
            "visible_match_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs"
            ]
          }
        },
        "text_matches": {
          "text:Your agent's browser": true,
          "text:Or just grab a screenshot": true
        },
        "http_statuses": {},
        "link_statuses": {
          "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']": {
            "version": "riddle-proof.link-status.v1",
            "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
            "max_links": 20,
            "same_origin_only": true,
            "dedupe": true,
            "require_nonzero_bytes": true,
            "min_bytes": 1000,
            "allowed_content_types": [
              "text/html"
            ],
            "allowed_statuses": [
              "2xx",
              "3xx"
            ],
            "discovered_count": 21,
            "total_count": 7,
            "truncated": false,
            "ok_count": 7,
            "failed_count": 0,
            "status_counts": {
              "206": 7
            },
            "failures": [],
            "result_count": 7,
            "stored_result_count": 7,
            "omitted_result_count": 0,
            "omitted_success_count": 0,
            "results_compacted": false,
            "results": [
              {
                "url": "https://riddledc.com/docs/",
                "tag": "a",
                "text": "Docs",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/docs/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/",
                "tag": "a",
                "text": "Proof",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/",
                "error": null
              },
              {
                "url": "https://riddledc.com/pricing/",
                "tag": "a",
                "text": "Pricing",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/pricing/",
                "error": null
              },
              {
                "url": "https://riddledc.com/register/",
                "tag": "a",
                "text": "Sign Up",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/register/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/",
                "tag": "a",
                "text": "Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Re",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/evidence/",
                "tag": "a",
                "text": "View evidence manifest",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/evidence/",
                "error": null
              },
              {
                "url": "https://riddledc.com/vs-self-hosted/",
                "tag": "a",
                "text": "See why teams switch to Riddle →",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/vs-self-hosted/",
                "error": null
              }
            ]
          }
        },
        "setup_action_results": [],
        "screenshot_label": "riddle-site-v490-home-simple-screenshot-response-phone"
      },
      {
        "name": "ipad-mini",
        "width": 768,
        "height": 1024,
        "url": "https://riddledc.com/",
        "route": {
          "requested": "https://riddledc.com/",
          "observed": "/",
          "expected_path": "/",
          "matched": true,
          "http_status": 200
        },
        "title": "Riddle - Hosted Execution for AI Agents",
        "body_text_length": 3739,
        "body_text_sample": "Skip to main content Riddle RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs Riddle Distributed Computing Product Riddle Proof Good Catch Diary Pricing Maximize Value Documentation MCP Recipes Playground Use Cases AI Agents Agent Guide Serverless Authenticated Pages vs Self-Hosted Blog Evidence Over Summaries Frontend Dev Without a Browser E2E Testing Tips Chatty Agents (Part I) Batching Heuristics (Part II) Vision Agents Teaching AI to Ski Support FAQ Status Contact Legal Terms Privacy © 2026 Riddle. All rights reserved.",
        "scroll_width": 768,
        "client_width": 768,
        "overflow_px": 0,
        "bounds_overflow_px": 0,
        "overflow_offenders": [],
        "selectors": {
          ".landing-page": {
            "count": 1,
            "visible_count": 1
          },
          ".code-block-wrapper": {
            "count": 2,
            "visible_count": 2
          }
        },
        "frames": {},
        "text_sequences": {
          ".code-block-wrapper": {
            "count": 2,
            "visible_count": 2,
            "texts": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ],
            "visible_texts": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ],
            "match_texts": [
              "Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace",
              "Copy 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 PNG"
            ],
            "visible_match_texts": [
              "Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace",
              "Copy 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 PNG"
            ]
          },
          ".landing-page": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ],
            "visible_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ],
            "match_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs"
            ],
            "visible_match_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs"
            ]
          }
        },
        "text_matches": {
          "text:Your agent's browser": true,
          "text:Or just grab a screenshot": true
        },
        "http_statuses": {},
        "link_statuses": {
          "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']": {
            "version": "riddle-proof.link-status.v1",
            "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
            "max_links": 20,
            "same_origin_only": true,
            "dedupe": true,
            "require_nonzero_bytes": true,
            "min_bytes": 1000,
            "allowed_content_types": [
              "text/html"
            ],
            "allowed_statuses": [
              "2xx",
              "3xx"
            ],
            "discovered_count": 21,
            "total_count": 7,
            "truncated": false,
            "ok_count": 7,
            "failed_count": 0,
            "status_counts": {
              "206": 7
            },
            "failures": [],
            "result_count": 7,
            "stored_result_count": 7,
            "omitted_result_count": 0,
            "omitted_success_count": 0,
            "results_compacted": false,
            "results": [
              {
                "url": "https://riddledc.com/docs/",
                "tag": "a",
                "text": "Docs",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/docs/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/",
                "tag": "a",
                "text": "Proof",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/",
                "error": null
              },
              {
                "url": "https://riddledc.com/pricing/",
                "tag": "a",
                "text": "Pricing",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/pricing/",
                "error": null
              },
              {
                "url": "https://riddledc.com/register/",
                "tag": "a",
                "text": "Sign Up",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/register/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/",
                "tag": "a",
                "text": "Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Re",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/evidence/",
                "tag": "a",
                "text": "View evidence manifest",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/evidence/",
                "error": null
              },
              {
                "url": "https://riddledc.com/vs-self-hosted/",
                "tag": "a",
                "text": "See why teams switch to Riddle →",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/vs-self-hosted/",
                "error": null
              }
            ]
          }
        },
        "setup_action_results": [],
        "screenshot_label": "riddle-site-v490-home-simple-screenshot-response-ipad-mini"
      },
      {
        "name": "ipad",
        "width": 820,
        "height": 1180,
        "url": "https://riddledc.com/",
        "route": {
          "requested": "https://riddledc.com/",
          "observed": "/",
          "expected_path": "/",
          "matched": true,
          "http_status": 200
        },
        "title": "Riddle - Hosted Execution for AI Agents",
        "body_text_length": 3739,
        "body_text_sample": "Skip to main content Riddle RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs Riddle Distributed Computing Product Riddle Proof Good Catch Diary Pricing Maximize Value Documentation MCP Recipes Playground Use Cases AI Agents Agent Guide Serverless Authenticated Pages vs Self-Hosted Blog Evidence Over Summaries Frontend Dev Without a Browser E2E Testing Tips Chatty Agents (Part I) Batching Heuristics (Part II) Vision Agents Teaching AI to Ski Support FAQ Status Contact Legal Terms Privacy © 2026 Riddle. All rights reserved.",
        "scroll_width": 820,
        "client_width": 820,
        "overflow_px": 0,
        "bounds_overflow_px": 0,
        "overflow_offenders": [],
        "selectors": {
          ".landing-page": {
            "count": 1,
            "visible_count": 1
          },
          ".code-block-wrapper": {
            "count": 2,
            "visible_count": 2
          }
        },
        "frames": {},
        "text_sequences": {
          ".code-block-wrapper": {
            "count": 2,
            "visible_count": 2,
            "texts": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ],
            "visible_texts": [
              "Copy 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: ` await page.goto(\"https://example.",
              "Copy 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 {"
            ],
            "match_texts": [
              "Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace",
              "Copy 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 PNG"
            ],
            "visible_match_texts": [
              "Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace",
              "Copy 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 PNG"
            ]
          },
          ".landing-page": {
            "count": 1,
            "visible_count": 1,
            "texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ],
            "visible_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Br"
            ],
            "match_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs"
            ],
            "visible_match_texts": [
              "RIDDLE DISTRIBUTED COMPUTING Your agent's browser Send a Playwright script. Get screenshots, console logs, and network HAR. No infrastructure. No browser launch. Just results. Get Started Free See Riddle Proof View Docs NEW: RIDDLE PROOF Browser evidence your agent can hand back. Riddle Proof turns previews, production URLs, and black-box browser flows into reviewable receipts: what was checked, what passed, what failed, and which artifacts prove it. Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Read the diary → Evidence manifest Each catch includes the claim, browser checks, screenshots, run receipts, console captures, and the reusable proof pattern. Source optional Many browser-visible defects can be detected from the outside with a URL, viewports, and a repeatable proof profile. Explore Riddle Proof View evidence manifest The Script API Write Playwright. Send it to Riddle. Get results. Just write Playwright Copy 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: ` await page.goto(\"https://example.com/login\"); await page.fill(\"#email\", \"user@example.com\"); await page.fill(\"#password\", \"secret\"); await page.click(\"button[type=submit]\"); await page.waitForURL(\"**/dashboard**\"); `, include: [\"screenshots\", \"console\", \"har\"] }) }).then(r => r.json()); // result.screenshots — final page screenshot artifacts // result.console — every console.log, warn, error // result.har — full network trace Rich results Get back screenshots, console logs, network HAR, assertion results, and downloaded files—not just pixels. Full Playwright API Use any Playwright method—selectors, waits, assertions, network interception. No proprietary DSL to learn. Pack work into sessions 30 seconds of browser time per job — run multiple navigations, screenshots, and actions in one call. Assert without vision Check selectors and URLs in your script before screenshotting. Cheaper than sending every page to a vision model. Or just grab a screenshot Same endpoint, simpler input Copy 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 PNG Built 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. Get Started Free Pay only for browser time. From $0.50/hr. See pricing → Chromium on Lambda is painful—size limits, cold starts, memory errors. See why teams switch to Riddle → Give your agent eyes Create an account and start making API calls in minutes. Get Started Free View Docs"
            ]
          }
        },
        "text_matches": {
          "text:Your agent's browser": true,
          "text:Or just grab a screenshot": true
        },
        "http_statuses": {},
        "link_statuses": {
          "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']": {
            "version": "riddle-proof.link-status.v1",
            "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
            "max_links": 20,
            "same_origin_only": true,
            "dedupe": true,
            "require_nonzero_bytes": true,
            "min_bytes": 1000,
            "allowed_content_types": [
              "text/html"
            ],
            "allowed_statuses": [
              "2xx",
              "3xx"
            ],
            "discovered_count": 21,
            "total_count": 7,
            "truncated": false,
            "ok_count": 7,
            "failed_count": 0,
            "status_counts": {
              "206": 7
            },
            "failures": [],
            "result_count": 7,
            "stored_result_count": 7,
            "omitted_result_count": 0,
            "omitted_success_count": 0,
            "results_compacted": false,
            "results": [
              {
                "url": "https://riddledc.com/docs/",
                "tag": "a",
                "text": "Docs",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/docs/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/",
                "tag": "a",
                "text": "Proof",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/",
                "error": null
              },
              {
                "url": "https://riddledc.com/pricing/",
                "tag": "a",
                "text": "Pricing",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/pricing/",
                "error": null
              },
              {
                "url": "https://riddledc.com/register/",
                "tag": "a",
                "text": "Sign Up",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/register/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/",
                "tag": "a",
                "text": "Good Catch Diary Real bugs found by cheap browser proof: clipped iframes, preview route escapes, request-body leaks, async races, and auth-boundary failures. Re",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/",
                "error": null
              },
              {
                "url": "https://riddledc.com/proof/good-catches/evidence/",
                "tag": "a",
                "text": "View evidence manifest",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/proof/good-catches/evidence/",
                "error": null
              },
              {
                "url": "https://riddledc.com/vs-self-hosted/",
                "tag": "a",
                "text": "See why teams switch to Riddle →",
                "status": 206,
                "method": "GET",
                "ok": true,
                "content_type": "text/html; charset=utf-8",
                "content_length": 1000,
                "bytes": 1000,
                "redirected": false,
                "final_url": "https://riddledc.com/vs-self-hosted/",
                "error": null
              }
            ]
          }
        },
        "setup_action_results": [],
        "screenshot_label": "riddle-site-v490-home-simple-screenshot-response-ipad"
      }
    ],
    "console": {
      "events": [],
      "fatal_count": 0
    },
    "page_errors": [],
    "dialogs": [],
    "network_mocks": [],
    "dom_summary": {
      "expected_viewport_count": 4,
      "viewport_count": 4,
      "partial": false,
      "routes": [
        {
          "requested": "https://riddledc.com/",
          "observed": "/",
          "expected_path": "/",
          "matched": true,
          "http_status": 200
        },
        {
          "requested": "https://riddledc.com/",
          "observed": "/",
          "expected_path": "/",
          "matched": true,
          "http_status": 200
        },
        {
          "requested": "https://riddledc.com/",
          "observed": "/",
          "expected_path": "/",
          "matched": true,
          "http_status": 200
        },
        {
          "requested": "https://riddledc.com/",
          "observed": "/",
          "expected_path": "/",
          "matched": true,
          "http_status": 200
        }
      ],
      "titles": [
        "Riddle - Hosted Execution for AI Agents",
        "Riddle - Hosted Execution for AI Agents",
        "Riddle - Hosted Execution for AI Agents",
        "Riddle - Hosted Execution for AI Agents"
      ],
      "overflow_px": [
        0,
        0,
        0,
        0
      ],
      "bounds_overflow_px": [
        0,
        0,
        0,
        0
      ],
      "overflow_offender_counts": [
        0,
        0,
        0,
        0
      ],
      "frames": [
        {
          "viewport": "desktop",
          "selectors": []
        },
        {
          "viewport": "phone",
          "selectors": []
        },
        {
          "viewport": "ipad-mini",
          "selectors": []
        },
        {
          "viewport": "ipad",
          "selectors": []
        }
      ],
      "http_status": [],
      "link_status": [
        {
          "viewport": "desktop",
          "selectors": [
            {
              "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
              "total_count": 7,
              "ok_count": 7,
              "failed_count": 0,
              "truncated": false
            }
          ]
        },
        {
          "viewport": "phone",
          "selectors": [
            {
              "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
              "total_count": 7,
              "ok_count": 7,
              "failed_count": 0,
              "truncated": false
            }
          ]
        },
        {
          "viewport": "ipad-mini",
          "selectors": [
            {
              "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
              "total_count": 7,
              "ok_count": 7,
              "failed_count": 0,
              "truncated": false
            }
          ]
        },
        {
          "viewport": "ipad",
          "selectors": [
            {
              "selector": "a[href*='/register/'], a[href*='/proof/'], a[href*='/docs/'], a[href*='/pricing/'], a[href*='/vs-self-hosted/']",
              "total_count": 7,
              "ok_count": 7,
              "failed_count": 0,
              "truncated": false
            }
          ]
        }
      ],
      "route_inventory": [],
      "network_mock_count": 0,
      "network_mock_hit_count": 0,
      "dialog_count": 0,
      "dialog_accept_count": 0,
      "dialog_dismiss_count": 0
    }
  }
}