# Formularios API

> Crea formularios de suscripción, publícalos y rota su token público.

URL base: `https://api.emailit.com/v2`. Autentícate con `Authorization: Bearer <API key>`.

## Crear un formulario — POST /forms

> Crea un formulario de suscripción en borrador (pop-up, página completa, flyout, integrado o banner) con una definición inicial y un token público.

# Crear un formulario

Crea un formulario de suscripción con estado `draft` y un `token` público. Requiere una clave de API con el permiso `full`. Formularios está en acceso anticipado.

Si omites `definition`, Emailit genera un formulario inicial: un paso con un título, un campo de email obligatorio y un botón **Subscribe**, además de un paso de confirmación. Crea y diseña los formularios en el panel, en **Email Marketing → Forms**, y después [publícalos](/es/docs/api-reference/forms/publish/).

`POST /forms`

## Parámetros del cuerpo

- `name` (string, obligatorio): El nombre del formulario. Los visitantes no lo ven.

- `type` (string): Cómo se muestra el formulario: `popup`, `full_page`, `flyout`, `embed` o `banner`.

- `definition` (object): El contenido del formulario, guardado tal cual. Emailit solo lo comprueba al publicarlo. Campos de primer nivel: - `version` (entero): `1`. - `type` (cadena): el tipo de formulario. - `steps` (array): cada paso tiene `id`, `name`, `kind` (`form` o `success`) y `blocks`. Los bloques tienen un `id` y un `type`: `text`, `button` (`action`: `submit`, `next`, `close` o `go_to_url`), `image` o un campo de entrada (`email`, `text_input`, `phone`, `date`, `radio`, `checkbox`, `dropdown`) con el `name` del campo, `label` y `required`. - `styles`, `targeting`, `experiments` (objetos): las reglas de apariencia y de visualización que define el editor de formularios.

- `settings` (object): Una configuración libre que se guarda con el formulario. Por defecto, `{}`.

## Devuelve

Devuelve `201 Created` con el objeto de formulario, incluidos `definition` y `settings`.

- `token` (string): El token público que usa el script de inserción para cargar el formulario. Consulta [Insertar un formulario](/es/docs/forms/install/).

- `status` (string): `draft` hasta que publicas el formulario; después, `live`.

- `published_at` (string | null): Cuándo se publicó el formulario por última vez.

Devuelve `400` si falta `name` o está vacío, o si `type` no es uno de los valores permitidos.

