# @lidofinance/next-api-wrapper

> Wrapper for next server api requests

Latest version **0.64.0** (published 2026-09-01) · MIT license · 0 weekly downloads

## Install

```sh
npm install @lidofinance/next-api-wrapper
pnpm add @lidofinance/next-api-wrapper
yarn add @lidofinance/next-api-wrapper
bun add @lidofinance/next-api-wrapper
```

## Health

**Score 70/100 (B)** — status: active.

Positive: has types; esm support; no vulnerabilities; recently updated; high maintenance score; high quality score.

Warnings: low downloads; pre 1.0.

## Facts

| | |
|---|---|
| Version | 0.64.0 |
| Published | 2026-09-01 |
| First published | 2022-09-07 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >= 16 |
| Dependencies | 0 |
| Unpacked size | 30 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Maintainers | lidofinance-group, lidofinance-ui |

## Links

- npm: https://www.npmjs.com/package/@lidofinance/next-api-wrapper
- Repository: https://github.com/lidofinance/warehouse
- Homepage: https://github.com/lidofinance/warehouse/tree/main/packages/next/api-wrapper
- Issues: https://github.com/lidofinance/warehouse/issues
- npm.io page: https://npm.io/package/@lidofinance/next-api-wrapper

## Recent versions

- 0.64.0 (latest) — 2026-09-01
- 0.63.0 — 2026-08-12
- 0.62.0 — 2026-08-05
- 0.61.0 — 2026-07-22
- 0.60.0 — 2026-07-15
- 0.59.0 — 2026-05-05
- 0.58.0 — 2026-03-31
- 0.57.0 — 2026-03-27
- 0.56.0 — 2025-10-22
- 0.55.0 — 2025-10-20
- 0.54.1 — 2025-08-20
- 0.54.0 — 2025-08-20
- 0.52.0 — 2025-07-10
- 0.51.0 — 2025-03-06
- 0.50.0 — 2025-03-05
- … 51 more at https://npm.io/package/@lidofinance/next-api-wrapper/versions

## README

# @lidofinance/next-api-wrapper

Wrapper for next server api requests.

## Installation

`yarn add @lidofinance/next-api-wrapper`.

## Getting started

### wrapRequest

```ts
import { wrapRequest, API } from '@lidofinance/next-api-wrapper'
import { NextApiRequest, NextApiResponse } from 'next'

const someRequest: API = async (req, res) => await fetch()

export default wrapRequest([SomeWrapper])(someRequest)
```

## Examples

### Default error handler

```ts
import { wrapRequest, defaultErrorHandler } from '@lidofinance/next-api-wrapper'
import { NextApiRequest, NextApiResponse } from 'next'

export type API = (req: NextApiRequest, res: NextApiResponse) => Promise<void>

const CUSTOM_API_ERROR_MESSAGE = 'Default message'
const someRequest: API = async (req, res) => await fetch()

export default wrapRequest([defaultErrorHandler()])(someRequest)
// or
export default wrapRequest([defaultErrorHandler({ errorMessage: CUSTOM_API_ERROR_MESSAGE, serverLogger: SomeLogger })])(
  someRequest,
)
```

### Cache control

```ts
import { wrapRequest, cacheControl } from '@lidofinance/next-api-wrapper'
import { NextApiRequest, NextApiResponse } from 'next'

export type API = (req: NextApiRequest, res: NextApiResponse) => Promise<void>

const CUSTOM_CACHE_HEADERS = 'public, max-age=180'
const CUSTOM_ERROR_CACHE_HEADERS = 'no-store'
const someRequest: API = async (req, res) => await fetch()

// use default headers
export default wrapRequest([cacheControl()])(someRequest)
// or
export default wrapRequest([cacheControl({ headers: CUSTOM_CACHE_HEADERS, errorHeaders: CUSTOM_ERROR_CACHE_HEADERS })])(
  someRequest,
)
```

### Mixing wrappers

```ts
import { wrapRequest, cacheControl, defaultErrorHandler } from '@lidofinance/next-api-wrapper'
import { NextApiRequest, NextApiResponse } from 'next'

export type API = (req: NextApiRequest, res: NextApiResponse) => Promise<void>

const CUSTOM_API_ERROR_MESSAGE = 'Default message'
const CUSTOM_CACHE_HEADERS = 'public, max-age=180'
const CUSTOM_ERROR_CACHE_HEADERS = 'no-store'
const someRequest: API = async (req, res) => await fetch()

// defaultErrorHandler must be last in the wrapper stack
export default wrapRequest([cacheControl(), defaultErrorHandler()])(someRequest)
// or
export default wrapRequest([
  cacheControl({ headers: CUSTOM_CACHE_HEADERS, errorHeaders: CUSTOM_ERROR_CACHE_HEADERS }),
  defaultErrorHandler({ errorMessage: CUSTOM_API_ERROR_MESSAGE }),
])(someRequest)
```

### Creation of ready mixed wrappers

```ts
import { wrapRequest, cacheControl, defaultErrorHandler } from '@lidofinance/next-api-wrapper'
import { NextApiRequest, NextApiResponse } from 'next'

export type API = (req: NextApiRequest, res: NextApiResponse) => Promise<void>

const DEFAULT_API_ERROR_MESSAGE = 'Default message'
const CACHE_HEADERS = 'public, max-age=180'
// defaultErrorHandler must be last in the wrapper stack
export const defaultErrorAndCacheWrapper = wrapRequest([cacheControl(), defaultErrorHandler()])

const someRequest: API = async (req, res) => await fetch()

export default defaultErrorAndCacheWrapper(someRequest)
```

### Response time metric

```ts
import { wrapRequest, responseTimeMetric } from '@lidofinance/next-api-wrapper'
import { NextApiRequest, NextApiResponse } from 'next'
import { Registry, Histogram } from 'prom-client'

export type API = (req: NextApiRequest, res: NextApiResponse) => Promise<void>

const apiTimings = new Histogram({
  name: 'frontend_template_api_response_internal',
  help: 'API response time',
  labelNames: ['hostname', 'route', 'entity', 'status'],
  buckets: [0.1, 0.2, 0.3, 0.6, 1, 1.5, 2, 5],
  registers: new Registry(),
});

const someRequest: API = async (req, res) => await fetch()

export default wrapRequest([
  responseTimeMetric(apiTimings, 'api/some-request'),
])(someRequest)
```

---
_Source: https://npm.io/package/@lidofinance/next-api-wrapper · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
