# validata-koa

> Type safe data validation and sanitization for Koa

Latest version **5.0.4** (published 2026-07-15) · MIT license · 0 weekly downloads

## Install

```sh
npm install validata-koa
pnpm add validata-koa
yarn add validata-koa
bun add validata-koa
```

## Health

**Score 60/100 (C)** — status: active.

Positive: has types; no vulnerabilities; has provenance; high quality score.

Warnings: low downloads; no esm support.

## Facts

| | |
|---|---|
| Version | 5.0.4 |
| Published | 2026-07-15 |
| First published | 2020-06-03 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 5 |
| Unpacked size | 108.3 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Provenance | attested (GitHub Actions) |
| GitHub stars | 1 |
| Maintainers | gregbacchus |
| Keywords | typescript, type-safe, typesafe, typed, validate, validator, validation, clean, cleanse, sanitise, sanitize, data validator, data clean, data cleanse, object validator, request validator, koa |

## Links

- npm: https://www.npmjs.com/package/validata-koa
- Repository: https://github.com/gregbacchus/validata-koa
- Homepage: https://github.com/gregbacchus/validata-koa#readme
- Issues: https://github.com/gregbacchus/validata-koa/issues
- npm.io page: https://npm.io/package/validata-koa

## Dependencies (5)

- [koa](https://npm.io/package/koa.md) ^2.13.4
- [validata](https://npm.io/package/validata.md) ^5.0.1
- [@types/koa](https://npm.io/package/@types/koa.md) ^2.13.5
- [@koa/router](https://npm.io/package/@koa/router.md) ^12.0.0
- [@types/koa__router](https://npm.io/package/@types/koa__router.md) ^12.0.0

## Alternatives

- [vest](https://npm.io/package/vest.md) — 50.1K weekly downloads
- [@regle/core](https://npm.io/package/@regle/core.md) — 47.0K weekly downloads
- [typeof-arguments](https://npm.io/package/typeof-arguments.md) — 12.5K weekly downloads
- [@lokalise/projects-engine-contracts](https://npm.io/package/@lokalise/projects-engine-contracts.md) — 978 weekly downloads
- [@osjwnpm/nam-laboriosam-quibusdam](https://npm.io/package/@osjwnpm/nam-laboriosam-quibusdam.md) — 70 weekly downloads

## Recent versions

- 5.0.4 (latest) — 2026-07-15
- 5.0.2 — 2024-10-24
- 5.0.1 — 2022-09-04
- 4.0.14 — 2022-04-11
- 4.0.13 — 2022-01-22
- 4.0.11 — 2022-01-22
- 4.0.10 — 2022-01-22
- 4.0.9 — 2021-10-27
- 4.0.8 — 2021-10-16
- 4.0.7 — 2021-09-24
- 4.0.6 — 2021-09-24
- 4.0.5 — 2021-08-25
- 4.0.4 — 2021-08-25
- 4.0.3 — 2021-08-25
- 4.0.2 — 2021-08-25
- … 23 more at https://npm.io/package/validata-koa/versions

## README

# Validata Koa

Type safe data validation and sanitization for [Koa](https://www.npmjs.com/package/koa) requests
(body, query, headers, params) using [validata](https://www.npmjs.com/package/validata).

See [validata](https://www.npmjs.com/package/validata) for more details on validation functionality.

## Getting started

```bash
npm i validata validata-koa
```

## Basic usage

### Body checking

```typescript
import * as Router from '@koa/router';
import * as Koa from 'koa';
import { Context } from 'koa';
import * as bodyParser from 'koa-bodyparser';
import { asNumber, isObject, isString, maybeString } from 'validata';
import validator from 'validator';
import { body, Statuses, validate } from 'validata-koa';

interface Body {
  age: number;
  email?: string;
  name: string;
}

const bodyCheck = isObject<Body>({
  age: asNumber({ min: 0, coerceMax: 120 }),
  email: maybeString({ validator: validator.isEmail }),
  name: isString(),
});

const app = new Koa();
app.use(bodyParser());

const router: Router = new Router();
// validate() middleware captures and formats validation issue responses
router.post('/:id', validate(), (ctx: Context) => {
  // these are now strongly typed
  // if age is passed in as a string, it will be converted to a number (by the asNumber() check)
  const { age, email, name } = body(ctx, bodyCheck);
  console.log({ age, email, name });
  ctx.status = Statuses.OK;
});
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(8081);
```

### Params and query parameters

```typescript
import * as Router from '@koa/router';
import * as Koa from 'koa';
import { Context } from 'koa';
import { asNumber, isObject, isString, maybeAsNumber } from 'validata';
import { params, query, Statuses, validate } from 'validata-koa';

interface Params {
  id: number;
}

const paramsCheck = isObject<Params>({
  id: asNumber({ min: 0 }),
});

interface Query {
  filter: string;
  page?: number;
}

const queryCheck = isObject<Query>({
  filter: isString(),
  page: maybeAsNumber({ min: 0 }),
});

const app = new Koa();
const router: Router = new Router();

// validate() middleware captures and formats validation issue responses
router.post('/:id', validate(), (ctx: Context) => {
  // these are now strongly typed
  const { id } = params(ctx, paramsCheck);
  const { filter, page } = query(ctx, queryCheck);

  ctx.body = { id, filter, page };
  ctx.status = Statuses.OK;
});
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(8081);
```

Testing it out...

```bash
curl -X POST localhost:8081/foo
# status=400
# {"issues":[{"path":[":","id"],"value":"foo","reason":"no-conversion","info":{"toType":"number"}}]}

curl -X POST localhost:8081/12
# status=400
# {"issues":[{"path":["?","filter"],"reason":"not-defined"}]}

curl -X POST localhost:8081/12?filter=test
# status=200
# {"id":12,"filter":"test"}

curl -X POST localhost:8081/-2?filter=test
# status=400
# {"issues":[{"path":[":","id"],"value":-2,"reason":"min","info":{"min":0}}]}
```

### Headers

... can be done in pretty much the same way

---
_Source: https://npm.io/package/validata-koa · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
