{"adoption": {"forks": 178, "observed_at": "2026-08-28T04:07:56.709635+00:00", "stars": 3334}, "canonical_url": "https://ross.abutalabs.com/products/ts-rest", "card": {"archived": false, "artifact_type": "library", "description": "RPC-like client, contract, and server implementation for a pure REST API", "domain": ["web-development", "backend", "frontend", "apis", "developer-tools"], "enriched": true, "function": ["rpc", "http-client", "http-server", "api-framework", "middleware", "routing", "serialization", "api-documentation"], "health_score": 73, "homepage": "https://ts-rest.com", "language": "TypeScript", "license": "MIT", "license_family": "permissive", "maturity": "active", "member_repos": ["ts-rest/ts-rest"], "name": "ts-rest/ts-rest", "platform": ["cross-platform"], "pushed_at": "2026-02-06T20:47:21+00:00", "repo": "ts-rest/ts-rest", "stars": 3334, "tags": ["end-to-end-type-safety", "api-contract", "zod", "openapi", "trpc-alternative", "rest-client", "react-query", "nestjs", "nextjs", "fastify", "standard-schema", "nodejs", "typescript", "web-server"], "topics": ["rpc", "typescript", "api", "openapi", "rest", "fastify", "nestjs", "nextjs", "react", "react-query", "solid"], "urls": [], "use_cases": ["add end-to-end type safety to a REST API between frontend and backend", "share an API contract between client and server in a monorepo", "generate OpenAPI specs from a typed API definition", "build a type-safe API client without code generation", "validate request and response bodies at runtime with Zod", "replace tRPC when a REST API or separate contract package is needed", "integrate typed API calls with React Query"], "what_it_is": "ts-rest is a TypeScript library for defining a shared API contract that both client and server consume, providing end-to-end type safety for REST APIs without code generation. It supports Zod and other Standard Schema validation libraries, optional OpenAPI generation, and integrations with NestJS, Next.js, Express, Fastify, and React Query.", "when_to_avoid": ["your client and server live in a single Next.js or Express app where tRPC is simpler", "your API consumers are third parties who cannot use TypeScript", "you need a non-REST protocol like gRPC or GraphQL", "your stack is not TypeScript"], "when_to_choose": ["you want tRPC-like type safety but must keep a plain REST/HTTP API", "you need a separately publishable API contract shared across teams or packages", "you use NestJS, Next.js, Express, or Fastify and want typed routers", "you want OpenAPI documentation generated from your contract", "you want incremental adoption of type safety in an existing codebase"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/ts-rest", "repo": "ts-rest/ts-rest", "role": "main", "score": 64}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:41:27.969342+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d6636705bfc7c11b43af68d83e768c87009bc91596e0b0c0b6972a4cf7ba1c98", "fetched_at": "2026-08-28T04:07:56.709635+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ts-rest/ts-rest"}, {"content_hash": "786e7f56265e7d53bd22595c2c3c44350ccbf781aebdafcc088b68b636b18232", "fetched_at": "2026-08-29T09:34:48.419174+00:00", "kind": "homepage", "missing": false, "url": "https://ts-rest.com"}, {"content_hash": "8fbba10683184ab7feaf21d637fb4e37860364550e5ba78d6e9bd3071f2fa43d", "fetched_at": "2026-08-29T09:34:48.429524+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/quickstart"}, {"content_hash": "9d1a8f2eddd19848dcc1d328f08ac9acec82b9d6b19d48179b76d64e6e76f539", "fetched_at": "2026-08-29T09:34:48.431792+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/changelog"}, {"content_hash": "fc02534f3d02854b5f98d9949ad0295ce0ea420253bf82e4c5f597d4489b18c2", "fetched_at": "2026-08-29T09:34:48.434472+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/faq"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:41:27.969342+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d6636705bfc7c11b43af68d83e768c87009bc91596e0b0c0b6972a4cf7ba1c98", "fetched_at": "2026-08-28T04:07:56.709635+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ts-rest/ts-rest"}, {"content_hash": "786e7f56265e7d53bd22595c2c3c44350ccbf781aebdafcc088b68b636b18232", "fetched_at": "2026-08-29T09:34:48.419174+00:00", "kind": "homepage", "missing": false, "url": "https://ts-rest.com"}, {"content_hash": "8fbba10683184ab7feaf21d637fb4e37860364550e5ba78d6e9bd3071f2fa43d", "fetched_at": "2026-08-29T09:34:48.429524+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/quickstart"}, {"content_hash": "9d1a8f2eddd19848dcc1d328f08ac9acec82b9d6b19d48179b76d64e6e76f539", "fetched_at": "2026-08-29T09:34:48.431792+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/changelog"}, {"content_hash": "fc02534f3d02854b5f98d9949ad0295ce0ea420253bf82e4c5f597d4489b18c2", "fetched_at": "2026-08-29T09:34:48.434472+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/faq"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:41:27.969342+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d6636705bfc7c11b43af68d83e768c87009bc91596e0b0c0b6972a4cf7ba1c98", "fetched_at": "2026-08-28T04:07:56.709635+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ts-rest/ts-rest"}, {"content_hash": "786e7f56265e7d53bd22595c2c3c44350ccbf781aebdafcc088b68b636b18232", "fetched_at": "2026-08-29T09:34:48.419174+00:00", "kind": "homepage", "missing": false, "url": "https://ts-rest.com"}, {"content_hash": "8fbba10683184ab7feaf21d637fb4e37860364550e5ba78d6e9bd3071f2fa43d", "fetched_at": "2026-08-29T09:34:48.429524+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/quickstart"}, {"content_hash": "9d1a8f2eddd19848dcc1d328f08ac9acec82b9d6b19d48179b76d64e6e76f539", "fetched_at": "2026-08-29T09:34:48.431792+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/changelog"}, {"content_hash": "fc02534f3d02854b5f98d9949ad0295ce0ea420253bf82e4c5f597d4489b18c2", "fetched_at": "2026-08-29T09:34:48.434472+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/faq"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:41:27.969342+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d6636705bfc7c11b43af68d83e768c87009bc91596e0b0c0b6972a4cf7ba1c98", "fetched_at": "2026-08-28T04:07:56.709635+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ts-rest/ts-rest"}, {"content_hash": "786e7f56265e7d53bd22595c2c3c44350ccbf781aebdafcc088b68b636b18232", "fetched_at": "2026-08-29T09:34:48.419174+00:00", "kind": "homepage", "missing": false, "url": "https://ts-rest.com"}, {"content_hash": "8fbba10683184ab7feaf21d637fb4e37860364550e5ba78d6e9bd3071f2fa43d", "fetched_at": "2026-08-29T09:34:48.429524+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/quickstart"}, {"content_hash": "9d1a8f2eddd19848dcc1d328f08ac9acec82b9d6b19d48179b76d64e6e76f539", "fetched_at": "2026-08-29T09:34:48.431792+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/changelog"}, {"content_hash": "fc02534f3d02854b5f98d9949ad0295ce0ea420253bf82e4c5f597d4489b18c2", "fetched_at": "2026-08-29T09:34:48.434472+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/faq"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:41:27.969342+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d6636705bfc7c11b43af68d83e768c87009bc91596e0b0c0b6972a4cf7ba1c98", "fetched_at": "2026-08-28T04:07:56.709635+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ts-rest/ts-rest"}, {"content_hash": "786e7f56265e7d53bd22595c2c3c44350ccbf781aebdafcc088b68b636b18232", "fetched_at": "2026-08-29T09:34:48.419174+00:00", "kind": "homepage", "missing": false, "url": "https://ts-rest.com"}, {"content_hash": "8fbba10683184ab7feaf21d637fb4e37860364550e5ba78d6e9bd3071f2fa43d", "fetched_at": "2026-08-29T09:34:48.429524+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/quickstart"}, {"content_hash": "9d1a8f2eddd19848dcc1d328f08ac9acec82b9d6b19d48179b76d64e6e76f539", "fetched_at": "2026-08-29T09:34:48.431792+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/changelog"}, {"content_hash": "fc02534f3d02854b5f98d9949ad0295ce0ea420253bf82e4c5f597d4489b18c2", "fetched_at": "2026-08-29T09:34:48.434472+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/faq"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:41:27.969342+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d6636705bfc7c11b43af68d83e768c87009bc91596e0b0c0b6972a4cf7ba1c98", "fetched_at": "2026-08-28T04:07:56.709635+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ts-rest/ts-rest"}, {"content_hash": "786e7f56265e7d53bd22595c2c3c44350ccbf781aebdafcc088b68b636b18232", "fetched_at": "2026-08-29T09:34:48.419174+00:00", "kind": "homepage", "missing": false, "url": "https://ts-rest.com"}, {"content_hash": "8fbba10683184ab7feaf21d637fb4e37860364550e5ba78d6e9bd3071f2fa43d", "fetched_at": "2026-08-29T09:34:48.429524+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/quickstart"}, {"content_hash": "9d1a8f2eddd19848dcc1d328f08ac9acec82b9d6b19d48179b76d64e6e76f539", "fetched_at": "2026-08-29T09:34:48.431792+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/changelog"}, {"content_hash": "fc02534f3d02854b5f98d9949ad0295ce0ea420253bf82e4c5f597d4489b18c2", "fetched_at": "2026-08-29T09:34:48.434472+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/faq"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:07:56.709635+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:41:27.969342+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d6636705bfc7c11b43af68d83e768c87009bc91596e0b0c0b6972a4cf7ba1c98", "fetched_at": "2026-08-28T04:07:56.709635+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ts-rest/ts-rest"}, {"content_hash": "786e7f56265e7d53bd22595c2c3c44350ccbf781aebdafcc088b68b636b18232", "fetched_at": "2026-08-29T09:34:48.419174+00:00", "kind": "homepage", "missing": false, "url": "https://ts-rest.com"}, {"content_hash": "8fbba10683184ab7feaf21d637fb4e37860364550e5ba78d6e9bd3071f2fa43d", "fetched_at": "2026-08-29T09:34:48.429524+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/quickstart"}, {"content_hash": "9d1a8f2eddd19848dcc1d328f08ac9acec82b9d6b19d48179b76d64e6e76f539", "fetched_at": "2026-08-29T09:34:48.431792+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/changelog"}, {"content_hash": "fc02534f3d02854b5f98d9949ad0295ce0ea420253bf82e4c5f597d4489b18c2", "fetched_at": "2026-08-29T09:34:48.434472+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/faq"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:41:27.969342+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d6636705bfc7c11b43af68d83e768c87009bc91596e0b0c0b6972a4cf7ba1c98", "fetched_at": "2026-08-28T04:07:56.709635+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ts-rest/ts-rest"}, {"content_hash": "786e7f56265e7d53bd22595c2c3c44350ccbf781aebdafcc088b68b636b18232", "fetched_at": "2026-08-29T09:34:48.419174+00:00", "kind": "homepage", "missing": false, "url": "https://ts-rest.com"}, {"content_hash": "8fbba10683184ab7feaf21d637fb4e37860364550e5ba78d6e9bd3071f2fa43d", "fetched_at": "2026-08-29T09:34:48.429524+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/quickstart"}, {"content_hash": "9d1a8f2eddd19848dcc1d328f08ac9acec82b9d6b19d48179b76d64e6e76f539", "fetched_at": "2026-08-29T09:34:48.431792+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/changelog"}, {"content_hash": "fc02534f3d02854b5f98d9949ad0295ce0ea420253bf82e4c5f597d4489b18c2", "fetched_at": "2026-08-29T09:34:48.434472+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/faq"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:41:27.969342+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d6636705bfc7c11b43af68d83e768c87009bc91596e0b0c0b6972a4cf7ba1c98", "fetched_at": "2026-08-28T04:07:56.709635+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ts-rest/ts-rest"}, {"content_hash": "786e7f56265e7d53bd22595c2c3c44350ccbf781aebdafcc088b68b636b18232", "fetched_at": "2026-08-29T09:34:48.419174+00:00", "kind": "homepage", "missing": false, "url": "https://ts-rest.com"}, {"content_hash": "8fbba10683184ab7feaf21d637fb4e37860364550e5ba78d6e9bd3071f2fa43d", "fetched_at": "2026-08-29T09:34:48.429524+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/quickstart"}, {"content_hash": "9d1a8f2eddd19848dcc1d328f08ac9acec82b9d6b19d48179b76d64e6e76f539", "fetched_at": "2026-08-29T09:34:48.431792+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/changelog"}, {"content_hash": "fc02534f3d02854b5f98d9949ad0295ce0ea420253bf82e4c5f597d4489b18c2", "fetched_at": "2026-08-29T09:34:48.434472+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/faq"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:41:27.969342+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "d6636705bfc7c11b43af68d83e768c87009bc91596e0b0c0b6972a4cf7ba1c98", "fetched_at": "2026-08-28T04:07:56.709635+00:00", "kind": "readme", "missing": false, "url": "https://github.com/ts-rest/ts-rest"}, {"content_hash": "786e7f56265e7d53bd22595c2c3c44350ccbf781aebdafcc088b68b636b18232", "fetched_at": "2026-08-29T09:34:48.419174+00:00", "kind": "homepage", "missing": false, "url": "https://ts-rest.com"}, {"content_hash": "8fbba10683184ab7feaf21d637fb4e37860364550e5ba78d6e9bd3071f2fa43d", "fetched_at": "2026-08-29T09:34:48.429524+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/quickstart"}, {"content_hash": "9d1a8f2eddd19848dcc1d328f08ac9acec82b9d6b19d48179b76d64e6e76f539", "fetched_at": "2026-08-29T09:34:48.431792+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/changelog"}, {"content_hash": "fc02534f3d02854b5f98d9949ad0295ce0ea420253bf82e4c5f597d4489b18c2", "fetched_at": "2026-08-29T09:34:48.434472+00:00", "kind": "site_page", "missing": false, "url": "https://ts-rest.com/faq"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 66, "longevity": 100, "rhythm": 40}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 1502, "days_push": 208, "days_rel": 547, "gap_med": 11.0, "n_releases_24m": 3}, "score": 64, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}