> ## 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.

# Migrar desde Formspree

> Cambia el endpoint y el campo de autenticación de tu formulario existente - qué cambia, qué se traslada, y qué todavía no existe.

Si ya tienes un formulario funcional respaldado por Formspree, moverlo a
Formpaste es principalmente un cambio de dos líneas: una URL de `action`
distinta, y un campo oculto en lugar de tener el ID del endpoint
incorporado en la URL. Esta guía cubre el cambio en sí y el puñado de
diferencias de comportamiento que vale la pena conocer antes de dar el
salto, para que nada se rompa en silencio.

## El cambio central

Un formulario típico de Formspree envía directamente a un endpoint con tu
ID de formulario incrustado en la URL:

```html theme={null}
<form action="https://formspree.io/f/xxxxxxxx" method="POST">
  <input type="email" name="email" required>
  <textarea name="message" required></textarea>
  <button type="submit">Send</button>
</form>
```

El equivalente en Formpaste envía a un único endpoint compartido,
`/submit`, e identifica tu formulario mediante un campo oculto
`access_key` en el cuerpo, no mediante la URL:

```html theme={null}
<form action="https://api.formpaste.com/submit" method="POST">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY">
  <input type="email" name="email" required>
  <textarea name="message" required></textarea>
  <button type="submit">Send</button>
</form>
```

Dos cambios, nada más: la URL de `action`, y un nuevo input oculto
`access_key`. Cualquier otro campo, tu `email`, `message`, o cualquier
campo personalizado que ya tenga tu formulario, conserva su nombre y
funciona sin cambios, ya que ningún servicio reserva esos nombres.

Obtén tu `access_key` (`fp_…`) creando un formulario en el
[panel](https://app.formpaste.com) (o pidiéndole a un agente que lo haga
mediante la herramienta MCP [`create_form`](/docs/agents/create-form)),
consulta [Tu primer formulario](/docs/es/first-form) si estás empezando desde
cero.

## Si estás usando la integración AJAX/fetch de Formspree

El patrón tiene la misma forma, solo apuntando a una URL distinta y con
`access_key` en el cuerpo en lugar de en la ruta del endpoint:

