gRPC vs REST isn't a winner-takes-all choice. Use REST for anything that strangers or browsers call. Use gRPC for internal service-to-service calls where you want a strict generated contract and streaming, and only if someone on the team will own the protobuf files. Teams can run both, with REST at the edge and gRPC inside. That's our judgment; the protocol facts below come from the gRPC, Protobuf, Connect and Microsoft docs as read on 9 October 2026.
If you're mapping the wider hiring picture around this decision, start with Hire developers by tech stack: rates, vetting and interview guides. If the third option is on your table too, how to choose between GraphQL and REST covers it and we won't repeat it here.
gRPC or REST for this service?
The picks below are judgment, and they assume a team that will keep the services for years.
| Situation | Pick | Why |
|---|---|---|
| Public API for third parties | REST | Any client can call it with plain HTTP and JSON, no generated stubs needed |
| Browser app talking to its own backend | REST, or Connect | Browsers can't call gRPC directly, so gRPC adds a proxy or a different library |
| Internal service-to-service in a polyglot stack | gRPC | One .proto file generates clients and servers in many languages |
| Streaming (server push, long-lived calls) | gRPC | Client, server and bidirectional streaming are built in |
| Mobile client on weak networks | Either, measure first | Smaller payloads help, but we have no sourced figure to promise |
| Small CRUD service with one consumer | REST | A contract toolchain costs more than it saves |
| Mixed estate | REST edge, gRPC inside | Each style sits where its limits hurt least |
| Team with no protobuf experience | REST until someone owns the contract | The risk is in contract evolution, not in the syntax |
What is the actual difference?
REST means resources addressed by URL over HTTP, usually with JSON bodies. A contract is optional, typically an OpenAPI file. gRPC makes the contract mandatory. You write a .proto file, and per the gRPC introduction, once you run protoc with a gRPC plugin "you get generated gRPC client and server code". grpc.io lists these supported languages: C#/.NET, C++, Dart, Go, Java, Kotlin, Node, Objective-C, PHP, Python, Ruby, Rust and Swift.
On the wire, the gRPC HTTP/2 protocol spec has every request as :method POST with a content type of application/grpc, messages framed in length-prefixed chunks, and the status always sent in trailers "even if the status code is OK". Microsoft's comparison of gRPC services and HTTP APIs is a cloud-vendor doc, but it's a useful side-by-side:
| Concern | HTTP APIs with JSON | gRPC |
|---|---|---|
| Contract | Optional (OpenAPI) | Required (.proto) |
| Protocol | HTTP | HTTP/2 |
| Payload | JSON (large, human readable) | Protobuf (small, binary) |
| Streaming | Client, server | Client, server, bi-directional |
| Browser support | Yes | No (requires grpc-web) |
| Client code generation | OpenAPI + third-party tooling | Yes |
The streaming row matches the gRPC project's core concepts: unary, server streaming, client streaming and bidirectional streaming. The same page covers deadlines and cancellation, which plain HTTP APIs leave to each team to design. Clients can set how long they're willing to wait for a call, and "a cancellation terminates the RPC immediately so that no further work is done."
Here's what switching looks like. The first block is the protobuf.dev example for a search call.
For illustration only, not part of a project:
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 results_per_page = 3;
}
service SearchService {
rpc Search(SearchRequest) returns (SearchResponse);
}SearchResponse is left undefined here, as in the protobuf.dev example. A real file must define it.
The REST equivalent is a route and some query parameters, with the shape described in prose or an OpenAPI file.
For illustration only, not part of a project:
GET /search?query=grpc&page_number=2&results_per_page=10The .proto file isn't documentation. Both sides generate code from it, so it is the contract. That's the real change, and the rest of this article follows from it.
Can browsers call gRPC?
Not directly. Microsoft's docs put it flatly: "It's impossible to directly call a gRPC service from a browser today." The reason given is that gRPC leans on HTTP/2 features and no browser gives a client enough control over web requests to support them.
The standard workaround is gRPC-Web. The grpc-web project says its clients "connect to gRPC services via a special proxy; by default, gRPC-web uses Envoy." Unary calls work. Server-side streaming works only in grpcwebtext mode. Its README says "Client-side and Bi-directional streaming is not currently supported." So a proxy to run, and two of the four call types gone.
Connect is the in-between option, though it's a third-party project and not part of gRPC itself. Its introduction describes "a family of libraries for building browser and gRPC-compatible HTTP APIs", where servers and clients support gRPC, gRPC-Web and Connect's own protocol, without a translating proxy like Envoy. Per that page as of 9 October 2026, Go, TypeScript/JavaScript and Swift are stable and Kotlin and Python are beta. The Connect protocol says "Bidirectional streaming requires HTTP/2, but the other RPC types also support HTTP/1.1," and unary calls can use application/json, so cURL works.
If your servers are .NET, Microsoft documents gRPC JSON transcoding: you annotate the .proto with HTTP metadata and expose the same service as a RESTful JSON API. It needs .NET 7 or later.
Our judgment: for a public or browser-facing API, REST is the cheapest path. If you want protobuf contracts end to end including the browser, price Connect against gRPC-Web plus a proxy before you promise anything.
What does the contract change for your team?
This is the part that decides whether gRPC works for you. The syntax takes an afternoon. The discipline takes a team.
Per the proto3 language guide, every field carries a number that "must be unique among all fields for that message." That number "cannot be changed once your message type is in use because it identifies the field in the message wire format." When you delete a field you reserve its number (and name), for example reserved 2, 15, 9 to 11;, so nobody reuses it for something else. Numbers 1 through 15 take one byte to encode, so the frequently used fields get them.
The same guide says adding new fields is safe and removing fields is safe. For changes the guide calls conditionally safe, such as widening an int32 to an int64, it says that if your schema is published outside your organization you should generally not make them, because you can't manage the rollout of the new schema to know when the new range of values is safe to use. Adding and removing fields isn't in that group.
REST pushes the same problem elsewhere. There's no field number; you version through the URI or a header and manage deprecation by policy. How API versioning and deprecation work covers that side. With gRPC, the schema file does some of the policing, but only if a person owns it.
Our judgment, and it's the one to take to your next architecture meeting: decide who owns the .proto repo, who reviews breaking changes, and how consumers get new generated clients, before the first service ships. Teams that skip this end up with REST's drift problem in a more annoying format. We didn't read a source on linting tools for protobuf, so we're not recommending one here.
Is gRPC really faster?
Probably for some workloads, and you should measure yours. You'll see 7x and 10x claims on comparison pages. We found no primary source for them, so we left them out.
The gRPC project does publish its benchmarking method: multi-language tests run every few hours against the master branch, measuring latency and queries per second, mostly on 8-core GKE instances, and "most performance testing is using secure communication and protobufs." The page carries no figures, though, and was last modified in January 2022. We didn't read the dashboards it points to.
Microsoft's comparison credits Protobuf for being small and fast, and gRPC for HTTP/2 multiplexing. It also notes "HTTP/2 is not exclusive to gRPC. Many request types, including HTTP APIs with JSON, can use HTTP/2." So part of the speed story is the transport, which REST can share.
On payload size, Imaginary Cloud's gRPC vs REST write-up reports a wide spread in payload savings, including cases where Protobuf came out larger, and says "ten times smaller" figures almost always compare against uncompressed JSON.
The strongest argument against reading too much into speed comes from Devlane's performance and architecture guide: cutting serialization from 2 ms to 0.5 ms barely registers next to a 100 ms database wait. Those figures are Devlane's illustration, not measurements. The point holds anyway. If your latency lives in the database, changing the wire format won't move it.
What do you lose in debugging?
Readability. Microsoft's docs say Protobuf "isn't human readable" and that extra tooling is required to analyze payloads on the wire. Server reflection and the gRPC command line tool exist for this; the reflection spec says "the primary usecase for server reflection is to write (typically) command line debugging tools."
With REST you open a terminal, run cURL and read the response. With gRPC you need reflection enabled on the server and a tool that speaks it, or a converter that turns Protobuf into JSON. Imaginary Cloud lists debugging time, the proxy layer, team capability and migration among the real adoption costs, and we'd agree.
We haven't covered load balancing or metrics for gRPC. We didn't read a primary source for either, and we'd rather leave a gap than guess. Check both before you commit to production.
Who can you hire for it?
Don't look for a gRPC specialist. The skill is protobuf contract discipline plus fluency in one of the languages gRPC supports. gRPC's own docs list generated clients for 13 languages, including Go, Java, C#, Python and Node.
Stack Overflow's 2025 developer survey has no row for gRPC, REST or Protobuf in the tables we read, so there's no direct pool size. It does show the languages engineers write. Go sits at 16.4% of all respondents (31,771) and 17.4% of professionals (24,759) in the languages question. Node.js is at 48.7% of all respondents (23,678) and 49.1% of professionals (19,460), in a different question about web frameworks and technologies. Don't rank them against each other, since the questions and bases differ. The takeaway is only that a gRPC team can hire from Go, Java, C#, Python or Node pools alike. For the Go side, what to test when you hire Go engineers has screening detail.
Four interview probes we'd use, as judgment:
- How would you evolve a message without breaking old clients?
- How do deadlines and cancellation work across a chain of calls?
- What happens at the browser edge of this system?
- How would you debug a binary payload in production?
An engineer who answers the first one with field numbers and reserved is worth more than one who recites HTTP/2 trivia.
What this means for your API decision
Default to REST at the public edge. It's the style every client can call without generated stubs or a proxy, in our view.
Adopt gRPC for internal calls only where the generated contract or the streaming pays for itself, and only when a named person owns the .proto repo. If nobody will, you're better off with REST and OpenAPI.
Price the browser leg before promising gRPC to a web client: a gRPC-Web proxy with no client or bidirectional streaming, or Connect as a different dependency.
When you hire or assess, test for contract-evolution discipline, not for the word gRPC on a CV. Those are our recommendations, based on the sources above. For the wider question of what seniority to look for in the next backend hire, what seniority means for backend hires is the next read.
FAQ
Is gRPC faster than REST?
Possibly, for some workloads, but we found no sourced figure we'd quote. The gRPC project publishes its benchmark method without numbers on that page, and Microsoft notes HTTP/2 isn't exclusive to gRPC. If your time goes into database queries, the wire format won't change much. Measure your own workload.
Can browsers call gRPC?
Not directly. Microsoft's docs say no browser gives a gRPC client the control over HTTP/2 it needs. gRPC-Web works through a proxy such as Envoy and supports unary calls and, only in grpcwebtext mode, server streaming. Connect supports gRPC-Web without a translating proxy, and it's a separate project from gRPC.
Can you use gRPC and REST together?
Yes. Our suggested split is REST at the public edge and gRPC between internal services. .NET also supports JSON transcoding, which exposes a gRPC service as a RESTful JSON API from annotations in the .proto file.
Does gRPC need HTTP/2?
gRPC itself runs over HTTP/2. Connect's own protocol is looser: only bidirectional streaming requires HTTP/2, and the other call types also work over HTTP/1.1. That's why Connect unary calls can be made with cURL.
Is gRPC replacing REST?
We found no source that says so. Browsers can't call gRPC directly, and the browser leg needs a proxy or Connect. Our view is that gRPC fits internal service calls and REST stays the default for public APIs.
