Someone on today’s Hacker News front page built an AI browser agent to automate Reddit, and the reason they gave wasn’t scale or speed. They just couldn’t get official API access. Two more browser agent projects landed on the same page, including Yamak, an open-source autoscaling one. Different builders, same move underneath: when the API is missing or priced out of reach, drive the browser instead.

I’d done a much smaller version of that the week before. It involved a CSV.

$100 for a button

An analytics tool I already pay for shows me a table. About 1,400 rows, sortable, six columns, all of it rendered right there in Chrome. Above the table sits an Export CSV button with a tiny padlock on it. Click it and you get a pricing modal: Business plan, roughly a hundred dollars a month more than my current tier.

The data was not behind the paywall. I was looking at it. The lock was on the download, not the numbers.

So I asked the agent to read the page

I had my side panel open anyway, so I used the agent that was already sitting in that window. Dassi runs as a Chrome extension, which means it sees the tab I’m actually in, with the session I’m already authenticated into. No token, no OAuth screen, no separate headless browser starting life as a stranger.

I gave it a plain instruction, something like: read every row of the table on this page, click through the pagination until there are no more pages, and write it out as CSV using the column headers from the table as the header row. Then I went and made coffee.

It came back with 1,381 rows. I spot-checked maybe fifteen of them against the UI. Two were wrong, both in a column where the app renders a relative timestamp (“3d ago”) instead of a date, which is a rendering problem, not an agent problem. I told it to grab the title attribute on those cells instead, since that’s where the full ISO date lives, and the second pass was clean.

Total time: under ten minutes, most of it coffee.

The thing I keep turning over is how unremarkable this felt. Nobody scraped anything. Nobody bypassed authentication. A logged-in user read a page they were entitled to read, and a program transcribed it. That’s the whole event.

The other options were worse

I could have upgraded. Twelve hundred dollars a year for a button, when the underlying feature costs the vendor roughly nothing, because the numbers are already serialized and shipped to my browser on every page load.

I could have gone hunting for an API. That tool does have one, on the same locked tier. Even if it hadn’t been, wiring up a one-off extraction means reading docs, provisioning a key, figuring out their pagination cursor semantics, and maintaining a script that breaks in four months when they version the endpoint. For data I need exactly once, that’s absurd. We’ve written about the no-API case before, and it keeps showing up in different clothes.

Or I could copy-paste 1,381 rows by hand, which, no.

The page is the interface

This generalizes further than I expected it to, and that’s the part worth sitting with.

Every web app you use has already solved the hard problem of showing you your data. Rendering is the product. Auth is done, the query ran, the join happened, the formatting is applied. The export button is a turnstile bolted to the edge of an open field.

Because the vendor knows exactly what I know, which is that the values are already painted into my viewport, and the only leverage left is making the file format inconvenient enough that some fraction of customers will pay rather than fiddle. That’s a legitimate business model. It’s also a model that assumes fiddling is expensive, and fiddling just got a lot cheaper.

Same shape as the Reddit thing on HN. Same shape as the API that needs approval. Your session is the credential, the DOM is the schema, and the agent works from what’s on screen.

Where it falls over

Plenty of places, honestly.

Virtualized tables that only keep 30 rows in the DOM at a time will make an agent scroll, and scrolling agents drift. Infinite scroll is worse than pagination. Numbers formatted as “1.2k” lose precision unless you dig for the title attribute or the underlying data element. Anything past a few thousand rows starts eating context, and you’re better off doing it in chunks and stitching the files.

And you should check the output. I found two bad cells in fifteen samples on the first pass. That rate would have been fine for what I needed and unacceptable for anything I was going to publish.

But for the specific job of “I can see this data and I want it in a spreadsheet,” the ten-minute version now beats the hundred-dollar version by a margin that isn’t close.

If you want to try it on your own locked export button, Dassi is on the Chrome Web Store, free, and runs on your own model key or your existing ChatGPT login.

I did eventually notice the tool has a “request data export” support form. Response time, per their docs, is five business days.