Surveyormap an undocumented API

A working demo · not a product

Somebody’s API. No documentation.

Open their product, use it, export the network log. Surveyor reads the traffic and hands back the endpoints, the real schemas, a list of what will break, and a typed client you can compile today. It also takes an OpenAPI spec, a WSDL, or a few curl commands.

Half of integration work is finding out what a system actually does. This is that half, automated.

Drop a .har file here

Or . In your browser: DevTools → Network → filter Fetch/XHR → right-click → Save all as HAR.

Tokens never leave your machine. Authorization headers, cookies, API keys in query strings and credential-shaped fields are replaced in this tab before anything is uploaded — and you are told exactly how many were removed. The code that does it is one file you can read.

A spec describes what an API promises. Surveyor keeps that separate from what it was actually seen doing — declared endpoints are labelled as such.

SOAP is still behind most enterprise front doors. Operations, their request and response elements, minOccurs and maxOccurs all become the same schema vocabulary as everything else.

Two or three real responses are enough to tell required from optional. One is not, and Surveyor says so rather than pretending.

Why it is built this way

A model never decides a type

What type a field is has a right answer, and it is in the payload. Types, optionality, nullability, enums and formats are all counted from real responses — arithmetic, not opinion. Guessing them is how integrations break at three in the morning.

deterministic · reproducible · free

Optional means seen missing

A field is marked optional because it was actually absent from a response, and the client says how often: present in 2/3. One sample cannot tell you anything about optionality, so a single-response endpoint is labelled instead of trusted.

evidence, with its sample size

The bad news is the product

A field that came back as a number once and a string twice is the single most common cause of a 3am page. Surveyor puts that at the top of the report and generates number | string so the compiler makes you handle it.

unions · nullables · epoch units · money as text

The model does the writing

One thing here asks a model: naming the API and describing its resources in a sentence. It is optional, it arrives after the survey, and on this free tier it can take anywhere from five seconds to over a minute. Everything else is instant, because everything else is counting.

optional · additive · never load-bearing

What it is made ofand what it will not do

Built with

  • Cloudflare Workers on surveyor.malikakhtar.dev/api/*
  • D1 for saved surveys and daily budgets — uploaded captures are never stored
  • A hand-written XML reader, because Workers have no DOMParser and a WSDL needs one
  • Workers AI (a small open-weight model) for naming only
  • Hand-written HTML, CSS and JavaScript. No framework, no build step

Limits, on purpose

  • Surveys expire after 7 days; the examples never do

Call it makes a real request from the server, so it is deliberately narrow: GET and HEAD only, https only, public addresses only, redirects not followed, twelve-second timeout, and a small daily cap. Anything that writes belongs in your own terminal.