Contact forms for Nuxt

Add a contact form to your Nuxt 3 app with no server route and no backend of your own. It is a Vue component that posts to Formpaste, so there is no server/api handler to write. Preview it live, copy the code, and submissions land in your inbox - spam filtered.

How to create a Nuxt form

  1. 1

    Create a form in your Formpaste dashboard and copy its access key.

  2. 2

    Copy the Vue component above into a Nuxt page or component.

  3. 3

    Replace YOUR_ACCESS_KEY_HERE with your access key, then deploy.

Prompt for your AI coding agent

Add a Formpaste contact form to my Nuxt 3 app. Use a Vue component with <script setup>, v-model, and an @submit.prevent handler that POSTs as application/x-www-form-urlencoded (URLSearchParams) to https://api.formpaste.com/submit with a hidden access_key input. Do not add a server/api route.

Or connect the Formpaste MCP server to Claude Code, Codex, Cursor, Claude Desktop, VS Code, or any mcp-remote client. See the setup guide.

No server route needed

Nuxt gives you a server/api/ directory, but a contact form does not need it. The form is a Vue component with @submit.prevent that posts straight to the Formpaste endpoint, so there is no Nitro handler to write and nothing server-side of yours to maintain. It works with SSR or a fully static nuxi generate build.

It is just a Vue component

Nuxt is Vue, so the form is a single-file component with v-model and a submit handler - the same code you would use in a plain Vue app. Copy the Vue version from the toggle above and drop it into a page or component.

Pinia only if you want it

For a single-page form, local component state is all you need. If you build a multi-step form that spans routes, a Pinia store can hold the step state - but the final step still posts once to Formpaste either way.

How it works

Three simple steps for form submissions to land in your email inbox.
Create your form, set your form's action URL to Formpaste's endpoint, and add your access key.

1

Create your form

Sign up, verify your email, and create an access key in your dashboard.

2

Copy the code

Paste the snippet above into your project. Pick CSS or Tailwind to match your site.

<script setup lang="ts">
import { ref } from "vue";

const status = ref<"idle" | "sending" | "ok" | "error">("idle");

async function onSubmit(e: Event) {
  status.value = "sending";
  const form = new FormData(e.target as HTMLFormElement);
  const res = await fetch("https://api.formpaste.com/submit", { method: "POST", body: new URLSearchParams(form as any) });
  status.value = res.ok ? "ok" : "error";
}
</script>

<template>
  <p v-if="status === 'ok'">Thanks - your message was sent.</p>
  <form v-else @submit.prevent="onSubmit" class="mx-auto flex w-full max-w-md flex-col gap-4 rounded-xl border border-gray-200 bg-white p-6 shadow-sm dark:border-gray-800 dark:bg-gray-950">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE">
  <label class="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Name
    <input type="text" name="name" placeholder="Your name" required class="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
  <label class="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Email
    <input type="email" name="email" placeholder="you@example.com" required class="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
  <label class="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Message
    <textarea name="message" required class="min-h-28 rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100"></textarea>
  </label>
    <button type="submit" class="w-full rounded-md bg-gray-900 px-4 py-2 text-sm font-medium text-white shadow-sm transition-colors hover:bg-gray-800 disabled:opacity-60 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-200" :disabled="status === 'sending'">Send</button>
    <p v-if="status === 'error'">Something went wrong. Please try again.</p>
  </form>
</template>
3

Add your access key

Replace the placeholder with your access key to start receiving submissions.

<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE">

Contact forms for Nuxt FAQ

Paste a form. Get submissions.

Instantly without setting up any backend, servers or databases. 250 submissions/mo free - no credit card.

What you get with Formpaste

No server, no DNS

Point your form at Formpaste - no backend, no DNS, no email server to run.

Spam filtered automatically

Heuristics + a quarantine folder you control. Real messages always get through.

Quarantine you control

Suspicious submissions land in a folder you review - nothing silently dropped.

Built for AI agents

An MCP server your coding agent calls to create a form and wire it up.

Copy-paste components

Accessible, copy-paste form code for HTML, React, TypeScript, JavaScript, and Astro.

Simple dashboard

Manage forms, inbox, quarantine, and delivery from one place.

More Nuxt forms

Other platforms