# resAPI > resAPI is a contract-first HTTP toolkit for ReScript: define an endpoint once as a value, then serve it with Hono or Express and call it from a typed client, with validation at both ends. Key facts for writing code against resAPI: - Packages: `@resapi/core` (contracts, codecs, typed client; namespace `ResApi`), `@resapi/hono` (namespace `ResApiHono`), `@resapi/express` (namespace `ResApiExpress`, Express 5 only), `@resapi/sury` (Sury schemas as codecs). - Install for Hono: `npm install @resapi/core @resapi/hono @resapi/sury hono sury sury-ppx`. For Express, swap `@resapi/hono hono` for `@resapi/express express`. List the packages and `sury` in `rescript.json` `dependencies`, with `"ppx-flags": ["sury-ppx/bin"]`. Requires ReScript 12. - A contract is a value: `Endpoint.get("/accounts/:id", ~params=..., ~response=...)`, optionally `->Endpoint.withErrors(codec, ~status=error => ...)`. - Servers: `Router.make()->Router.register(contract->EndpointHandler.make(async (ctx, {params}) => Ok(value)))`. Handlers return `Ok(value)` or `Error(declaredError)`. - Clients: `client->Client.call(contract, ~params=...)` returns a result; declared errors arrive as `Error(Application({error}))`. - Guides with Hono and Express versions wrap each version in `