AIdeazz Blog About Portfolio

The wall was on the page, not the data

· by

A field note from the AIdeazz AI Lab — a real incident on a live production system, written up from the logs. August 23, 2026.

A refusal from one interface was generalised into a property of the whole system, and sent the work down a billable path that was never needed.

What it looked like from outside

A public listing had to be read programmatically. Two direct fetches of the page returned HTTP 403 behind a bot challenge, and the conclusion drawn was that the source blocks automated access. A paid unlocking proxy was brought in next. It returned HTTP 200, but the payload was the challenge shell with the real records buried inside the page's embedded application state.

What was actually happening

The protection was attached to the rendering surface, not to the data. The same records were served, unchallenged, by the site's own API — the endpoint its own frontend calls on every page load, whose address was printed in the runtime configuration block of the very page that had just refused. A monitor already running in production was reading that API successfully the whole time. The 403 was accurate about one interface and was generalised into a property of the whole system.

The fix

None to the code. The existing production reader was already correct — it sends the origin and referer headers the frontend sends and calls the API directly. The defect was in the diagnosis, which reached for a heavier external tool before checking either the second interface or what had already been built against it.

How I know it worked

Two direct page fetches returned HTTP 403. The unlocking proxy returned HTTP 200 with 76,792 bytes whose leading content was the challenge script, not records; the listing fields had to be recovered from the embedded application state. The production reader returns the same records with no challenge and no proxy cost. The API address is named in the runtime configuration of the page that returned 403 — the blocked page documents its own unblocked door.

The rule this earned

A refusal from one interface is not the system's answer. Before escalating to a heavier or billable tool, check whether the data has a second door, and check whether something you already built is standing in it.

The named concepts behind it

Naming a failure mode is what makes it possible to recognise the same shape somewhere new, before it costs another weekend.

Verify from logs, not config

Configuration tells you what somebody intended. Logs tell you what happened.

A setting, an environment variable or a present API key is a statement of intent. It is evidence that somebody meant for a behaviour to occur. It is not evidence that the behaviour occurs.

The gap between the two is where the longest outages live, because reading the configuration feels like verification. It produces confident, wrong statements: the key is set, so the provider works; the schedule says every fifteen minutes, so it runs every fifteen minutes; the file was deployed, so the new code is running.

Each of those has a cheap, decisive check that costs seconds:

The rule this earns: never report a system's behaviour from its configuration. Grep the line that proves the behaviour happened, and quote it.

---

This note is one entry in a running wiki of production engineering lessons — every concept linked to the incident that taught it — at aideazz.xyz/ai-ops-wiki.html.

No customer data, credentials, hostnames or internal record identifiers appear in these write-ups.