All articles
TutorialsAugust 5, 20268 min read

Add a Contact Form to Any Site with Claude in 10 Seconds

Your AI assistant can build an entire website in one session — but the contact form it writes goes nowhere without a backend. Here is the fastest working path: one curl to FormsList's instant provisioning API, paste the returned snippet, claim your dashboard from your inbox. Plus the MCP route, where Claude does all three steps itself.

VJ

Vaibhav Jain

Founder of FormsList. Building the form backend for the AI era.

You asked Claude (or v0, or Cursor, or Bolt) to build you a website, and it did — clean layout, good copy, responsive on mobile. There's just one broken promise hiding in the markup: the contact form. An AI can write flawless form HTML, but a <form> tag with nowhere to send the data is decoration. Someone fills it in, clicks Send, and the message evaporates.

Fixing that used to mean a detour: sign up for a form backend, verify your email, click around a dashboard, copy an endpoint URL, come back, paste it in. This tutorial shows the new fastest path — one unauthenticated API call that returns a live endpoint, a paste-ready snippet, and a claim link in your inbox. Then we'll cover the even lazier path: installing the FormsList MCP server so Claude does every step itself.

The problem: the AI built your site, but the form goes nowhere

A contact form needs three things HTML alone can't provide: somewhere to store the submission, something to filter the spam, and a way to notify you by email. That's a form backend — the one piece of server infrastructure almost every AI-generated site needs on day one.

Until recently, every form backend put a signup wall in front of the endpoint, which meant your agent had to stop mid-task and hand you homework: "go create an account, then paste the endpoint URL back to me." Agents faced with that wall routinely ship placeholders instead — action="#", an invented URL that 404s, or a mailto: link — and the human never finds out until a message goes missing.

FormsList's instant provisioning API removes the wall by flipping the order: the form works first, you claim it after. Whether you run the steps below yourself or paste them into a Claude conversation, the result is a working form in well under a minute.

Step 1: Provision a live endpoint with one curl

No account, no API key, no OAuth. The only thing you supply is the email address that should receive submissions (and optionally a form name):

curl -X POST https://formslist.com/api/v1/instant \
  -H "Content-Type: application/json" \
  -d '{"email": "you@example.com", "form_name": "Contact"}'

The response arrives in under a second with everything you need:

{
  "endpoint": "https://formslist.com/f/x7k2m9qa",
  "html_snippet": "<form action=\"https://formslist.com/f/x7k2m9qa\" method=\"POST\">...</form>",
  "curl_example": "curl -X POST https://formslist.com/f/x7k2m9qa -d 'name=Test&message=Hello'",
  "claim_url": "https://formslist.com/claim/9f3c...",
  "expires_at": "2026-08-12T09:00:00Z"
}
  • endpoint — live immediately. Submissions are stored, spam-filtered, and emailed to the address you gave.
  • html_snippet — a complete, ready-to-paste form wired to that endpoint.
  • curl_example — a one-liner to fire a test submission from your terminal.
  • claim_url — how the form attaches to a dashboard account. A copy is emailed to you, so you don't need to save it.
  • expires_at — unclaimed forms are deleted after 7 days. Claimed forms never expire.

If you're mid-conversation with an AI assistant, you don't even need a terminal — paste the curl into the chat and say "run this and use the result." Any agent with shell access can take it from there.

Step 2: Paste the snippet into your page

The html_snippet is a working form on its own. Unescaped, it looks like this — drop it wherever your contact section lives, or hand it to your agent to restyle with your site's classes:

<form action="https://formslist.com/f/x7k2m9qa" method="POST">
  <input type="text" name="name" placeholder="Your name" required />
  <input type="email" name="email" placeholder="Your email" required />
  <textarea name="message" placeholder="Your message" required></textarea>
  <button type="submit">Send</button>
</form>

The only line that matters is the action. Keep it, and you can rename fields, add fields, restyle everything, or submit via fetch() instead of a full-page POST — the endpoint accepts both form-encoded and AJAX submissions.