**Petición** `POST /forms`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/forms \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Newsletter popup", "type": "popup" }'
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/forms', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ name: 'Newsletter popup', type: 'popup' }),
});
const form = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/forms",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    json={"name": "Newsletter popup", "type": "popup"},
)
form = r.json()
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('forms', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'json' => ['name' => 'Newsletter popup', 'type' => 'popup'],
]);
$form = json_decode($response->getBody(), true);
```

**201**

```json
{
  "object": "form",
  "id": "frm_3Bzpif9xswMlVbFvGZSPNixm5j5",
  "name": "Newsletter popup",
  "type": "popup",
  "status": "draft",
  "token": "9636697db6c8f136d6742cee9c86eb3ed53b89f0a44e3ce6",
  "created_at": "2026-10-01T11:20:31.000000+00:00",
  "updated_at": "2026-10-01T11:20:31.000000+00:00",
  "published_at": null,
  "definition": {
    "version": 1,
    "type": "popup",
    "steps": [
      {
        "id": "3Rb7Lq2NcX9vZt4Wm8Kd1Hs6PyE",
        "name": "Step 1",
        "kind": "form",
        "blocks": [
          { "id": "3Rb7Lq5TgB2kVw7Nn1Ps4Fd9QzA", "type": "text", "content": "<p>Join our list</p>" },
          {
            "id": "3Rb7Lq3JfM6xYc0Rr5Hh8Gk2SeU",
            "type": "email",
            "label": "<p>Email</p>",
            "placeholder": "you@example.com",
            "required": true,
            "name": "email"
          },
          { "id": "3Rb7Lq4WdP1zQa6Ee9Jj3Lm7TfV", "type": "button", "label": "<p>Subscribe</p>", "action": "submit" }
        ]
      },
      {
        "id": "3Rb7Lq2XkS8wUe3Tt6Mn0Bv5RgC",
        "name": "Success",
        "kind": "success",
        "blocks": [
          { "id": "3Rb7Lq6YhD4cFi9Uu2Oo7Cx1WhB", "type": "text", "content": "<p>Thanks for subscribing!</p>" }
        ]
      }
    ],
    "styles": {
      "backgroundColor": "#ffffff",
      "textColor": "#0f172a",
      "primaryColor": "#03a071",
      "borderRadius": 12,
      "fontFamily": "Inter, system-ui, sans-serif",
      "buttonStyle": "solid"
    },
    "targeting": {},
    "experiments": {}
  },
  "settings": {}
}
```

**400**

```json
{
  "statusCode": 400,
  "error": "Bad Request",
  "message": "Validation error",
  "details": [
    {
      "instancePath": "",
      "schemaPath": "#/required",
      "keyword": "required",
      "params": { "missingProperty": "name" },
      "message": "must have required property 'name'"
    }
  ]
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/forms/create/

## Obtener un formulario — GET /forms/{id}

> Obtén un formulario de suscripción por su ID con su tipo, su estado, su token público, su definición completa y su configuración.

# Obtener un formulario

Obtiene un formulario con su definición completa. Requiere una clave de API con el permiso `full`.

`GET /forms/{id}`

## Parámetros de ruta

- `id` (string, obligatorio): El ID del formulario (`frm_…`).

## Devuelve

Devuelve el objeto de formulario.

- `object` (string): Siempre `form`.

- `id` (string): El ID del formulario, con el prefijo `frm_`.

- `name` (string): El nombre del formulario.

- `type` (string): `popup`, `full_page`, `flyout`, `embed` o `banner`.

- `status` (string): `draft` o `live`. Solo los formularios publicados se cargan en tu sitio.

- `token` (string): El token público que usa el script de inserción.

- `definition` (object): Los pasos, los bloques, los estilos y la segmentación. Consulta [Crear un formulario](/es/docs/api-reference/forms/create/).

- `settings` (object): La configuración libre.

- `created_at, updated_at, published_at` (string | null): Las marcas de tiempo en UTC. `published_at` es `null` hasta la primera publicación.

Devuelve `404` si el formulario no existe.

**Petición** `GET /forms/{id}`

**cURL**

```bash
curl https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5 \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5', {
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const form = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
form = r.json()
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$form = json_decode($response->getBody(), true);
```

**200**

```json
{
  "object": "form",
  "id": "frm_3Bzpif9xswMlVbFvGZSPNixm5j5",
  "name": "Newsletter popup",
  "type": "popup",
  "status": "live",
  "token": "9636697db6c8f136d6742cee9c86eb3ed53b89f0a44e3ce6",
  "created_at": "2026-10-01T11:20:31.000000+00:00",
  "updated_at": "2026-10-01T11:48:02.000000+00:00",
  "published_at": "2026-10-01T11:48:02.000000+00:00",
  "definition": {
    "version": 1,
    "type": "popup",
    "steps": [
      {
        "id": "3Rb7Lq2NcX9vZt4Wm8Kd1Hs6PyE",
        "name": "Step 1",
        "kind": "form",
        "blocks": [
          { "id": "3Rb7Lq5TgB2kVw7Nn1Ps4Fd9QzA", "type": "text", "content": "<p>Get our monthly product notes</p>" },
          {
            "id": "3Rb7Lq3JfM6xYc0Rr5Hh8Gk2SeU",
            "type": "email",
            "label": "<p>Email</p>",
            "placeholder": "you@example.com",
            "required": true,
            "name": "email"
          },
          { "id": "3Rb7Lq4WdP1zQa6Ee9Jj3Lm7TfV", "type": "button", "label": "<p>Subscribe</p>", "action": "submit" }
        ]
      },
      {
        "id": "3Rb7Lq2XkS8wUe3Tt6Mn0Bv5RgC",
        "name": "Success",
        "kind": "success",
        "blocks": [
          { "id": "3Rb7Lq6YhD4cFi9Uu2Oo7Cx1WhB", "type": "text", "content": "<p>Thanks for subscribing!</p>" }
        ]
      }
    ],
    "styles": {
      "backgroundColor": "#ffffff",
      "textColor": "#0f172a",
      "primaryColor": "#03a071",
      "borderRadius": 12,
      "fontFamily": "Inter, system-ui, sans-serif",
      "buttonStyle": "solid"
    },
    "targeting": {},
    "experiments": {}
  },
  "settings": {}
}
```

**404**

```json
{
  "error": "Form not found"
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/forms/get/

## Actualizar un formulario — POST /forms/{id}

> Cambia el nombre, el tipo, la definición o la configuración de un formulario. Los cambios en un formulario publicado aparecen en tu sitio al instante.

# Actualizar un formulario

Actualiza los campos que pasas y deja los demás sin cambios. Requiere una clave de API con el permiso `full`.

Los cambios en un formulario `live` son visibles para los visitantes de inmediato; no hace falta volver a publicarlo. Para editarlo sin afectar a los visitantes, primero [despublícalo](/es/docs/api-reference/forms/unpublish/).

`POST /forms/{id}`

## Parámetros de ruta

- `id` (string, obligatorio): El ID del formulario (`frm_…`).

## Parámetros del cuerpo

- `name` (string): El nombre nuevo. No puede estar vacío.

- `type` (string): `popup`, `full_page`, `flyout`, `embed` o `banner`. Actualiza `definition.type` para que coincida.

- `definition` (object): Sustituye toda la definición. Para su estructura, consulta [Crear un formulario](/es/docs/api-reference/forms/create/).

- `settings` (object): Sustituye el objeto de configuración.

## Devuelve

Devuelve el objeto de formulario actualizado. Devuelve `400` si un campo tiene un tipo incorrecto o `name` está vacío, y `404` si el formulario no existe.

**Petición** `POST /forms/{id}`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5 \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Newsletter popup (October)" }'
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ name: 'Newsletter popup (October)' }),
});
const form = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    json={"name": "Newsletter popup (October)"},
)
form = r.json()
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'json' => ['name' => 'Newsletter popup (October)'],
]);
$form = json_decode($response->getBody(), true);
```

**200**

```json
{
  "object": "form",
  "id": "frm_3Bzpif9xswMlVbFvGZSPNixm5j5",
  "name": "Newsletter popup (October)",
  "type": "popup",
  "status": "live",
  "token": "9636697db6c8f136d6742cee9c86eb3ed53b89f0a44e3ce6",
  "created_at": "2026-10-01T11:20:31.000000+00:00",
  "updated_at": "2026-10-02T08:05:14.000000+00:00",
  "published_at": "2026-10-01T11:48:02.000000+00:00",
  "definition": {
    "version": 1,
    "type": "popup",
    "steps": [
      {
        "id": "3Rb7Lq2NcX9vZt4Wm8Kd1Hs6PyE",
        "name": "Step 1",
        "kind": "form",
        "blocks": [
          { "id": "3Rb7Lq3JfM6xYc0Rr5Hh8Gk2SeU", "type": "email", "label": "<p>Email</p>", "required": true, "name": "email" },
          { "id": "3Rb7Lq4WdP1zQa6Ee9Jj3Lm7TfV", "type": "button", "label": "<p>Subscribe</p>", "action": "submit" }
        ]
      },
      {
        "id": "3Rb7Lq2XkS8wUe3Tt6Mn0Bv5RgC",
        "name": "Success",
        "kind": "success",
        "blocks": [{ "id": "3Rb7Lq6YhD4cFi9Uu2Oo7Cx1WhB", "type": "text", "content": "<p>Thanks for subscribing!</p>" }]
      }
    ],
    "styles": { "primaryColor": "#03a071", "borderRadius": 12, "buttonStyle": "solid" },
    "targeting": {},
    "experiments": {}
  },
  "settings": {}
}
```

**400**

```json
{
  "error": "Invalid name"
}
```

**404**

```json
{
  "error": "Form not found"
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/forms/update/

## Listar formularios — GET /forms

> Lista los formularios de suscripción de un espacio de trabajo, del más reciente al más antiguo, con paginación, búsqueda por nombre y filtros por tipo y estado.

# Listar formularios

Devuelve los formularios del espacio de trabajo, del más reciente al más antiguo, sin `definition` ni `settings`. Requiere una clave de API con el permiso `full`.

`GET /forms`

## Parámetros de consulta

- `page` (integer): El número de página, empezando por 1.

- `limit` (integer): Los formularios por página, de 1 a 100.

- `search` (string): Una búsqueda sin distinguir mayúsculas y minúsculas en una parte del nombre del formulario.

- `match`, `order`, `direction`: consulta [Filtrado](https://emailit.com/es/docs/api-reference/filtering/).

### Claves de filtro

Los filtros usan parámetros de consulta `key.condition=value`, por ejemplo `status.exact=live`. Consulta [Filtrado y ordenación](/es/docs/api-reference/filtering/).

| Clave | Tipo | Notas |
| --- | --- | --- |
| `name` | string | |
| `type` | enum | `popup`, `full_page`, `flyout`, `embed`, `banner` |
| `status` | enum | `draft`, `live` |
| `created_at` | date | |

Claves de orden para `order`: `name`, `type`, `status`, `created_at`.

## Devuelve

- `data` (object[]): Los formularios de esta página: `object`, `id`, `name`, `type`, `status`, `token`, `created_at`, `updated_at`, `published_at`.

- `total_records` (integer): El número de formularios que coinciden con la consulta.

- `next_page_url` (string | null): La ruta de la página siguiente, o `null` en la última página. Solo incluye `page` y `limit`; vuelve a añadir tu búsqueda y tus filtros cuando la sigas.

- `previous_page_url` (string | null): La ruta de la página anterior, o `null` en la primera página.

**Petición** `GET /forms`

**cURL**

```bash
curl -G https://api.emailit.com/v2/forms \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -d status.exact=live
```

**Node.js**

```javascript
const params = new URLSearchParams({ 'status.exact': 'live' });
const res = await fetch(`https://api.emailit.com/v2/forms?${params}`, {
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data: forms } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/forms",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    params={"status.exact": "live"},
)
forms = r.json()["data"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->get('forms', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'query' => ['status.exact' => 'live'],
]);
$forms = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": [
    {
      "object": "form",
      "id": "frm_3Bzpif9xswMlVbFvGZSPNixm5j5",
      "name": "Newsletter popup",
      "type": "popup",
      "status": "live",
      "token": "9636697db6c8f136d6742cee9c86eb3ed53b89f0a44e3ce6",
      "created_at": "2026-10-01T11:20:31.000000+00:00",
      "updated_at": "2026-10-01T11:48:02.000000+00:00",
      "published_at": "2026-10-01T11:48:02.000000+00:00"
    }
  ],
  "total_records": 1,
  "next_page_url": null,
  "previous_page_url": null
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/forms/list/

