APIs as Products: Designing for Developers
Lesson 62: APIs as Products: Designing for Developers
Lesson 62: APIs as Products: Designing for Developers
Lesson 61 introduced the Leverage Stack and made a claim that this lesson now has to make good on: that Layer 2, the Developer Surface, is the load-bearing layer of any platform — the one every marketplace and ecosystem ambition ultimately depends on. But "build a stable Developer Surface" is not yet an actionable instruction. It doesn't tell you what to actually design, decide, or refuse when you sit down to define an API.
This lesson treats the API itself as a product with its own user — the developer — and its own version of the three core questions from Lesson 1: what problem is this API solving, for which developer, and how will you know if it worked? Most engineers, and most PMs new to platform work, treat an API as a technical artifact: a set of endpoints that exposes internal functionality to the outside world. That framing is incomplete in a way that causes real damage. An API is not just an interface. It is a promise — a commitment about what will and will not change, made to people who will build businesses, careers, and production systems on the assumption that the promise holds.
This reframing — API as promise, not just as interface — is the foundation for everything else in this lesson, and it directly explains why the Case Study in Lesson 61 went wrong: the company had endpoints, but it had never actually decided, articulated, or communicated what it was promising anyone. This lesson gives you the vocabulary and the discipline to make that promise explicit, and to design an API that a developer can safely build a business on top of.
Learning Objectives
- 1
Explain why an API should be understood as a product promise rather than merely a technical interface.
- 2
Apply the Promise Tiers model to classify any given API surface by its stability commitment.
- 3
Identify the essential elements of good API design that reduce integration cost for developers.
- 4
Explain the relationship between semantic versioning, deprecation policy, and developer trust.
- 5
Evaluate a proposed API change for which Promise Tier it violates, and recommend an appropriate rollout process.
This lesson assumes you carry forward the Leverage Stack and the Platform Readiness Checklist from Lesson 61, in particular the five readiness criteria (versioning, deprecation notice, documentation currency, reliability SLA, support channel), which this lesson now expands into a full design and governance discipline for the Developer Surface layer specifically.
The API as a Promise, Not an Interface
The API as a Promise, Not an Interface
Every API endpoint makes an implicit or explicit claim about three things: what it does, what shape its inputs and outputs take, and how long that behavior can be relied upon. Internal APIs, used only by teams inside the same company, can get away with treating this claim loosely, because the people affected by a change sit in the same building and can be told directly, or can simply read the updated code. External developer-facing APIs cannot. The developer building against your API today may not read your changelog, may not be in contact with anyone at your company, and may have shipped code six months ago that assumes today's behavior will still hold next year.
This asymmetry — the API provider can see and control every change, while the API consumer can only see the promise as it stood at the time they built against it — is the central design constraint of Layer 2. Good API design is, above all, a discipline of making explicit, keepable promises, and then keeping them.
The Promise Tiers Model
The Promise Tiers Model
This lesson introduces the Promise Tiers model: every part of an API surface sits in one of three concentric tiers, each with a different stability guarantee.
The critical discipline is not choosing the right tier once — it is being explicit, in the documentation itself, about which tier any given endpoint or field belongs to, and never silently promoting a Tier 3 experimental feature into de facto Tier 1 status just because developers started depending on it. A common and dangerous failure mode is the reverse: a company labels something "beta" to buy itself flexibility, developers adopt it heavily anyway because it is useful, and the company later discovers it cannot actually change the "beta" endpoint without breaking a large fraction of its ecosystem — the promise became real in practice even though it was never made real on paper.
Semantic Versioning and Deprecation as Trust Mechanisms
Semantic Versioning and Deprecation as Trust Mechanisms
Semantic versioning (a MAJOR.MINOR.PATCH numbering scheme) gives developers a fast, unambiguous signal about the size of a change: patch releases fix bugs without changing behavior developers rely on; minor releases add capability without breaking existing usage; major releases may break existing usage and require developers to take action. A deprecation policy — a published minimum time window between announcing that a feature will be removed and actually removing it — converts an abstract promise ("we won't surprise you") into an operational guarantee developers can plan around, budget engineering time for, and trust.
Together, these two mechanisms are what actually make the Tier 1/Tier 2 distinction meaningful. Without them, "stable" is just a marketing word.
Reducing Integration Cost
Reducing Integration Cost
Beyond stability, good API design reduces the total cost a developer pays to integrate successfully. Key elements include: consistent resource naming (so patterns learned on one endpoint transfer to others), predictable error formats (so failure handling code can be written once and reused), idempotency for operations that create or modify data (so a developer's retry logic after a network failure doesn't accidentally duplicate an action), sensible pagination defaults, and clear, enforced rate limits communicated in response headers rather than discovered only after being throttled. None of these are exotic; all of them are frequently skipped under deadline pressure, and each one that is skipped becomes a permanent tax on every developer who ever integrates.
Common Mistakes to Avoid
Treating "beta" as a permission slip rather than a promise about instability
Labeling something beta doesn't reduce your obligation to developers who depend on it if you never actually communicate, monitor, or enforce that instability.
Confusing internal API discipline with external API discipline
Practices that are fine for APIs consumed only by co-located teams (undocumented breaking changes, informal Slack notice) are actively harmful once external developers depend on the same surface.
Designing the API around your own database schema rather than the developer's mental model
An API that mirrors internal implementation details, rather than the concepts a developer actually reasons in, forces every integrator to relearn your internal architecture just to accomplish a simple task.
Shipping inconsistent error handling across endpoints
When different parts of an API return errors in different shapes, every developer must write custom handling logic for each endpoint, multiplying integration cost across the entire ecosystem.
Announcing a deprecation with no migration path
Telling developers something will stop working, without a concrete alternative and enough lead time to adopt it, converts a manageable transition into a forced, disruptive scramble — and is remembered.
Ready to test your product judgment?
Take the interactive practice quiz for Lesson 62 and build your skill radar dashboard.