> ## Documentation Index
> Fetch the complete documentation index at: https://formpaste.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrating from Web3Forms

> Replace your Web3Forms access key with a Formpaste key, then review redirects and spam handling before you switch.

If you already have a working Web3Forms-backed form, moving it to Formpaste is a
small change: your form already posts to the same shared `/submit` endpoint pattern
and already identifies itself with a hidden `access_key` field.

In most cases, you only need to replace your existing Web3Forms access key with the
Formpaste access key for the form you create. This guide covers that swap and the
behavioral differences worth checking before you go live.

## The core swap

A typical Web3Forms form uses the shared endpoint and includes an `access_key` in the
request body:

```html theme={null}
<form action="https://api.web3forms.com/submit" method="POST">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE">

  <input type="text" name="name" required>
  <input type="email" name="email" required>
  <textarea name="message" required></textarea>

  <input type="hidden" name="redirect" value="https://web3forms.com/success">

  <button type="submit">Submit Form</button>
</form>
```

The Formpaste equivalent keeps the same form structure, field names, and `redirect`
field. Replace the endpoint and use the access key for your Formpaste form:

```html theme={null}
<form action="https://api.formpaste.com/submit" method="POST">
  <input type="hidden" name="access_key" value="YOUR_FORMPASTE_ACCESS_KEY">

  <input type="text" name="name" required>
  <input type="email" name="email" required>
  <textarea name="message" required></textarea>

  <input type="hidden" name="redirect" value="https://your-site.com/success">

  <button type="submit">Submit Form</button>
</form>
```

Your normal fields - such as `name`, `email`, and `message` - stay exactly as they
are. Formpaste identifies the destination form through the `access_key`, rather than
reserving names for your custom fields.

Get your Formpaste `access_key` (`fp_…`) by creating a form in the
[dashboard](https://app.formpaste.com), or by asking an agent to create one with
the MCP [`create_form`](/docs/agents/create-form) tool. See [Your first form](/docs/first-form)
for the full setup walkthrough.

## If you're using Web3Forms with AJAX or fetch

The migration follows the same approach: send your existing form fields to Formpaste's
endpoint and include the Formpaste `access_key` in the request body.

```js theme={null}
const form = new FormData(e.currentTarget);

form.set("access_key", "YOUR_FORMPASTE_ACCESS_KEY");

const res = await fetch("https://api.formpaste.com/submit", {
  method: "POST",
  body: new URLSearchParams(form),
});

const data = await res.json();

if (res.ok && data.success) {
  console.log("Submission received:", data.id);
}
```

A successful Formpaste submission returns `200` with:

```json theme={null}
{
  "success": true,
  "message": "Submission received.",
  "id": "sub_..."
}
```

Check `res.ok` or `data.success` in the same place you currently handle a successful
Web3Forms response.

## Mapping the rest of your setup

| Web3Forms concept                  | Formpaste equivalent                                                                                                |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| Shared `/submit` endpoint          | Shared `/submit` endpoint at `https://api.formpaste.com/submit`                                                     |
| `access_key` request field         | `access_key` request field, using your Formpaste `fp_…` key                                                         |
| Custom form fields                 | Keep the same field names, including `name`, `email`, and `message`                                                 |
| Redirect after submit (`redirect`) | `redirect` field - see [Redirects](/docs/features/redirects); the destination must be on the form's allowed-domains list |
| Spam protection field              | `botcheck` honeypot field - see [Preventing spam](/docs/guides/preventing-spam)                                          |
| CAPTCHA                            | Not applicable - Formpaste has no CAPTCHA widget or puzzle                                                          |
| Destination email                  | [Email notifications](/docs/features/notifications) - verify each destination address once by OTP                        |
| Allowed domains                    | [Domain allowlist](/docs/features/custom-domains), configured per form in the dashboard                                  |
| Submission inbox                   | Formpaste [dashboard](https://app.formpaste.com) inbox and spam tabs                                                |
| Automations and integrations       | [Webhooks](/docs/features/webhooks) on Pro; no general REST API for forms or submissions                                 |

## Differences worth knowing before you switch

**Your field structure can stay the same.** [Web3Forms and Formpaste both](https://formpaste.com/alternatives/web3forms/) use a shared
submission endpoint plus an `access_key` field. That means the migration does not
require you to rename standard fields such as `name`, `email`, or `message`. Replace
the URL, replace the key, and keep the rest of your markup intact.

**Redirects must point to an allowed domain.** If your form currently includes a
`redirect` field, you can keep using that field with Formpaste. Update the URL to a
success page on your own site, then add the relevant domain to the form's
[domain allowlist](/docs/features/custom-domains).

**No spam puzzles.** Formpaste does not use CAPTCHA of any kind. It relies on
server-side heuristics including honeypots, timing, link density, rate, and
disposable-email checks. If you add a honeypot field, it must be named `botcheck` and
hidden with CSS using `display:none` - not `type="hidden"` - so basic bots can still
interact with it. See [Preventing spam](/docs/guides/preventing-spam).

**Suspicious submissions are quarantined.** Formpaste does not simply discard a
submission that looks suspicious. It appears in the dashboard's Spam tab, where you
can inspect it. On Free, this view is read-only; rescuing and re-delivering a false
positive is a [Pro](/docs/features/quarantine-rescue) feature.

**No general REST API.** Formpaste does not provide a REST API for creating forms or
listing submissions. Create forms through the dashboard or the MCP `create_form` tool.
Read submissions in the dashboard, through CSV export, or with the MCP
`list_submissions` tool. See [Retrieving submissions](/docs/reference/submissions-api).

**MCP support is available for agent-driven workflows.** If you are using an
MCP-capable agent, such as Claude Code or Cursor, it can create a Formpaste form and
return a ready-to-use snippet. See [MCP server](/docs/agents/mcp-server) and the
[cookbook prompts](/docs/agents/cookbook-prompts).

## After you switch

1. Change the form `action` from `https://api.web3forms.com/submit` to
   `https://api.formpaste.com/submit`.
2. Replace your Web3Forms key with the Formpaste `access_key` for the new form.
3. Keep your existing custom fields, including `name`, `email`, and `message`.
4. Review any `redirect` value and add its domain to the
   [domain allowlist](/docs/features/custom-domains).
5. Verify the destination email address through its one-time OTP.
6. Add a CSS-hidden `botcheck` honeypot if you want one, and remove any CAPTCHA
   widget or script.
7. Submit a real test and confirm it reaches both the dashboard inbox and your email.
8. Check the Spam tab occasionally after launch in case a legitimate submission is
   quarantined.

<CardGroup cols={2}>
  <Card title="Your first form" icon="inbox" href="/docs/first-form">
    Create a form, get an access key, and verify its destination email.
  </Card>

  <Card title="Framework snippets" icon="brackets-curly" href="/docs/framework-snippets">
    Formpaste examples for HTML, React, Next.js, Astro, Vue, and Svelte.
  </Card>

  <Card title="Preventing spam" icon="shield" href="/docs/guides/preventing-spam">
    Learn how Formpaste filters suspicious submissions without CAPTCHA.
  </Card>

  <Card title="Retrieving submissions" icon="database" href="/docs/reference/submissions-api">
    Use the dashboard, CSV export, or MCP tools to access submissions.
  </Card>
</CardGroup>
