An API you can work with

Build the frontend.
Don’t wait for the backend.

Turn an OpenAPI document into a running local API. Start with generated responses, then add the behavior your frontend needs.

TypeScript handlers · Shared state · Hot reload

Your API, on localhost
// api/routes/pets.ts
export const GET: HTTP_GET = function ($) {
  return $.response[200].json(
    $.context.pets
  );
};
GET /pets 200 OK
[{ "id": 1, "name": "Fluffy" }]

An example custom handler backed by a context.

Why Counterfact

  1. The backend isn’t ready

    Frontend work shouldn’t have to wait for the backend. When an API is unavailable or a feature hasn’t been built yet, developers still need a way to build and test the clients that depend on it.

    Web and mobile clients send API requests to an unavailable backend and wait for responses.

    Scroll horizontally on small screens. Open the full-size diagram

  2. Counterfact implements the contract

    Give Counterfact an OpenAPI contract, and it provides a working API for your web and mobile clients. Develop against that contract, simulate new functionality, and test errors and edge cases without waiting for the live backend.

    Web and mobile clients build and test against Counterfact’s simulated responses. An OpenAPI contract specifies the interface; the backend remains unavailable.

    Scroll horizontally on small screens. Open the full-size diagram

  3. Mix simulated and real responses

    Simulate new functionality, errors, and edge cases. Use real services when useful.

    Web and mobile clients use the same Counterfact interface. Counterfact simulates responses and proxies selected requests to available real services. The OpenAPI contract specifies the interface.

    Scroll horizontally on small screens. Open the full-size diagram

The OpenAPI document describes the interface. Counterfact handles requests and returns simulated responses or forwards selected requests to a real service.

From contract to localhost

One command to get moving.

Counterfact creates editable routes and generated types, then starts an HTTP server. Connect your client to localhost:3100.

npx counterfact@latest https://petstore3.swagger.io/api/v3/openapi.json api

Node.js 22+. Swagger 2.0 and OpenAPI 3.0–3.2.
Install a pinned version for a repeatable project, and commit the lockfile.

Run in a new directory. Try http://localhost:3100/pet/1 or open Swagger UI after the server starts. Use your own OpenAPI document in place of the example URL.

Grow the simulation with your client

From sample data to a complete workflow.

Catch changed assumptions before integration.

Regenerate handler types when the OpenAPI contract changes, then run an explicit TypeScript check. Give client and server teams earlier feedback alongside runtime validation and real-backend tests.

Documentation

Learn a feature. Look up a detail.

Everything in the manual