Contract design
Model resources, commands, errors, pagination, and idempotency around consumer behavior.
System interfaces
An API is an operational contract: its errors, limits, evolution, and recovery behavior matter as much as its successful response shape.
How we use it
We design APIs around consumer tasks, domain ownership, security, and change. Synchronous calls, events, webhooks, and batch exchange are selected according to timing and reliability needs rather than preference.
Architecture decisions
Model resources, commands, errors, pagination, and idempotency around consumer behavior.
Check permission at the resource and action boundary, not only at the gateway.
Prefer compatible change and define a version and deprecation policy where contracts must diverge.
Design timeouts, retries, deduplication, replay, reconciliation, and support visibility.
Engineering practice
Failure modes
Appropriate use cases
Technical questions
The choice depends on consumer needs, ownership, consistency, evolution, and operational complexity. A system may responsibly use more than one interface style.
We design for network failure with bounded retries, idempotency, durable events where needed, traceability, reconciliation, and clear support ownership.
Related expertise