@s4nchez even if the message format is the same, there are many differences. E.g. client is (mostly) using one request, while server handling many. There are differences in lifecycle. Server receives a request and produces a response, and thus there is single “window” of execution when you have both: request received and response being built. Client has two “windows”: it produces a request using builder, and it doesn’t have a response yet, then it sends a request and receives a response (both are available, but none are builders). So the API should be reflecting the differences in lifecycles, mutability, asynchrony, etc.