Skip to content
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
ts-restPublic archive

About

πŸŒ„ - RPC-like client, contract, and server implementation for a pure REST API

Topics

Resources

Contributing

Security policy

Stars

3.3k stars

Watchers

7 watching

Forks

Latest commit

Β 

History

791 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ts-rest

Maintenance status

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 πŸͺ„

GitHub Repo stars License Bundle Size

Introduction

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.

Features

  • 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 πŸ‘ˆ

Super Simple Example

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!
});

Quickstart

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 πŸ‘ˆ

Contributors ✨

MASSIVE Thanks to all of these wonderful people (emoji key), who have helped make ts-rest possible:

Youssef Gaber
Youssef Gaber

πŸ’» πŸ€” ⚠️
Per Hermansson
Per Hermansson

πŸ“– πŸ’»
GrΓ©gory Houllier
GrΓ©gory Houllier

πŸ“–
Michael Angelo
Michael Angelo

πŸ“–
Pieter Venter
Pieter Venter

πŸ“–
Rifaldhi AW
Rifaldhi AW

πŸ“–
Jonathan White
Jonathan White

πŸ’» πŸ“–
Max Brosnahan
Max Brosnahan

πŸ’» πŸ€”
Oliver Butler
Oliver Butler

πŸ’» πŸ€” πŸ“– πŸš‡ 🚧
Adrian Barylski
Adrian Barylski

πŸ’» πŸ“– ⚠️
Neil A. Dobson
Neil A. Dobson

πŸ’»
Eric Do
Eric Do

πŸ“–
Ben
Ben

πŸ’» πŸ“– ⚠️
LW
LW

πŸ’» πŸ›
Andrew Vance
Andrew Vance

πŸ“–

Star History

Thank you to everyone who helped ts-rest grow since its first commit in 2022.

About

πŸŒ„ - RPC-like client, contract, and server implementation for a pure REST API

Topics

Resources

Contributing

Security policy

Stars

3.3k stars

Watchers

7 watching

Forks

Releases

Packages

Used by

Contributors

Languages