REST hands us JSON and hopes we agree on what it means. A typo in a field name is discovered at runtime, by a customer.
gRPC starts from a schema instead. The API is defined once in a .proto file, and client and server code is generated from it for every language in use. A compiler checks the contract rather than a conversation.
On the wire it carries field numbers rather than field names. An order that takes about thirty-seven bytes as JSON takes about eight as protobuf.
That numbering is also how evolution works. Adding a field means using a new number, and old clients ignore it. Renaming a field is safe, because the number is the identity. Removing one means reserving that number forever. Changing a type is the breaking change, because old clients will misread the bytes and say nothing.
The trade is real. Protobuf is unreadable to humans, so there is no curl, no browser, no quick inspection — which suits services we own far better than a public edge.
Agreements held in everyone's head stay flexible until the day they disagree. Written ones are rigid, and that is the feature.
