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
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.
| Package | Version |
|---|---|
| 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.
More web apps templates
View all- Framework: Vite + React + TypeScriptDifficulty: beginnerFeatured
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.