ts-rest is no longer maintained. There are no planned releases, including V4, bug fixes, security updates, or support.
I no longer have the time or capacity to maintain the project or run its community. I'm sorry for the long silence, and grateful to everyone who used or contributed to ts-rest, and to everyone who sponsored my work.
Existing releases, source code, and documentation are available as-is. Independent forks are welcome, including forks of individual adapters, under the existing MIT licence. You do not need approval from the original maintainers to continue the project independently.
The unfinished V4 work is available for forks to build on, but is not a supported release.
Incrementally adoptable RPC-like client and server helpers for a magical end to end typed experience πͺ
ts-rest offers a simple way to define a contract for your API, which can be both consumed and implemented by your application, giving you end to end type safety without the hassle or code generation.
- End-to-end type safety π
- RPC-like client side API β‘οΈ
- Small Bundle Size π
- No Code Generation πββοΈ
- Zod support for runtime validation π
- Full optional OpenAPI integration π
π Start reading the official Quickstart Guide π
Easily define your API contract somewhere shared
const contract = c.router({
getPosts: {
method: 'GET',
path: '/posts',
query: z.object({
skip: z.number(),
take: z.number(),
}), // <-- Zod schema
responses: {
200: c.type<Post[]>(), // <-- OR normal TS types
},
headers: z.object({
'x-pagination-page': z.coerce.number().optional(),
}),
},
});Fulfill the contract on your server, with a type-safe router:
const router = s.router(contract, {
getPosts: async ({ params: { id } }) => {
return {
status: 200,
body: prisma.post.findUnique({ where: { id } }),
};
},
});Consume the api on the client with a RPC-like interface:
const result = await client.getPosts({
headers: { 'x-pagination-page': 1 },
query: { skip: 0, take: 10 },
// ^-- Fully typed!
});Create a contract, implement it on your server then consume it in your client. Incrementally adopt, trial it with your team, then get shipping faster.
π Start reading the official Quickstart Guide π
MASSIVE Thanks to all of these wonderful people (emoji key), who have helped make ts-rest possible:
Thank you to everyone who helped ts-rest grow since its first commit in 2022.