There are a few choices when designing an API layer: REST or RPC, binary or plaintext, TCP or HTTP, schema or schemaless? A few of the tradeoffs and an overview of some of the tools. Schema-driven? You can do this with REST (e.g., OpenAPI/Swagger) and RPC (e.g., protobufs). While having a schema means you can automatically scaffold client/server stubs and enforce message types, it doesn't come for free. The code generation step adds friction to the developer workflow, and developing outside the happy path is extra painful – let's say you have to modify a client/server stub; how do you incorporate that into code generation?