Typed endpoints with validation
Define endpoints once and get full TypeScript safety for params, bodies, and responses, with the added security of end-to-end validation.
Universal fetch-based, typed HTTP client with error-first ergonomics, retries, caching, SSE, and Standard Schema validation.

Small and easy-to-use fetch based client with runtime validation
WireTyped is a small, composable HTTP client for fetch-based runtimes (browser, Node, Bun, Deno, workers). You define your API as typed endpoint definitions and call it with a consistent, error-first API.
It keeps a tiny runtime surface area: one dependency, @standard-schema/spec, so you can bring your own validator (Zod, Valibot, ArkType, etc.) without dragging in a whole framework or a pile of transitive deps.
I built it because I got tired of the same three problems: surprise runtime errors, wrapping every request in try/catch, and threading schemas + type inference through every call just to keep types strict and consistent. WireTyped centralizes that work in your endpoint definitions, so using the client stays predictable and pretty.
Define your endpoints once, then call them with a consistent [err, data] shape with convenient type-narrowing:
import { RequestClient, type RequestDefinitions } from 'wiretyped';
import { z } from 'zod'; // Or your standard-schema/spec of choice
const endpoints = {
'/users/{id}': {
get: { response: z.object({ id: z.string(), name: z.string() }) },
},
} satisfies RequestDefinitions;
const client = new RequestClient({
hostname: 'https://api.example.com',
baseUrl: '/api',
endpoints,
validation: true,
});
const [err, user] = await client.get('/users/{id}', { id: '123' });
if (err) {
return err;
}
console.log(user.name);If you’re nodding along and want to keep moving, jump into the quickstart: /guide/getting-started