```js theme={null}
const form = new FormData(e.currentTarget);
// form already has your normal fields - add the access key:
form.append("access_key", "YOUR_ACCESS_KEY");

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

La respuesta de éxito de Formpaste es un `200` con
`{"success": true, "message": "Submission received.", "id": "sub_..."}`,
verifica `res.ok` o `success` de la misma forma que verificarías la
respuesta de Formspree.

## Mapeo del resto de tu configuración

| Concepto de Formspree                     | Equivalente en Formpaste                                                                                                         |
| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| ID de endpoint en la URL (`/f/xxxxxxxx`)  | Campo `access_key` en el cuerpo de la solicitud, `/submit` es compartido                                                         |
| Notificación por correo                   | [Notificaciones por correo](/docs/es/features/notifications), verifica el destino una vez (OTP), activo por defecto después           |
| Redirección tras el envío (campo `_next`) | Campo `redirect`, consulta [Redirecciones](/docs/es/features/redirects); debe estar en la lista de dominios permitidos del formulario |
| Campo honeypot / spam                     | `botcheck`, consulta abajo, el nombre es distinto                                                                                |
| Integración reCAPTCHA / hCaptcha          | No aplica, Formpaste no tiene ningún tipo de CAPTCHA; consulta [Prevenir spam](/docs/es/guides/preventing-spam)                       |
| Dominios permitidos                       | [Lista permitida de dominios](/docs/es/features/custom-domains), configurada por formulario en el panel                               |
| Panel de envíos                           | Pestañas de inbox y spam del [panel](https://app.formpaste.com) de Formpaste                                                     |
| Zapier/integraciones                      | Solo los [webhooks](/docs/es/features/webhooks) (Pro) están construidos; consulta la sección de diferencias abajo                     |

## Diferencias que vale la pena conocer antes de cambiar

**Sin acertijos de spam.** Si tu formulario de Formspree tenía reCAPTCHA
o hCaptcha conectado, simplemente elimínalo, no busques un equivalente
que configurar. Formpaste depende completamente de heurísticas del lado
del servidor (honeypot, tiempo, densidad de enlaces, tasa, correo
desechable) que nunca le muestran un acertijo a tu visitante. Si tenías
un campo honeypot para Formspree, renómbralo a `botcheck`, ese es el
nombre específico que verifica Formpaste, y ocúltalo con CSS
(`display:none`), no con `type="hidden"`, para que los bots poco
sofisticados que se saltan los inputs ocultos igual caigan en la trampa.
Consulta [Prevenir spam](/docs/es/guides/preventing-spam).

**Los envíos sospechosos se ponen en cuarentena, no se descartan ni se
bloquean en silencio.** Un envío que se puntúa como spam sigue llegando a
un lugar donde puedes verlo, la pestaña Spam del panel, en lugar de
desaparecer. En Free esa vista es de solo lectura; reentregar un falso
positivo ("rescate") es una acción [Pro](/docs/es/features/quarantine-rescue). Si
tu filtro de spam de Formspree descartaba envíos en silencio, dedica
tiempo a revisar la pestaña de cuarentena ocasionalmente después de
migrar, por si algo legítimo necesita un empujón.

**Sin API REST para formularios o envíos.** Formpaste no tiene una API
REST general de crear-formulario/listar-envíos. Los formularios se crean
en el panel o mediante la herramienta MCP `create_form`; los envíos se
leen mediante el panel, la exportación CSV, o la herramienta MCP
`list_submissions`, consulta [Recuperar envíos](/docs/es/reference/submissions-api)
si estabas programando algo contra la superficie de API de Formspree.

**Un servidor MCP, si estás configurando esto con un agente.** Si estás
migrando un formulario con la ayuda de Claude Code, Cursor, u otro agente
que hable MCP, puede crear el formulario y devolverte directamente un
snippet ya conectado, consulta [Servidor MCP](/docs/agents/mcp-server) y los
[prompts de cookbook](/docs/agents/cookbook-prompts). Esto no es un equivalente
de Formspree; es una superficie nueva que Formpaste tiene y Formspree no.

**Los planes son más simples.** Formpaste tiene exactamente dos planes,
Free y Pro (cuatro niveles de cuota de envíos dentro de Pro), en lugar de
[la estructura multinivel de Formspree](https://formpaste.com/alternatives/formspree/).
Consulta [Plan Pro](/docs/es/features/pro-plan) si estás evaluando si tu uso
actual encaja en los 250 envíos/mes de Free.

## Después de cambiar

1. Actualiza la URL de `action` y agrega `access_key` en cada formulario
   que estés migrando.
2. Verifica el correo de destino de cada formulario (OTP único por
   dirección), consulta [Tu primer formulario](/docs/es/first-form).
3. Renombra cualquier campo honeypot a `botcheck` y confirma que esté
   oculto con CSS.
4. Elimina cualquier widget/script de CAPTCHA, no se necesita y Formpaste
   no lo leerá.
5. Establece la [lista permitida de dominios](/docs/es/features/custom-domains)
   una vez que hayas confirmado que los envíos están llegando, para que
   el formulario no quede abierto a cualquier origen indefinidamente.
6. Envía una prueba real y confirma que llega al inbox del panel y a tu
   correo.

<CardGroup cols={2}>
  <Card title="Tu primer formulario" icon="inbox" href="/docs/es/first-form">
    Recorrido completo para crear un formulario y verificar su destino.
  </Card>

  <Card title="Snippets por framework" icon="brackets-curly" href="/docs/es/framework-snippets">
    Ejemplos listos para HTML, React, Next.js, Astro, Vue, y Svelte.
  </Card>

  <Card title="Prevenir spam" icon="shield" href="/docs/es/guides/preventing-spam">
    Cómo funciona el filtrado.
  </Card>

  <Card title="Recuperar envíos" icon="database" href="/docs/es/reference/submissions-api">
    Panel, exportación CSV, y la herramienta MCP, sin API REST.
  </Card>
</CardGroup>
