Node Express API

A small Express API returns its Node.js version, reports its health, and lets you list or add todos. Tokay gives it a live URL as one Web Service.

Last updated

This is the familiar Express shape many Node.js projects start with. You can deploy the ordinary server and package.json without teaching the app about Tokay.

Runtime
Node.js
Framework
Express
Service types
Web Service
Resources
None
Required secrets
None

What it does

Open the root route to see which Node.js runtime is serving your app.

The /todos route starts with three sample items. Send it a title with POST and the API returns the new todo with its ID.

Send an empty title and you get a clear validation error. The /health route gives you a small liveness check.

Deploy it

Bring this folder to Tokay any way you like. Paste or upload it in the dashboard, push it with git, or hand it to your AI agent along with our agent instructions. Tokay figures out the rest.

Working in Claude, ChatGPT, VS Code, or another MCP client? Connect the Tokay MCP server and ask your agent to deploy this example. It signs in through your browser, so there is no token to paste.

New to Tokay? The getting started guide walks you through your first deploy.

Try it

Replace the placeholder with your live URL, add one todo, then fetch the list.

export APP_URL="https://your-app.tokay.app"
curl -X POST "$APP_URL/todos" \
  -H 'Content-Type: application/json' \
  -d '{"title":"ship the next thing"}'
curl "$APP_URL/todos"

Your new todo appears in the list. Deploy again and the three samples return because this starter deliberately keeps data in memory.

How it works

You can keep the same Express entry point you use locally. Tokay installs the packages, supplies PORT, starts the server, and routes the live URL to it.

Secrets

You can call every route without a secret or an outside account.

Grow from here

Try the PostgreSQL task tracker when you want todos to survive a restart.

package.json Raw

{
  "name": "tokay-node-express-api",
  "version": "1.0.0",
  "private": true,
  "type": "commonjs",
  "scripts": {
    "start": "node server.js"
  },
  "engines": {
    "node": ">=22"
  },
  "dependencies": {
    "express": "^5.1.0"
  }
}

server.js Raw

const express = require('express');

const app = express();
const todos = [
  { id: 1, title: 'deploy this ✓' },
  { id: 2, title: 'add a database' },
  { id: 3, title: 'tell a friend' },
];

app.use(express.json());

app.get('/', (_request, response) => response.json({
  message: 'Hello from Express',
  runtime: `Node.js ${process.version}`,
}));

app.get('/health', (_request, response) => response.json({ ok: true }));

app.get('/todos', (_request, response) => response.json(todos));

app.post('/todos', (request, response) => {
  const title = String(request.body?.title || '').trim();
  if (!title) return response.status(400).json({ error: 'title is required' });

  const todo = { id: todos.at(-1)?.id + 1 || 1, title };
  todos.push(todo);
  return response.status(201).json(todo);
});

const port = Number(process.env.PORT || 3000);
app.listen(port, '0.0.0.0', () => console.log(`Express API listening on port ${port}`));

Built from revision 52c7b7f

Guide: Deploy an Express app