> ## Documentation Index
> Fetch the complete documentation index at: https://bytekit.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# HTTP client

> Use ApiClient for typed, isomorphic HTTP requests.

## Create a client

`ApiClient` works in Node.js 18+ and modern browsers because it relies on native `fetch`.

```ts theme={null}
import { ApiClient } from "bytekit/api-client";

const api = new ApiClient({
  baseUrl: "https://api.example.com",
  timeoutMs: 10000,
  defaultHeaders: {
    Authorization: `Bearer ${token}`,
  },
});
```

## Send typed requests

```ts theme={null}
interface User {
  id: number;
  name: string;
  email: string;
}

const users = await api.get<User[]>("/users");

const created = await api.post<User>("/users", {
  name: "Ada Lovelace",
  email: "ada@example.com",
});
```

## Add query parameters

```ts theme={null}
const results = await api.get("/users", {
  searchParams: {
    page: 1,
    limit: 20,
    status: "active",
  },
});
```

## Validate responses

ByteKit exposes adapter helpers so you can keep schema validation close to your requests.

```ts theme={null}
import { ApiClient, zodAdapter } from "bytekit";
import { z } from "zod";

const UserSchema = z.object({
  id: z.number(),
  name: z.string(),
});

const user = await api.get("/users/1", {
  validateResponse: zodAdapter(UserSchema),
});
```

## Use interceptors

Interceptors let you adjust every request or response in one place.

```ts theme={null}
const api = new ApiClient({
  baseUrl: "https://api.example.com",
  interceptors: {
    request: async (url, init) => {
      return [
        `${url}${url.includes("?") ? "&" : "?"}t=${Date.now()}`,
        init,
      ];
    },
    response: async (response) => {
      console.log("status", response.status);
      return response;
    },
  },
});
```

## Configure environment-aware URLs

```ts theme={null}
import { ApiClient, EnvManager } from "bytekit";

const env = new EnvManager();

const api = new ApiClient({
  baseUrl: env.get("API_URL") || "http://localhost:3000/api",
});
```

<Tip>
  Move to [resilience patterns](/guides/resilience) if you need retries, caching, deduplication, or rate limiting.
</Tip>
