Why do so few public HTTP APIs reach level 3 of the Richardson Maturity Model, and under what conditions would you argue it is worth the cost?
answer
- server pays, client must change behaviour for payoff
- no generic hypermedia client = no ecosystem pull
- OpenAPI/SDK generators manufacture URL coupling
- flips with un-redeployable clients + stateful workflows
- buy conditional action links, keep URL templates
basics
~20 sBecause the cost is paid by the API team while the benefit only materialises if clients are written to follow links - and almost none are. It pays off with many long-lived, independently-deployed clients you cannot redeploy on demand.
solid answer
~50 sThe economics are asymmetric. The server pays immediately: bigger payloads, a link-rendering layer, a format choice (HAL, JSON:API), harder docs, harder mocking and testing. The benefit only arrives if clients *stop* hardcoding URLs - and in practice they do not. SDK generators, OpenAPI tooling and typed clients all encourage template-built URLs, so the server ends up unable to move a URL anyway because a major consumer hardcoded it. Secondary causes: there is no widely deployed generic hypermedia client, so no ecosystem pull; developer experience is worse (you cannot read a link-heavy response at a glance); and the loudest alternative pressures - GraphQL, gRPC, plain OpenAPI - all push the other way. It earns its keep when you have many clients you cannot redeploy (mobile apps, partner integrations), a genuinely state-dependent workflow, or a long-lived API whose URL layout will move. Even then I would usually buy the cheap 80%: conditional links for state-dependent actions, and templates for the rest.
go deeper
Say it costs effort and clients rarely use the links, so most teams stop at level 2 - do not over-claim.
Name concrete costs (payload size, docs, tooling) and the fact that generated SDKs rebuild URL coupling anyway.
Frame the asymmetry - the server pays, the benefit is contingent on client behaviour - and give the conditions where it flips.
Refuse the binary: separate the two benefits, name the one with a payback, state who must change behaviour, and say how you would measure realised return.
## The core asymmetry Level 3 fails to spread not because engineers dislike it but because the party that pays is not the party that benefits, and the benefit is contingent on behaviour the payer cannot enforce. The API team pays up front and continuously: a link-rendering layer in every representation, a media-type or convention choice, larger responses, documentation that must explain relations as well as fields, and test fixtures that are meaningfully harder to write and assert on. The benefit - being free to move URLs and to change workflow rules without redeploying clients - only materialises if every significant client actually resolves links at runtime. One consumer that reads `_links.cancel.href` once, notes the pattern, and then builds the URL itself has silently restored the coupling. The server cannot detect this until it moves the URL and the consumer's pager goes off. So the server keeps its URLs stable regardless, and the investment produces no realised return. ## Reinforcing causes **No generic client ecosystem.** The historical argument for hypermedia is the web browser: a single generic client that navigates any site because pages carry their controls. No equivalent exists for APIs. Every consumer writes bespoke code, so the discovery capability has no consumer. **Tooling pulls the other way.** OpenAPI-first workflows, code generators and typed SDKs all describe operations as URL templates plus schemas. They generate exactly the coupling level 3 sets out to remove, and they deliver autocomplete and compile-time checks that developers value immediately and concretely. **Developer experience regression.** A link-heavy JSON body is harder to skim in a terminal or a browser tab. Curl output that is half envelope is a genuine, if unglamorous, adoption tax. **Competing paradigms absorbed the pressure.** Where clients need flexibility, teams reached for GraphQL; where they need speed and contracts, gRPC. Neither is hypermedia, and both solved a felt pain faster. **Weak, delayed feedback.** The cost of *not* doing level 3 shows up years later as a migration project, and by then the framing is "we need to version the API", not "we should have shipped links". ## When the calculus flips Argue for it when several of these hold: - **Un-redeployable clients.** Installed mobile apps or partner integrations with a long tail of versions in the wild. You cannot coordinate a release, so runtime-discovered behaviour is the only lever you have. - **Genuinely state-dependent workflows.** Approvals, claims, order lifecycles, regulated processes - anywhere the set of legal next actions is non-trivial and changes. Here the duplicated state machine is the expensive defect, and links fix it directly. - **A URL layout you know will move.** Multi-tenancy, regional sharding, or an impending service split. - **Long horizon, many consumers, no single owner.** Government and banking APIs are the recurring examples for a reason. ## The recommendation I would actually make Split the two benefits and buy only the one with a payback. Ship **conditional action links** so state-dependent UI decisions come from the server, and keep template-built URLs for ordinary navigation. Publish relation names as part of the contract and test that they appear and disappear correctly with state. That captures the defect-reduction benefit at a fraction of the cost, and it degrades gracefully if a consumer ignores the links. The principal-level signal here is refusing to answer "is level 3 good" and instead naming which benefit you are buying, who has to change behaviour for it to pay, and what you would measure to know it did.
- How would you know whether your hypermedia investment actually paid off?Instrument it: log whether consumers resolve link hrefs at runtime or hit hardcoded paths, then attempt a low-risk URL move behind a feature flag and see who breaks. If a URL change still requires a client-coordination campaign, the coupling was never removed and the investment is not returning.
- Does GraphQL or gRPC make the Richardson Maturity Model irrelevant?It makes the ladder inapplicable to those APIs - both deliberately tunnel over HTTP and sit near level 0 by RMM's measure - but not irrelevant. The underlying question of who owns URLs and workflow rules reappears in every style, and RMM remains a useful vocabulary for HTTP contracts specifically.
It is like installing a universal power socket that only helps if every appliance maker ships the matching plug. One holdout and you keep the old socket anyway - so nobody installs it.
saying these in an interview costs you the question
- Answering that level 3 is simply 'too hard' without naming who pays and who benefits
- Claiming public APIs avoid it purely out of ignorance of REST
- Asserting hypermedia would remove the need for API versioning
- Treating GraphQL adoption as evidence that HTTP contract design no longer matters
- Recommending full hypermedia unconditionally as the mature choice