API Design — Edho Ferdian Mode (Skill Edition)
SkillMediaDesign and evolve API boundaries and contracts, REST resource naming, status-code semantics, pagination strategy, versioning policy, and the discipline of treating one contract artifact (OpenAPI/schema) as authoritative so client and server never drift. A design-time activity, distinct from system-design-edho-ferdian (broader architectural trade-offs) and code-review-edho-ferdian (reviewing an already-written endpoint). Trigger phrases: "desain API untuk fitur ini", "bagaimana struktur endpoint yang baik", "API contract berubah, bagaimana handle-nya", "REST vs apa", or when starting a new API surface.
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; ahel provides instructions and does not run this skill.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the API Design skill
What this skill tells your AI
The instructions your AI receives, as published by edhoferdian/eef in skills/api-design-edho-ferdian/SKILL.md and read by ahel’s review.
You are designing the boundary between a client and a server (or between
two services) before — or while — code gets written on either side. This is a
narrower, more concrete altitude than architecture: you are not deciding
monolith vs. microservices, you are deciding what GET /orders/:id returns,
what status code a duplicate email produces, and how a v1 client survives a
v2 rollout. Two source skills converge here because they are the same use
case seen from two ends: api-design covers what a good endpoint looks like
in isolation; contract-first covers how a client and a server stay in sync
about that endpoint over time. A contract without good shape conventions is
consistent but ugly; good shape conventions without a single authoritative
artifact drift apart the moment two people touch the boundary independently.
Where this sits relative to the rest of the ecosystem
system-design-edho-ferdiandecides broader architectural trade-offs — monolith vs. microservices, sync vs. event-driven, which datastore. This skill sits one level down: given that an API boundary needs to exist, design that boundary's shape and evolution discipline. If the question is "should this even be a REST API vs. an event stream," hand off upward tosystem-design-edho-ferdian; if it's "how should this REST endpoint be shaped," stay here.code-review-edho-ferdian(Domain 2 Security, Domain 3 Performance) reviews an endpoint that already exists in code. This skill is upstream of that — a well-designed contract prevents many findings that domain would otherwise have to catch after the fact. Seereferences/rest-conventions.md's cross-reference table for exactly which review codes map to which design-time checklist items, so the two skills don't restate each other. The same relationship holds for Domain 4 — Blueprint/Spec Consistency: the API contract designed here (shape decisions inreferences/rest-conventions.md, plus the versioning and breaking-change policy inreferences/contract-evolution.md) is the authoritative referencecode-review-edho-ferdianchecks an implementation against when it asks "does the code match the agreed contract?" — that domain doesn't redefine contract correctness, it cites this one.spec-mining-edho-ferdiananddev-kickoff-edho-ferdian's Phase 0 intake can consume an OpenAPI/schema file produced by following this skill'sreferences/contract-evolution.mdas a legitimateBEHAVIOR_SPEC- role input — a contract artifact already states requests, responses, and error shapes as ground truth, so it doesn't need to be mined from code.
Workflow
Step 1 Decide REST shape → references/rest-conventions.md
Step 1b Decide MCP tool surface (if applicable) → references/mcp-tool-surface.md
Step 2 Decide the contract discipline → references/contract-evolution.md
Step 3 Reflection gate → below
Step 1 — REST shape
Resource naming, HTTP status-code semantics, response envelope and error
shape, pagination strategy (offset vs. cursor, with the concurrent-write
caveat this ecosystem's database lens already covers), filter/sort/sparse-
fieldset conventions, rate-limiting tiers and headers, versioning and
Sunset policy, and the pre-ship checklist cross-referenced against
code-review-edho-ferdian's SEC/CQ codes. Full detail:
references/rest-conventions.md.
Step 2 — Contract discipline
One authoritative contract artifact per boundary, designing from consumer
needs rather than the database schema outward, generating types/clients from
that artifact instead of hand-syncing them, the step-by-step protocol for
changing a contract without breaking consumers, and named anti-patterns
(including treating compile-time types as the only proof of contract
correctness). Full detail: references/contract-evolution.md.
Step 1b — MCP tool surfaces (when the boundary is a model, not a human client)
When the "client" on the other side of this boundary is an LLM invoking tools
rather than a human-facing app, the REST conventions above still apply but
need model-consumer-specific additions — schema-first tool definitions,
description-as-contract, idempotency, and transport choice. Full detail:
references/mcp-tool-surface.md.
Step 3 — Reflection gate (mandatory before presenting a new or changed API design)
Gate A1: Every endpoint's status codes cover success + the realistic error
cases, not just 200/404/500? [PASS/FAIL]
Gate A2: Pagination strategy has a stated reason (dataset size, consumer
type), not a default picked without thought? [.]
Gate A3: Exactly one contract artifact is named as authoritative for this
boundary — no wiki/mock/type-file left to drift separately? [.]
Gate A4: A breaking change (if any) has a stated migration/versioning path,
not a silent field repurpose? [.]
Gate A5: This design was checked against consumer jobs (what the client
actually needs to render/do), not just the database shape? [.]
Any FAIL → fix before presenting, or state explicitly why (e.g. "no versioning path needed — this is a new boundary with zero existing consumers").
Language routing (fixed — see skill-authoring-edho-ferdian's canonical contract)
- Communication with the user → Bahasa Indonesia.
- The contract artifact itself (OpenAPI/schema/proto), code samples, and any
ADR-style write-up → English (machine-facing and cross-tool). Full
contract:
skill-authoring-edho-ferdian§7.
Global rules
- Design-time altitude only. This skill designs or evolves a boundary
before/while it's built. Reviewing an endpoint that's already shipped
belongs to
code-review-edho-ferdian. - One contract, one source of truth. Never let a wiki page, a mock file, a hand-written client type, and the server's actual response shape diverge independently — pick one artifact and generate everything else from it.
- Design from consumer jobs outward, not from the database schema
outward — a raw
SELECT *row is not a contract. - State the pagination and versioning reasoning, even briefly — a
default picked without a reason is the same failure mode
system-design-edho-ferdianflags for undecided non-functional targets. - Cross-reference, don't duplicate. Security and code-quality checks
that
code-review-edho-ferdianalready owns are referenced by code, not restated here.
Signals
- GitHub stars
- 21
- Last commit
- Sep 2026
Advanced
- Item type
- skill
- Key
api-design-edho-ferdian- Source
- github.com/edhoferdian/eef