Skip to content
Framework: Node.js + ExpressDifficulty: intermediate

Express REST API

A TypeScript Express API with routing, validation, and an in-memory store you can swap for PostgreSQL.

An Express 4 server written in TypeScript and run with tsx in development. It exposes a small todos resource with zod-validated request bodies and an in-memory array; replace the array with a database client and the handlers stay the same.

  • node
  • express
  • api
  • typescript
  • backend

This preview is the template's actual file tree and source code — exactly what is copied into a new project. Codexa does not publish screenshots or mock-ups of templates; run the project to see it rendered.

Files5 files

src/server.ts40 lines
import express from "express";
import { z } from "zod";

const app = express();
app.use(express.json());

type Todo = { id: number; title: string; done: boolean };
const todos: Todo[] = [{ id: 1, title: "Describe your API in the Codexa chat", done: false }];
let nextId = 2;

const TodoInput = z.object({ title: z.string().min(1).max(200), done: z.boolean().optional() });

app.get("/", (_req, res) => {
  res.json({ name: "codexa-api", endpoints: ["GET /api/todos", "POST /api/todos", "PATCH /api/todos/:id", "DELETE /api/todos/:id"] });
});
app.get("/api/todos", (_req, res) => res.json(todos));
app.post("/api/todos", (req, res) => {
  const parsed = TodoInput.safeParse(req.body);
  if (!parsed.success) return res.status(400).json({ error: parsed.error.flatten() });
  const todo: Todo = { id: nextId++, title: parsed.data.title, done: parsed.data.done ?? false };
  todos.push(todo);
  res.status(201).json(todo);
});
app.patch("/api/todos/:id", (req, res) => {
  const todo = todos.find((t) => t.id === Number(req.params.id));
  if (!todo) return res.status(404).json({ error: "Not found" });
  const parsed = TodoInput.partial().safeParse(req.body);
  if (!parsed.success) return res.status(400).json({ error: parsed.error.flatten() });
  Object.assign(todo, parsed.data);
  res.json(todo);
});
app.delete("/api/todos/:id", (req, res) => {
  const i = todos.findIndex((t) => t.id === Number(req.params.id));
  if (i === -1) return res.status(404).json({ error: "Not found" });
  todos.splice(i, 1);
  res.status(204).end();
});

const port = Number(process.env.PORT) || 3000;
app.listen(port, "0.0.0.0", () => console.log(`API listening on http://localhost:${port}`));

Dependencies

Documented from the template's package.json. The runtime has a prebuilt dependency set for Node.js + Express, so installs are fast.

PackageVersion
express^4.21.0
zod^3.24.0
tsx^4.19.0
typescript^5.8.0

How it runs

Framework
Node.js + Express
Dev command
npm run dev
Build command
npm run build
Output directory
dist
Port
3000
Opens at
/api/todos
Difficulty
intermediate

Projects run in an isolated sandbox with a live preview. Read the projects documentation for details on settings, snapshots and deployment.

View all
  • Framework: Vite + React + TypeScriptDifficulty: beginner
    Featured

    React starter

    A clean React + TypeScript + Tailwind single-page app. The default target for AI generation.

    • react
    • typescript
    • tailwind
    • vite
    • spa

    9 files

  • Framework: Node.js + ExpressDifficulty: intermediate

    Structured Express API

    A notes REST API split into router, middleware, and store modules, with logging, error handling, and search.

    • node
    • express
    • api
    • rest
    • typescript

    8 files

  • Framework: Vite + React + TypeScriptDifficulty: beginner

    Todo, kanban and notes

    A productivity app with a todo list, a drag-and-drop kanban board, and a notes editor sharing one local dataset.

    • react
    • todo
    • kanban
    • notes
    • productivity

    14 files

Need the raw data? GET /api/v1/templates/node-express-api returns this template with its files.

Build on Express REST API

Create a free account, start from this template, and ask the AI agent to turn it into your app.