Now test it. Either fill the form in your browser or run the curl_example from Step 1. Within a few seconds the submission lands in the inbox you provided. One more trick worth knowing: open the endpoint URL in a browser (a plain GET). Instead of an error page you get self-documenting JSON describing exactly how to use that endpoint — which is how a future agent reading your codebase figures out what the URL does without asking anyone.

Step 3: Claim your dashboard from the email

While you were testing, FormsList emailed a claim link to the address from Step 1. Click it whenever you like — there's no rush beyond the 7-day expiry — and the form attaches to your FormsList dashboard, creating a free account on the spot if you don't have one.

Claiming is what upgrades the endpoint from "works" to "yours":

  • The form becomes permanent. The 7-day expiry clock stops; the endpoint URL never changes.
  • You get the dashboard. Browse every submission, see spam scores, export data, and watch analytics.
  • You can configure things. Auto-response emails, redirect URLs after submit, webhook delivery, extra notification recipients.

Why this is safe:

Ownership is anchored to the email inbox, not to whoever holds the claim URL. Submissions and the claim link only ever go to the address supplied at provisioning — an agent can set the form up for you, but it can't take it anywhere you can't follow.

That's the whole tutorial: one curl, one paste, one click in your inbox. Ten seconds of work for the agent, maybe two minutes end-to-end for you.

The zero-curl alternative: the FormsList MCP server

If you work in Claude Code, Claude Desktop, or Cursor, you can skip the manual steps entirely. FormsList ships an MCP server — formslist-mcp — that gives your agent typed tools instead of raw HTTP. The instant_provision tool needs no API key at all, so setup is one config block.

Claude Code (one command):

claude mcp add formslist -- node /path/to/formslist-mcp/dist/index.js

Claude Desktop or Cursor (in claude_desktop_config.json or .cursor/mcp.json):

{
  "mcpServers": {
    "formslist": {
      "command": "node",
      "args": ["/path/to/formslist-mcp/dist/index.js"]
    }
  }
}

Then the entire tutorial above collapses into a single prompt. Some examples that work verbatim:

  • "Add a working contact form to this site. Provision a FormsList endpoint for hello@mydomain.com and wire it into contact.html, matching the site's existing styles."
  • "This landing page needs a waitlist form. Set one up with FormsList (send submissions to me@example.com), then send a test submission to confirm it works."
  • "Replace the dead action='#' form in index.html with a real FormsList endpoint for team@startup.io."

The agent calls instant_provision, gets back the endpoint and snippet, edits your files, and tells you to check your inbox for the claim link. The server has six more tools for managing forms after you've claimed them — the full MCP guide walks through all seven.

Spam protection, limits, and what the free tier covers

Two practical notes before you ship this to a real site.

Spam protection is on by default. Every endpoint — instant or claimed — gets FormsList's filtering stack: honeypot field support (add a hidden field and bots that fill it are silently dropped), rate limiting per source, and spam scoring on each submission. You don't configure anything to get a sane baseline; you can add CAPTCHA and tune rules from the dashboard after claiming.

The free plan is genuinely enough for a small site. 5 forms and 500 submissions per month, spam filtering and email notifications included, no credit card. If a contact form on a portfolio or small-business site clears 500 real submissions a month, congratulations — and the Pro plan is $15/month when you get there. Instant provisioning itself is rate-limited per IP and per email per day, so one agent building one site sails through while bulk abuse hits a wall.

If your form is up but messages aren't reaching your inbox, that's almost never the form — see our guide to why contact form emails don't arrive for the usual suspects (spam folders, SPF/DKIM, Gmail's Promotions tab).

Ship a working form in the next 10 seconds

One POST to /api/v1/instant returns a live endpoint, a paste-ready snippet, and a claim link in your inbox. Free plan: 5 forms, 500 submissions/month, no credit card.

Start Free
No credit card 500 free submissions/mo

Frequently asked questions