Your API is a Product, and the UX is Garbage
Backend architecture sets the ceiling on every experience built on top of it. Your API is a product, and most of them are badly designed.
UX isn’t just Figma files and CSS. If your database queries are slow, your UX is broken. Your backend architecture sets the ceiling on every experience built on top of it — and most backend engineers have never looked up at it.
Backend Engineers Don’t Think They Own UX
Ask a backend engineer about UX and watch them gesture vaguely toward the design team. That’s their job — the colors, the fonts, the hover states. The backend’s job is to keep data consistent, endpoints stable, and services humming. What happens on the screen is someone else’s problem.
This is one of the most expensive delusions in software development.
The backend engineer who wires up a dashboard endpoint doesn’t think of themselves as a designer. But when that dashboard requires six separate API calls before it can render — one for user profile, one for account status, one for recent activity, one for notifications, one for permissions, one for feature flags — they’ve made a design decision. They’ve decided the client should wait, stitch, and assemble. They’ve decided the user stares at a skeleton screen for three seconds while the browser fires requests like a nervous parolee checking over its shoulder. The frontend can’t conjure data the API doesn’t provide. It can only arrange what it receives.
Backend architecture sets the ceiling. You can have the most talented frontend engineers in the world and they cannot build a fast, fluid experience on top of a slow, chatty API. The design constraint isn’t the component library. It’s the response shape from row 47 of a stored procedure.
Stripe Proved an API Could Be Thoughtful
There was a before and after in API design, and the line runs through Stripe’s documentation.
Before Stripe, an API was infrastructure. You shipped it, wrote a README, and considered your obligation discharged. Developers were expected to reverse-engineer what you built, tolerate inconsistencies, and file bug reports into the void. The “consumer” of an API was another engineer, and engineers were supposed to be tough. If a company published an API, that was generous. Expecting it to be good was asking too much.
Stripe changed the expectation. Their API was clear, consistent, and predictable. The error messages told you what was wrong and how to fix it. The documentation had working code samples, not pseudocode. The SDK handled the edge cases developers would otherwise have to discover themselves. Engineers started passing Stripe API docs around like a revelation. It wasn’t just functional — it was thoughtful. Someone had imagined what it felt like to integrate with this thing before shipping it.
That’s product thinking. It means asking: who is calling this endpoint, what do they need to know, and what are they likely to get wrong? It means writing error messages for a human who is frustrated at 11pm trying to get their integration working, not for the engineer who wrote the endpoint at 2pm feeling clever. Documentation isn’t a supplement to the API. For a developer, the documentation is the product. If integrating with your API requires reading source code or joining a Slack channel to ask questions, you shipped a broken product. The code works. The product doesn’t.
Every Slow Query Is a Loading Spinner
Latency is a design choice. So is every database query behind it.
When a user waits four seconds for a page to load, they don’t think “that frontend is badly optimized.” They think “this product is slow.” The experience of slowness is the experience. The fact that there’s a missing index on a join table five layers down in the stack doesn’t change what the user felt. They felt slow software. They may churn. They will definitely remember it.
A team ships a new reporting feature. The frontend is clean — smooth transitions, a well-designed table, a nice export button. During demo, everything looks sharp. After launch, real data comes in. The query that was fast on a hundred rows runs for six seconds on a hundred thousand. Support tickets arrive. The frontend looks the same. The UX is destroyed.
The backend engineer who wrote that query made a product decision. They decided the feature was done when the code passed review. They didn’t ask: what does this feel like at scale? Every slow query is a loading spinner. Every N+1 is a stutter. Every unindexed foreign key is friction the user absorbs and attributes — correctly — to the quality of the product.
Backend performance isn’t a separate concern from user experience. It’s the foundation it runs on. You can’t polish your way out of a slow API.
Build to the Client’s Need, Not the Database Schema
Most APIs are designed from the inside out. The engineer starts with the database schema, creates endpoints that mirror the tables, and ships. Users endpoint returns users. Orders endpoint returns orders. Organizations endpoint returns organizations. Everything normalized, everything clean. Then the frontend asks for a dashboard that needs user info, their most recent order, their organization name, and their permission level — four round trips to assemble one screen.
This is the chatty system. It’s not a bug. It’s the natural output of building an API that reflects your data model instead of your consumer’s needs.
Design-first flips the process. You write the contract before you write the code. You define what the client needs to render each screen — a single endpoint that returns the exact shape of data the dashboard requires — and you build toward that. The OpenAPI spec exists before the controller. Mock servers let frontend engineers build against real response shapes before the backend is implemented. The integration surface is agreed on first; the implementation is a detail.
In practice, it requires backend engineers to think like product managers. You have to ask: what is this screen supposed to show? Not: what tables do I have? The difference is the difference between an API that a developer can integrate with in an afternoon and one that takes two weeks of back-and-forth with the backend team to understand. Building to the database is easy. Building to the client’s need requires empathy.
That’s the same skill that makes a great consumer product. The medium is different. The discipline is the same.
AI Agents Are Reading Your Field Names
The API used to have one type of consumer: a human developer. That developer would read your documentation, write integration code, and then call your endpoints from their application. The audience was small and technical. A rough API with confusing field names was annoying but survivable — developers would just figure it out.
AI agents now consume APIs directly. They parse OpenAPI specs to understand what a service can do. They read field names and descriptions to infer semantics. They construct calls autonomously, chain requests, and handle responses without a developer watching. The legibility of your API to a machine has become a product requirement. An endpoint named proc_user_evt with no description will be used incorrectly or ignored. An endpoint named record_user_action with a clear description of the expected payload and the effect it produces can be invoked reliably by an agent that’s never been explicitly trained on your system.
Teams building on top of AI toolchains are already evaluating APIs partly on machine-readability. Semantic clarity — the kind you add when you’re thinking about your developer as a customer — serves both audiences. Well-named fields, consistent conventions, and honest error messages help the human developer who’s integrating at 11pm and the AI agent deciding which endpoint to call.
Backend engineers used to build for a server. Then they built for a browser. Now they build for a machine that’s reasoning about their system. The architecture you design determines what that machine can and cannot do. You are not just writing infrastructure. You are defining the edges of someone else’s product — and increasingly, the edges of autonomous systems that will operate within those constraints without asking for help.
Your API is a product. The consumers have changed — the accountability hasn’t.