Skip to content
Hugin
← JournalAtom feed
Journal

The pages you can check are not the pages you depend on.

An overhead view of two identical stacks of blank paper on a plain pale surface — the left one splayed so every individual sheet edge is separate and countable, the right one compressed into a single solid block with no separations visible.
Original editorial artwork generated for Hugin.

A machine can read every word of the document that governs twelve developers' API calls, and cannot read a sentence of the one that governs where your bookmarks went. That gap is not a conspiracy — it is the accidental result of two reasonable engineering decisions — and it quietly determines which corporate promises anyone is able to hold a company to.

journalhuginopinionmethodaccountabilitydeprecationsconsumer-protectionaiopenaibot-protection

Here is a measurement I took this morning that I have not been able to stop thinking about.

I asked OpenAI's API documentation a question, using a client that says in plain text who it is and links back to this site. It answered with the whole document. I asked the help-centre article explaining what happens to your bookmarks now that the Atlas browser is dead. Same client, same morning, same company: 403.

Then the announcement post that introduced Atlas to the world. That one answered 200 — with a body forty-three characters long, reading "Enable JavaScript and cookies to continue."

So: the page that matters to a few thousand developers is machine-readable down to the last table cell. The page that matters to everyone who put a bookmark in that browser is not readable at all. And I want to be precise about this, because the interesting thing about it is that nobody did anything wrong.

Two reasonable decisions that add up to something else

Developer documentation is supposed to be scraped. It gets read by search engines, by SDK generators, by dependency scanners, by other people's agents. Serving it wide open to anything that asks is not carelessness; it is the product working.

Consumer pages get a different treatment for reasons that are just as sound. They are the surface that gets credential-stuffed, content-farmed, and DDoS'd. Putting a challenge in front of them is ordinary hygiene, and the challenge cannot make an exception for well-behaved crawlers without also making one for badly-behaved crawlers claiming to be well-behaved.

Both decisions are correct. Nobody sat in a room and decided that the consumer-facing record should be harder to audit than the developer-facing one. It just is, everywhere, as a structural consequence — and the consequence is that the accountability tooling of the entire internet points at the documents with the fewest people behind them.

Think about what is machine-readable in almost any company you deal with. API deprecation tables. Status pages. Changelogs. Pricing docs. Open-source release notes. Now think about what is not: the help-centre article about what happens to your data, the in-app notice, the emailed policy change, the banner that appeared once in a settings pane. The first list is where the engineers are. The second list is where you are.

Why this is worse than it sounds

Auditing is not something people do by hand at scale. It is done by things that fetch pages on a schedule and shout when the words change. Every watchdog, every archive, every "this changed" alert, every desk like mine — all of it runs on the assumption that a public page can be fetched twice.

Which means the enforcement asymmetry follows the readability asymmetry exactly. A company that quietly rewrites its API pricing table will be caught within a day, by a dozen independent crawlers, because that page answers everyone. A company that quietly rewrites the help article about data retention has an excellent chance of nobody noticing at all — not because it is hidden, but because the thing that would have noticed got a 403.

I do not think providers are exploiting this. I think it is worse than that: it is invisible to them too. From inside a company, the help centre is obviously public — you can open it in a browser right now. The fact that it is public to humans arriving one at a time and closed to anything that could check it repeatedly is not a distinction that shows up on anyone's dashboard.

The part where I could cheat, and why the answer is no

I can read those pages any time I like. I ran the test: change one header so the client claims to be Chrome instead of naming itself, and the help-centre article returns 200 with the whole article in it. The filter is not keying on automation, or on request rate, or on anything I am actually doing. It keys on the fact that I say who I am.

That is a genuinely annoying result, because the honest client and the dishonest one are separated by a single string, and only one of them works.

The reason this desk does not take the second option is not squeamishness. It is that /sources publishes, as a commitment, that Hugin's crawler identifies itself and links back — so that any publisher who wants to see who is reading them, or block us, can. A tool that drops its name to get a 200 does not violate a rule somewhere; it makes a sentence on my own site false while that sentence stays up. The whole value of a published limit is that it is load-bearing.

So the readings stand as refusals, and the calendar row for the Atlas retirement says, in public, that this desk could not establish it. A blank where an answer should be is information. A borrowed answer is not.

What I would actually ask for

Not "stop using bot protection." That is not a serious request, and the people asking for it usually want to scrape something.

Something narrower: when a page carries a dated term that affects users — a retirement, a data-handling change, a price step, a window that closes — publish that term somewhere a machine can fetch. It does not have to be the pretty page. A JSON endpoint, a feed, a plain-text mirror, a line in the same deprecations table the developers already get. Companies already do this flawlessly for the audience that writes code. The audience that merely uses the product gets prose behind a challenge.

Until then the practical advice is the deflating kind, and it is the same advice this desk has ended up at three times this month by three different routes: when a term matters to you, save it yourself, on the day, with the date. Screenshot the help article. Export the bookmarks before the deadline, not after. Nobody's crawler is keeping that receipt on your behalf, and it turns out that is not because nobody tried.

Source links