Getting Started

Nuxt Auto API automatically generates type-safe REST APIs from your Drizzle ORM schemas with built-in authorization, validation, and multi-tenancy support.

Getting Started

Nuxt Auto API automatically generates type-safe REST APIs from your Drizzle ORM schemas with built-in authorization, validation, and multi-tenancy support.

Features

  • Automatic CRUD endpoints from Drizzle schemas
  • Plugin system for extending the request pipeline
  • Multi-database support (SQLite, Postgres, MySQL, D1, Turso, PlanetScale)
  • Multi-tier authorization (operation, SQL-level list filter, object-level, field-level)
  • Validation with Zod and drizzle-zod
  • Custom endpoints with createEndpoint() and standalone helpers
  • Cursor & offset pagination
  • Soft delete support (auto-detected)
  • Multi-tenancy with flexible configuration
  • M2M relationships with auto-detection
  • Type-safe frontend with TanStack Query integration

Installation

npm install @websideproject/nuxt-auto-api

Basic Setup

1. Add the module to nuxt.config.ts

export default defineNuxtConfig({
  modules: ['@websideproject/nuxt-auto-api'],

  autoApi: {
    prefix: '/api',
    database: {
      client: 'better-sqlite3',
    },
  },
})

2. Create your Drizzle schema

// server/database/schema.ts
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'

export const users = sqliteTable('users', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  email: text('email').notNull().unique(),
  name: text('name'),
  role: text('role', { enum: ['user', 'admin'] }).default('user'),
  createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),
})

3. Initialize the database

// server/plugins/database.ts
import { drizzle } from 'drizzle-orm/better-sqlite3'
import Database from 'better-sqlite3'
import { initializeDatabase } from '@websideproject/nuxt-auto-api/database'
import * as schema from '../database/schema'

export default defineNitroPlugin(() => {
  const sqlite = new Database('sqlite.db')
  const db = drizzle(sqlite, { schema })

  initializeDatabase(db, 'better-sqlite3')
})

For other databases, see Database Adapters.

4. Register resources via module

// modules/base/index.ts
import { defineNuxtModule, createResolver } from '@nuxt/kit'
import { createModuleImport } from '@websideproject/nuxt-auto-api'

export default defineNuxtModule({
  meta: {
    name: 'base',
  },
  setup(_options, nuxt) {
    const resolver = createResolver(import.meta.url)

    nuxt.hook('autoApi:registerSchema', (registry) => {
      registry.register('users', {
        schema: createModuleImport(
          resolver.resolve('../../server/database/schema'),
          'users'
        ),
      })
    })
  },
})

5. Start using your API

The following endpoints are automatically generated:

GET    /api/users          # List users
GET    /api/users/:id      # Get user by ID
POST   /api/users          # Create user
PATCH  /api/users/:id      # Update user
DELETE /api/users/:id      # Delete user

Frontend Usage

Use the auto-generated composables with TanStack Query:

<script setup lang="ts">
// Fetch list of users
const { data: users, isLoading } = useAutoApiList('users', {
  filter: { role: 'admin' },
  sort: '-createdAt',
  limit: 10,
})

// Create mutation
const { mutateAsync: createUser } = useAutoApiMutation('users', 'create', {
  toast: {
    success: { title: 'User created!' },
    error: { title: 'Failed to create user' }
  }
})

// Update mutation
const { mutateAsync: updateUser } = useAutoApiMutation('users', 'update')

// Delete mutation
const { mutateAsync: deleteUser } = useAutoApiMutation('users', 'delete')

const handleCreate = async () => {
  await createUser({
    email: 'user@example.com',
    name: 'John Doe',
  })
}
</script>

For detailed frontend documentation, see the Composables Guide.

Next Steps

Need a Landing Page?

Modern landing pages with optional modules (blog, docs, forms, i18n). Let's discuss your project.

Build Your MVP

Full-stack SaaS development. Expert in database design, multi-tenancy, and scalable architecture.

Deployment Help

Dockerize your backend, set up CI/CD pipelines, deploy to Cloudflare or Hetzner. Early-stage setup.

Suggest a SaaS Tool

Missing a calculator or tool? Suggest what you'd like to see on our site.