The catalog contract got sharper

browser-session now has a tighter routing contract in bankr.x402.json. It opens a public HTTP or HTTPS page with JavaScript enabled. Callers get rendered HTML or a base64 PNG screenshot. The call still costs 0.03 USDC through x402 on Base mainnet under the exact payment scheme.

The earlier description said the endpoint loaded “a URL” and called it a “full-page screenshot API.” Those phrases left room for bad routing decisions. An agent could send a private-network address, or promise a full-scroll capture because full_page: true existed in the schema.

The new copy removes both assumptions. In a catalog with 799 paid endpoints, that matters. Tool descriptions are part of the contract an LLM reads before it chooses where to spend.

What changed in bankr.x402.json

| Registry item | Before | Now | |---|---|---| | Main description, URL scope | “Loads a URL” | “Loads a public URL” | | Main description, screenshot use | “full-page screenshot API” | “screenshot API” | | url.maxLength | Absent | 4096 | | url description | Any absolute HTTP(S) URL | Public HTTP(S) URL; private-network targets are rejected | | full_page description | Promised the full scrollable page | Accepted for compatibility; capture dimensions aren’t caller-controlled | | block_ads description | Claimed ad and tracker blocking by default | Accepted for compatibility; filtering isn’t caller-controlled | | Price and settlement | 0.03 USDC on Base, exact | Unchanged |

Two controls still mean what callers expect. screenshot: true selects a PNG response instead of HTML. And wait_ms adds 0 to 10,000 milliseconds after load for late JavaScript.

Change the request, not the budget

Preflight the target before starting the paid request. Require an absolute http:// or https:// URL no longer than 4,096 characters. Reject private-network destinations in your planner. A bad target can return HTTP 400, so catching it locally avoids a paid rejection.

For rendered HTML, send the smallest request that states the job:

POST /browser-session HTTP/1.1
Host: api.agentutility.ai
Content-Type: application/json

{"url":"https://example.com/app","wait_ms":1500}

An x402-aware client answers the 402 Payment Required challenge by authorizing the exact 0.03 USDC payment on Base. The paid retry then executes. HTML mode returns the requested url, resolved final_url, title, html, bytes, and truncated status.

Need the visual result instead?

{
  "url": "https://example.com/app",
  "screenshot": true
}

Don’t add full_page or block_ads to new calls unless you’re maintaining one request shape across old clients. The endpoint accepts them, but your agent shouldn’t make downstream promises from their values. If a task requires an exact full-scroll image or enforced request filtering, route elsewhere.

Why web-probe agents should care

A good probe starts cheap. Fetch the page normally first. If the response is an empty application shell and the target is public, browser-session is the next call because it returns the post-JavaScript DOM. If the task asks what the rendered page looks like, set screenshot: true.

Private hosts fail the public-target rule. And if a planner needs exact full-page geometry or caller-enforced ad blocking, the presence of those legacy keys can’t justify this call.