## Publicar un formulario — POST /forms/{id}/publish

> Publica un formulario de suscripción para que el script de inserción lo muestre en tu sitio. El formulario necesita un paso de formulario y un paso de confirmación.

# Publicar un formulario

Cambia el estado del formulario a `live` y actualiza `published_at`. Los formularios publicados se cargan en cualquier sitio donde esté [insertado](/es/docs/forms/install/) el script de Emailit y pueden recibir respuestas. Requiere una clave de API con el permiso `full`.

La definición necesita al menos un paso con `kind: "form"` y otro con `kind: "success"`; si no, la petición devuelve `422`. Las respuestas se guardan con el formulario y, por ahora, no crean contactos.

`POST /forms/{id}/publish`

## Parámetros de ruta

- `id` (string, obligatorio): El ID del formulario (`frm_…`).

## Devuelve

Devuelve el objeto de formulario con `status` en `live`. Devuelve `422` si la definición está incompleta y `404` si el formulario no existe.

**Petición** `POST /forms/{id}/publish`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/publish \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/publish', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const form = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/publish",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
form = r.json()
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/publish', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$form = json_decode($response->getBody(), true);
```

**200**

```json
{
  "object": "form",
  "id": "frm_3Bzpif9xswMlVbFvGZSPNixm5j5",
  "name": "Newsletter popup",
  "type": "popup",
  "status": "live",
  "token": "9636697db6c8f136d6742cee9c86eb3ed53b89f0a44e3ce6",
  "created_at": "2026-10-01T11:20:31.000000+00:00",
  "updated_at": "2026-10-01T11:48:02.000000+00:00",
  "published_at": "2026-10-01T11:48:02.000000+00:00",
  "definition": {
    "version": 1,
    "type": "popup",
    "steps": [
      {
        "id": "3Rb7Lq2NcX9vZt4Wm8Kd1Hs6PyE",
        "name": "Step 1",
        "kind": "form",
        "blocks": [
          { "id": "3Rb7Lq3JfM6xYc0Rr5Hh8Gk2SeU", "type": "email", "label": "<p>Email</p>", "required": true, "name": "email" },
          { "id": "3Rb7Lq4WdP1zQa6Ee9Jj3Lm7TfV", "type": "button", "label": "<p>Subscribe</p>", "action": "submit" }
        ]
      },
      {
        "id": "3Rb7Lq2XkS8wUe3Tt6Mn0Bv5RgC",
        "name": "Success",
        "kind": "success",
        "blocks": [{ "id": "3Rb7Lq6YhD4cFi9Uu2Oo7Cx1WhB", "type": "text", "content": "<p>Thanks for subscribing!</p>" }]
      }
    ],
    "styles": { "primaryColor": "#03a071", "borderRadius": 12, "buttonStyle": "solid" },
    "targeting": {},
    "experiments": {}
  },
  "settings": {}
}
```

**422**

```json
{
  "error": "Form must have a success step"
}
```

**404**

```json
{
  "error": "Form not found"
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/forms/publish/

## Despublicar un formulario — POST /forms/{id}/unpublish

> Retira un formulario de suscripción publicado devolviéndolo a borrador. El script de inserción deja de mostrarlo y deja de recibir respuestas.

# Despublicar un formulario

Devuelve el estado del formulario a `draft`. El script de inserción deja de cargarlo y las nuevas respuestas se rechazan. El token, la definición y `published_at` no cambian, así que puedes volver a [publicarlo](/es/docs/api-reference/forms/publish/) más adelante. Requiere una clave de API con el permiso `full`.

`POST /forms/{id}/unpublish`

## Parámetros de ruta

- `id` (string, obligatorio): El ID del formulario (`frm_…`).

## Devuelve

Devuelve el objeto de formulario con `status` en `draft`. Devuelve `404` si el formulario no existe.

**Petición** `POST /forms/{id}/unpublish`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/unpublish \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/unpublish', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const form = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/unpublish",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
form = r.json()
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/unpublish', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$form = json_decode($response->getBody(), true);
```

**200**

```json
{
  "object": "form",
  "id": "frm_3Bzpif9xswMlVbFvGZSPNixm5j5",
  "name": "Newsletter popup",
  "type": "popup",
  "status": "draft",
  "token": "9636697db6c8f136d6742cee9c86eb3ed53b89f0a44e3ce6",
  "created_at": "2026-10-01T11:20:31.000000+00:00",
  "updated_at": "2026-10-06T07:30:00.000000+00:00",
  "published_at": "2026-10-01T11:48:02.000000+00:00",
  "definition": {
    "version": 1,
    "type": "popup",
    "steps": [
      {
        "id": "3Rb7Lq2NcX9vZt4Wm8Kd1Hs6PyE",
        "name": "Step 1",
        "kind": "form",
        "blocks": [
          { "id": "3Rb7Lq3JfM6xYc0Rr5Hh8Gk2SeU", "type": "email", "label": "<p>Email</p>", "required": true, "name": "email" },
          { "id": "3Rb7Lq4WdP1zQa6Ee9Jj3Lm7TfV", "type": "button", "label": "<p>Subscribe</p>", "action": "submit" }
        ]
      },
      {
        "id": "3Rb7Lq2XkS8wUe3Tt6Mn0Bv5RgC",
        "name": "Success",
        "kind": "success",
        "blocks": [{ "id": "3Rb7Lq6YhD4cFi9Uu2Oo7Cx1WhB", "type": "text", "content": "<p>Thanks for subscribing!</p>" }]
      }
    ],
    "styles": { "primaryColor": "#03a071", "borderRadius": 12, "buttonStyle": "solid" },
    "targeting": {},
    "experiments": {}
  },
  "settings": {}
}
```

**404**

```json
{
  "error": "Form not found"
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/forms/unpublish/

## Restablecer el token público — POST /forms/{id}/reset-token

> Sustituye el token público de un formulario. Los códigos de inserción que usan el token anterior dejan de cargar el formulario de inmediato.

# Restablecer el token público

Genera un nuevo `token` público para el formulario. El token anterior deja de funcionar de inmediato: los sitios que cargan el formulario con él ya no lo muestran y no pueden enviarle respuestas. Actualiza tu código de inserción con el nuevo token. Requiere una clave de API con el permiso `full`.

`POST /forms/{id}/reset-token`

## Parámetros de ruta

- `id` (string, obligatorio): El ID del formulario (`frm_…`).

## Devuelve

Devuelve el objeto de formulario con el nuevo `token`. El estado no cambia. Devuelve `404` si el formulario no existe.

**Petición** `POST /forms/{id}/reset-token`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/reset-token \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/reset-token', {
  method: 'POST',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { token } = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/reset-token",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
token = r.json()["token"]
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->post('forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5/reset-token', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$token = json_decode($response->getBody(), true)['token'];
```

**200**

```json
{
  "object": "form",
  "id": "frm_3Bzpif9xswMlVbFvGZSPNixm5j5",
  "name": "Newsletter popup",
  "type": "popup",
  "status": "live",
  "token": "e5ed3f9ec299ae1c5dc043c45f2a616c352e47a13b6b763b",
  "created_at": "2026-10-01T11:20:31.000000+00:00",
  "updated_at": "2026-10-06T09:12:44.000000+00:00",
  "published_at": "2026-10-01T11:48:02.000000+00:00",
  "definition": {
    "version": 1,
    "type": "popup",
    "steps": [
      {
        "id": "3Rb7Lq2NcX9vZt4Wm8Kd1Hs6PyE",
        "name": "Step 1",
        "kind": "form",
        "blocks": [
          { "id": "3Rb7Lq3JfM6xYc0Rr5Hh8Gk2SeU", "type": "email", "label": "<p>Email</p>", "required": true, "name": "email" },
          { "id": "3Rb7Lq4WdP1zQa6Ee9Jj3Lm7TfV", "type": "button", "label": "<p>Subscribe</p>", "action": "submit" }
        ]
      },
      {
        "id": "3Rb7Lq2XkS8wUe3Tt6Mn0Bv5RgC",
        "name": "Success",
        "kind": "success",
        "blocks": [{ "id": "3Rb7Lq6YhD4cFi9Uu2Oo7Cx1WhB", "type": "text", "content": "<p>Thanks for subscribing!</p>" }]
      }
    ],
    "styles": { "primaryColor": "#03a071", "borderRadius": 12, "buttonStyle": "solid" },
    "targeting": {},
    "experiments": {}
  },
  "settings": {}
}
```

**404**

```json
{
  "error": "Form not found"
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/forms/reset-token/

## Eliminar un formulario — DELETE /forms/{id}

> Elimina de forma permanente un formulario de suscripción junto con todas sus respuestas guardadas. Devuelve 204 sin cuerpo.

# Eliminar un formulario

Elimina de forma permanente un formulario y todas sus respuestas guardadas. Los sitios que lo insertan dejan de mostrarlo. Requiere una clave de API con el permiso `full`.

`DELETE /forms/{id}`

## Parámetros de ruta

- `id` (string, obligatorio): El ID del formulario (`frm_…`).

## Devuelve

Devuelve `204 No Content` con el cuerpo vacío. Devuelve `404` si el formulario no existe.

**Petición** `DELETE /forms/{id}`

**cURL**

```bash
curl -X DELETE https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5 \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
console.log(res.status); // 204
```

**Python**

```python
import os, requests

r = requests.delete(
    "https://api.emailit.com/v2/forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
print(r.status_code)  # 204
```

**PHP**

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.emailit.com/v2/']);

$response = $client->delete('forms/frm_3Bzpif9xswMlVbFvGZSPNixm5j5', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
echo $response->getStatusCode(); // 204
```

**204**

```text
(empty body)
```

**404**

```json
{
  "error": "Form not found"
}
```

---
Fuente: https://emailit.com/es/docs/api-reference/forms/delete/
