Furrow Forms

Frameworks & SSGs · works with Furrow Forms

Contact forms for Nuxt sites

One composable-friendly endpoint — no server/api/contact.post.ts to babysit.

paste this into your agent

Fetch furrowforms.com/ai and set up a contact form backend for my Nuxt site.

agent-readable recipe: /forms-for/nuxt.md

prefer clicking? start in the dashboard

components/ContactForm.vue
<script setup>
const loadedAt = Date.now();
const sent = ref(false);

async function submit(e) {
  const res = await fetch('https://api.furrowforms.com/s/fp_k7m2', {
    method: 'POST',
    body: new FormData(e.target),
  });
  sent.value = (await res.json()).ok;
}
</script>

<template>
  <p v-if="sent">Thanks — we’ll be in touch.</p>
  <form v-else @submit.prevent="submit">
    <input type="text" name="_gotcha" style="display:none" tabindex="-1" />
    <input type="hidden" name="_ft" :value="loadedAt" />
    <input name="email" type="email" required />
    <textarea name="message" required></textarea>
    <button>Send</button>
  </form>
</template>

The gap

Why Nuxt sites need a form backend

Nuxt gives you three ways to deploy — static, server, edge — and a contact form should survive all of them. Writing a server/api/contact.post.ts handler ties the form to the one deployment mode that has a server, and hands you spam filtering and mail delivery as ongoing chores. Furrow Forms keeps the form in the component where it belongs: POST the FormData to your endpoint, read back { ok, id }, show your success state. Static generate, SSR, or edge — the form neither knows nor cares.

01

Deployment-mode-proof forms

nuxt generate today, edge rendering tomorrow — a form that talks to Furrow instead of a Nitro route survives every switch without a refactor.

02

The Nitro handler you don’t have to write

Validation, honeypot, captcha, rate limits, mail provider, retries: Furrow’s defaults replace the whole server/api file and its dependencies.

03

Vue-flavored ergonomics

Submit with $fetch or plain fetch, get JSON back, drive your reactive success state. Or skip JS entirely with a classic form action and redirect.

Two ways in

Set it up yourself, or don’t

Hand it to your agent

[ recommended ]

Furrow’s whole control plane is an API and MCP server. Paste this prompt into Claude Code, Cursor, or any agent — it does the rest:

paste this into your agent

Fetch furrowforms.com/ai and set up a contact form backend for my Nuxt site.
  1. 1.Registers the account over POST /api/register — you read one 6-digit email code
  2. 2.Provisions the site: client, project, and forms in one idempotent bootstrap_site call
  3. 3.Pastes the generated snippet into your codebase
  4. 4.Fires test_webhook and verifies the signed delivery

Or do it by hand

  1. 01Create a free account and a project for the site.
  2. 02Add the component; no server route, no Nitro config.
  3. 03Set domain, recipients, and thank-you or webhook settings once on the project.
  4. 04Deploy static, SSR, or edge — the form works the same in all three.

free tier: 100 subs/mo · unlimited forms · full API + MCP · pricing →

FAQ

Nuxt + Furrow Forms, answered

How do I add a contact form to a Nuxt site?

POST the form’s FormData to a Furrow Forms endpoint from your component — no server/api route needed. Furrow filters spam, stores the submission, emails your team, and returns JSON you can use for an inline success state.

Does this work with nuxt generate (full static)?

Yes — that is the ideal case. The static site has no server, and it doesn’t need one: the browser talks directly to Furrow, and CORS is honored for the domains you allow on the project.

Can I keep submissions flowing into my own tools?

Configure a webhook on the project: every delivery is HMAC-signed with a timestamp header, retried with backoff up to 8 attempts, and visible in a delivery log — verify and route into whatever your team uses.

The form backend your agent can run.

paste this into your agent

Fetch furrowforms.com/ai and set up forms for this site.

Setup for agents →