Prisma Next is in early access.Read the docs
NextFrameworks

Hono

Build a Hono API on Prisma Next with the hono template, then add your own routes.

Introduction

In this guide, you scaffold a Hono API backed by Prisma Next, initialize and seed a PostgreSQL database, serve data over HTTP, and add your own POST route. The hono template generates the server for you, so most of the work is understanding the pieces and extending them.

Every command, route, and response below was run end to end against a live Prisma Postgres database.

Prerequisites

  • Node.js 24 or later, or Bun (this guide uses Bun for speed; npm works the same)
  • A PostgreSQL connection string, or nothing at all: the scaffold can create a Prisma Postgres database for you

1. Scaffold the project

bunx create-prisma@next create my-hono-api --provider postgres --template hono

Pick your package manager and database at the prompts. The template generates a Hono server in src/index.ts with two routes (GET / and GET /users), the Prisma Next setup in src/prisma/, and package scripts for the database steps.

cd my-hono-api

2. Initialize and seed the database

bun run db:init
bun run db:seed
"summary": "Applied 5 operation(s) across 1 space(s), database signed"
Seeded 3 users.

3. Run the server

bun run dev

The server starts on port 3000 (set PORT to change it). Check both routes:

curl http://localhost:3000/users
[
  { "id": "1", "email": "alice@prisma.io", "username": "alice", "name": "Alice", "createdAt": "2026-07-06T23:37:32.440Z" },
  { "id": "2", "email": "bob@prisma.io", "username": "bob", "name": "Bob", "createdAt": "2026-07-06T23:37:32.474Z" },
  { "id": "3", "email": "carol@prisma.io", "username": "carol", "name": "Carol", "createdAt": "2026-07-06T23:37:32.507Z" }
]

The route handler is ordinary Hono code calling an ordinary Prisma Next query; there is no framework adapter in between.

4. Add a POST route

Add a route that creates a user from the request body. Add this to src/index.ts above the serve(...) call:

src/index.ts
app.post("/users", async (c) => {
  const body = await c.req.json<{ email: string; name?: string }>();
  const { db } = await import("./prisma/db");
  const user = await db.orm.public.User.create({
    email: body.email,
    name: body.name ?? null,
  });
  return c.json(user, 201);
});

Restart the server and create a user:

curl -X POST http://localhost:3000/users \
  -H "content-type: application/json" \
  -d '{"email":"dev@prisma.io","name":"Dev"}'
{ "createdAt": "2026-07-06T23:37:56.184Z", "email": "dev@prisma.io", "id": 4, "name": "Dev", "username": null }

.create(...) returns the full inserted record, database defaults included, so the response needs no second query.

Common gotchas

Prompt your coding agent

The scaffold installs Prisma Next skills for your coding agent. Prompts that map to this guide:

  • "Using the prisma-next-queries skill, add GET /users/
    that returns one user or a 404."
  • "Add a Post model related to User, update the database, and expose GET /users/
    /posts."
  • "Wrap the signup route's writes in a transaction."

Next steps

On this page