
No controllers, no DTOs
REST requires you to bind your code to routes, DTOs, and HTTP status codes. With Graftcode, you simply write a public method and it's ready to be called remotely from almost any technology. It can't get any simpler.

No controllers. No DTOs. Just methods.
REST works everywhere, but ties your API to HTTP routes, methods, status codes, controllers, and DTOs. Graftcode turns ordinary public methods directly into a strongly typed client without HTTP-specific dependencies.
/USED BY LEADING COMPANIES
/AT GLANCE
REST made HTTP the universal contract for APIs. Graftcode makes ordinary public methods directly callable across services like never before.
/WHY SWITCH
REST ties APIs to HTTP contracts and integration code. Graftcode connects ordinary public methods across any technology, with interchangeable communication channels and no integration code to maintain.

REST requires you to bind your code to routes, DTOs, and HTTP status codes. With Graftcode, you simply write a public method and it's ready to be called remotely from almost any technology. It can't get any simpler.

REST is strongly-typed over the wire; real types mean an OpenAPI spec and a codegen step that drifts. Graftcode ships a typed Graft that auto-refreshes.

With REST, changing an API can mean updating controllers, routes, DTOs, and clients. With Graftcode, you simply change or add a public method, refresh the package, and call it remotely just like a local function. No cascading updates across integration layers.
/SHOW, DON'T TELL
Fetching one user — the REST plumbing vs a direct typed call.
[ApiController]
public class UsersController : ControllerBase {
[HttpGet("/users/{id}")]
public ActionResult<UserDto> Get(int id) =>
_db.Find(id).ToDto();
}interface UserDto {
id: number;
name: string;
email: string;
}
async function getUser(id: number): Promise<UserDto> {
const response = await fetch(`/api/users/${id}`, {
method: "GET",
headers: {
Accept: "application/json",
},
});
if (response.status === 404) {
throw new Error("User not found");
}
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return (await response.json()) as UserDto;
}
const user = await getUser(42);public class UserService {
public User GetUser(int id) => _db.Find(id);
}from acme_user_service import UserService
user = UserService.get_user(42)/FEATURE MATRIX
| Capability | REST | Graftcode |
|---|---|---|
| PROGRAMMING MODEL | ||
| Call with Strongly Typed Methods | [×] NO | [✓] YES |
| Regular Exception support | [×] NO | [✓] YES |
| Complex DTOs & arrays passed by value in one call | [✓] YES | [✓] YES |
| PROGRAMMING DEPENDENCIES & CONTRACTS | ||
| No additional SDK | [-] PARTIAL | [✓] YES |
| No contract files | [×] NO | [✓] YES |
| Use remote modules as dependencies | [×] NO | [✓] YES |
| TOPOLOGY & TRANSPORT | ||
| Switch between WebSocket, HTTP/2, TCP, queues, events, or PaaS channels with a single env var. | [×] NO | [✓] YES |
| Switch remote <-> in-memory with config only | [×] NO | [✓] YES |
| TOPOLOGY & TRANSPORT | ||
| Same programming model for queues / event buses | [×] NO | [✓] Via plugins |
| Full streaming | [-] PARTIAL | [-] PARTIAL |
| Expose methods are immediately callable via MCP | [×] NO | [✓] YES |
/BY THE NUMBERS
60%
less code for AI to touch
1/8
of CPU usage comparing to REST or gRPC
20
coding languages supported
10
package managers supported
/FAQS
REST is widely supported, but it ties APIs to HTTP-specific contracts, routes, DTOs, and status codes. Graftcode removes these constraints for both public APIs and internal services. Simply expose ordinary public methods and let consumers install a strongly typed client through their existing package manager. No special SDK, license, or shared codebase required. The same methods can be accessed across languages and communication channels without changing their implementation.
/COMMUNITY
Many developers are loving Graftcode and what it brings to them.


















“Graftcode appears to be an exceptionally useful platform. Its key value proposition is allowing developers to concentrate on core business requirements instead of tedious service integration tasks. I believe the concept of beginning with a monolithic structure and then having the option to dynamically transition to a microservice architecture will prove to be extremely valuable.”
Expose one class, install the Graft, and make your first typed cross-service call inabout 10 minutes.
