Back
thesis forms agents
APR 6

A Form Is a Contract, Not a UI

Why Postbox treats every form as a schema-backed contract between systems, not just a set of fields on a page.

👤
Postbox Team
· · 5 min read

The mistake starts with the word form.

Say it out loud and the picture appears immediately: a rectangle on a webpage, a few labels, a few empty boxes, maybe a dropdown, maybe a button. That picture is so familiar that it becomes invisible. We stop asking what the thing is for. We start talking about spacing, styling, field order, and conversion rate before we have asked the more important question:

What agreement is this interface trying to enforce?

Because that is what a form really is. Not a UI. Not a page. Not a widget. A form is a contract between a submitter and a system.

The submitter promises to send certain pieces of information. The system promises to accept them if they satisfy certain rules. Everything else is implementation detail.

The UI was never the essence

The web inherited forms from documents. That history made sense at the time. A human looked at a page, filled in the blanks, pressed a button, and waited. The browser knew how to encode the result. The server knew how to receive it. For a long time, that was enough.

But the web changed around the form.

Now the submitter might be a browser, a mobile app, a script, a backend job, or an AI agent. The same intent might arrive from half a dozen surfaces. A lead form might live on a marketing site, inside an embedded widget, in a native app, and in a workflow that an agent creates on demand. If the form is only the UI, then every surface needs its own interpretation of the rules.

That is where things get brittle.

A designer changes a field label. A developer renames a key. A backend adds a required field. A mobile app ships late. A Zapier workflow keeps sending the old shape. Nobody meant to break the contract, but nobody wrote the contract down either.

The UI was treated as the source of truth. It never should have been.

The schema is the agreement

A schema says the quiet part out loud.

It says: these are the fields. These are their types. These are the rules. This email must be an email. This rating must be a number. This message can be optional. This hidden field is a honeypot. This enum accepts only these values.

Once the schema exists, the form stops being a vague interface and becomes a precise agreement. A human can render it. A script can submit to it. An agent can inspect it. A backend can validate it. The contract holds no matter who is holding it.

That is why Postbox starts with schema, not layout.

You define the contract. Postbox gives you an endpoint. Submissions are validated against that contract before anything else happens. Bad data does not land. Valid data moves through the rest of the pipeline: spam detection, translation, smart replies, and routing.

The visual form becomes one client among many.

Agents make the old model impossible

Humans tolerate vague forms because humans can infer. If a label says “work email,” a person can guess what belongs there. If a field is optional but not marked, a person can try and recover. If an error message is bad, a person can squint.

Agents are less forgiving in one way and more revealing in another. They need the contract to be explicit. They need to know field names, types, required rules, and authentication requirements. They do not want to scrape a page and guess what the designer meant.

This is not a weakness of agents. It is a weakness of the old form model being exposed.

A contract-first form gives agents what they need without making humans worse off. Humans still get a good UI. Agents get a schema. Both submit through the same endpoint. Both are validated the same way. Both produce the same structured data.

That is the important part: agent-native does not mean human-hostile. It means the underlying contract is strong enough for both.

The endpoint is the interface

Once the schema is the agreement, the URL becomes the interface.

Not the webpage. Not the dashboard. The endpoint.

The endpoint is where the contract is enforced. It is where the payload is accepted or rejected. It is where validation happens. It is where Postbox begins the post-submit work that most teams end up rebuilding in every product: spam filtering, localization, reply drafting, delivery to destinations.

That is why Postbox endpoints are not just dumb submission URLs. They are self-documenting. GET the endpoint and it can tell you what it accepts. POST to it and it enforces the schema. Open it as a human and it renders useful documentation.

A good endpoint is not a hole in the wall. It is a doorway with rules written on it.

Versioning becomes obvious

Once you treat forms as contracts, versioning stops being an afterthought.

Contracts change. Products evolve. You add a field. You remove a field. You make something required. You split one question into three. In the UI-first model, those changes often overwrite the previous reality. Integrations break because everyone was silently depending on the same mutable shape.

In the contract-first model, a schema change creates a new version. Old endpoint URLs keep working against the schema they were born with. New clients adopt the new contract when they are ready.

This is not a nice-to-have. It is the difference between iteration and breakage.

What this buys you

When a form is a contract, a lot of accidental complexity disappears.

You do not write validation twice. You do not maintain separate documentation. You do not guess what an agent can submit. You do not break old integrations because the new landing page needed one more field. You do not treat form submissions as anonymous blobs that only become useful after a person cleans them up.

The data arrives structured because the agreement was structured.

That is the Postbox thesis in its smallest form: the schema is the intent, the URL is the interface, and the UI is just one way to hold the contract.

Once you see forms this way, it becomes very hard to go back.

Start with the contract. Everything else gets simpler from there.


Further reading: see how this idea shows up across the Postbox features, especially self-documenting endpoints, schema versioning, and the post-submit pipeline.

Have thoughts?
Or connect for more dispatches.