# Formulários API

> Crie formulários de inscrição, publique-os e faça a rotação do token público.

URL base: `https://api.emailit.com/v2`. Autentique-se com `Authorization: Bearer <API key>`.

## Criar um formulário — POST /forms

> Crie um formulário de inscrição em rascunho (pop-up, página inteira, slide-in, incorporado ou banner) com uma definição inicial e um token público.

# Criar um formulário

Cria um formulário de inscrição com status `draft` e um `token` público. Requer uma chave de API com escopo `full`. Os formulários estão em acesso antecipado.

Se você omitir `definition`, o Emailit gera um formulário inicial: uma etapa com um título, um campo de e-mail obrigatório e um botão **Subscribe**, além de uma etapa de sucesso. Monte e estilize formulários no painel, em **Email Marketing → Forms**, e depois [publique-os](/pt/docs/api-reference/forms/publish/).

`POST /forms`

## Parâmetros do corpo

- `name` (string, obrigatório): Nome do formulário. Os visitantes não o veem.

- `type` (string): Como o formulário aparece: `popup`, `full_page`, `flyout`, `embed` ou `banner`.

- `definition` (object): O conteúdo do formulário, armazenado como está. O Emailit só o verifica quando você publica. Campos de nível superior: - `version` (integer): `1`. - `type` (string): o tipo do formulário. - `steps` (array): cada etapa tem `id`, `name`, `kind` (`form` ou `success`) e `blocks`. Os blocos têm um `id` e um `type`: `text`, `button` (`action`: `submit`, `next`, `close` ou `go_to_url`), `image` ou um campo de entrada (`email`, `text_input`, `phone`, `date`, `radio`, `checkbox`, `dropdown`) com `name`, `label` e `required` do campo. - `styles`, `targeting`, `experiments` (objects): regras de aparência e de exibição definidas pelo editor de formulários.

- `settings` (object): Configurações livres armazenadas com o formulário. O padrão é `{}`.

## Retorno

Retorna `201 Created` com o objeto do formulário, incluindo `definition` e `settings`.

- `token` (string): Token público que o script de incorporação usa para carregar o formulário. Consulte [Instalar um formulário](/pt/docs/forms/install/).

- `status` (string): `draft` até você publicar o formulário; depois, `live`.

- `published_at` (string | null): Quando o formulário foi publicado pela última vez.

Retorna `400` se `name` estiver ausente ou vazio, ou se `type` não for um dos valores permitidos.

**Requisição** `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'"
    }
  ]
}
```

---
Fonte: https://emailit.com/pt/docs/api-reference/forms/create/

## Obter um formulário — GET /forms/{id}

> Obtenha um formulário de inscrição pelo ID, com tipo, status, token público, definição completa e configurações.

# Obter um formulário

Obtém um formulário com a definição completa. Requer uma chave de API com escopo `full`.

`GET /forms/{id}`

## Parâmetros de caminho

- `id` (string, obrigatório): O ID do formulário (`frm_…`).

## Retorno

Retorna o objeto do formulário.

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

- `id` (string): ID do formulário, com o prefixo `frm_`.

- `name` (string): Nome do formulário.

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

- `status` (string): `draft` ou `live`. Apenas os formulários publicados são carregados no seu site.

- `token` (string): Token público usado pelo script de incorporação.

- `definition` (object): Etapas, blocos, estilos e segmentação. Consulte [Criar um formulário](/pt/docs/api-reference/forms/create/).

- `settings` (object): Configurações livres.

- `created_at, updated_at, published_at` (string | null): Timestamps em UTC. `published_at` é `null` até a primeira publicação.

Retorna `404` se o formulário não existir.

**Requisição** `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"
}
```

---
Fonte: https://emailit.com/pt/docs/api-reference/forms/get/

## Atualizar um formulário — POST /forms/{id}

> Altere o nome, o tipo, a definição ou as configurações de um formulário. As alterações em um formulário publicado aparecem no seu site na hora.

# Atualizar um formulário

Atualiza os campos que você passar e mantém os outros inalterados. Requer uma chave de API com escopo `full`.

As alterações em um formulário `live` ficam visíveis para os visitantes imediatamente; não é preciso publicar de novo. Para editar sem afetar os visitantes, [despublique-o](/pt/docs/api-reference/forms/unpublish/) primeiro.

`POST /forms/{id}`

## Parâmetros de caminho

- `id` (string, obrigatório): O ID do formulário (`frm_…`).

## Parâmetros do corpo

- `name` (string): Novo nome. Não pode ficar vazio.

- `type` (string): `popup`, `full_page`, `flyout`, `embed` ou `banner`. Atualize `definition.type` para corresponder.

- `definition` (object): Substitui a definição inteira. Consulte [Criar um formulário](/pt/docs/api-reference/forms/create/) para ver a estrutura dela.

- `settings` (object): Substitui o objeto de configurações.

## Retorno

Retorna o objeto do formulário atualizado. Retorna `400` se um campo tiver o tipo errado ou se `name` estiver vazio, e `404` se o formulário não existir.

**Requisição** `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"
}
```

---
Fonte: https://emailit.com/pt/docs/api-reference/forms/update/

## Listar formulários — GET /forms

> Liste os formulários de inscrição de um workspace, dos mais recentes para os mais antigos, com paginação, busca por nome e filtros por tipo e status.

# Listar formulários

Retorna os formulários do workspace, dos mais recentes para os mais antigos, sem `definition` e `settings`. Requer uma chave de API com escopo `full`.

`GET /forms`

## Parâmetros de consulta

- `page` (integer): Número da página, a partir de 1.

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

- `search` (string): Busca sem diferenciar maiúsculas de minúsculas em parte do nome do formulário.

- `match`, `order`, `direction`: consulte [Filtragem](https://emailit.com/pt/docs/api-reference/filtering/).

### Chaves de filtro

Os filtros usam parâmetros de consulta `key.condition=value`, por exemplo, `status.exact=live`. Consulte [Filtragem](/pt/docs/api-reference/filtering/).

| Chave | Tipo | Observações |
| --- | --- | --- |
| `name` | string | |
| `type` | enum | `popup`, `full_page`, `flyout`, `embed`, `banner` |
| `status` | enum | `draft`, `live` |
| `created_at` | date | |

Chaves de ordenação para `order`: `name`, `type`, `status`, `created_at`.

## Retorno

- `data` (object[]): Os formulários desta página: `object`, `id`, `name`, `type`, `status`, `token`, `created_at`, `updated_at`, `published_at`.

- `total_records` (integer): Número de formulários que correspondem à consulta.

- `next_page_url` (string | null): Caminho da próxima página, ou `null` na última página. Ele leva apenas `page` e `limit`; adicione de novo a sua busca e os seus filtros ao segui-lo.

- `previous_page_url` (string | null): Caminho da página anterior, ou `null` na primeira página.

**Requisição** `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
}
```

---
Fonte: https://emailit.com/pt/docs/api-reference/forms/list/

## Publicar um formulário — POST /forms/{id}/publish

> Coloque um formulário de inscrição no ar para que o script de incorporação o exiba no seu site. O formulário precisa de uma etapa de formulário e de uma etapa de sucesso.

# Publicar um formulário

Define o status do formulário como `live` e atualiza `published_at`. Os formulários publicados são carregados em qualquer site em que o script do Emailit esteja [instalado](/pt/docs/forms/install/) e podem receber respostas. Requer uma chave de API com escopo `full`.

A definição precisa de pelo menos uma etapa com `kind: "form"` e uma com `kind: "success"`; caso contrário, a requisição retorna `422`. As respostas ficam armazenadas com o formulário e ainda não criam contatos.

`POST /forms/{id}/publish`

## Parâmetros de caminho

- `id` (string, obrigatório): O ID do formulário (`frm_…`).

## Retorno

Retorna o objeto do formulário com `status` definido como `live`. Retorna `422` se a definição estiver incompleta e `404` se o formulário não existir.

**Requisição** `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"
}
```

---
Fonte: https://emailit.com/pt/docs/api-reference/forms/publish/

## Despublicar um formulário — POST /forms/{id}/unpublish

> Tire do ar um formulário de inscrição publicado, voltando-o para rascunho. O script de incorporação deixa de exibi-lo e as respostas param.

# Despublicar um formulário

Volta o status do formulário para `draft`. O script de incorporação deixa de carregá-lo e novas respostas são rejeitadas. O token, a definição e `published_at` continuam iguais, então você pode [publicá-lo](/pt/docs/api-reference/forms/publish/) de novo mais tarde. Requer uma chave de API com escopo `full`.

`POST /forms/{id}/unpublish`

## Parâmetros de caminho

- `id` (string, obrigatório): O ID do formulário (`frm_…`).

## Retorno

Retorna o objeto do formulário com `status` definido como `draft`. Retorna `404` se o formulário não existir.

**Requisição** `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"
}
```

---
Fonte: https://emailit.com/pt/docs/api-reference/forms/unpublish/

## Redefinir o token público — POST /forms/{id}/reset-token

> Substitua o token público de um formulário. Os códigos de incorporação que usam o token antigo deixam de carregar o formulário imediatamente.

# Redefinir o token público

Gera um novo `token` público para o formulário. O token antigo deixa de funcionar imediatamente: os sites que carregam o formulário com ele não o exibem mais e não conseguem enviar respostas para ele. Atualize o seu código de incorporação com o novo token. Requer uma chave de API com escopo `full`.

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

## Parâmetros de caminho

- `id` (string, obrigatório): O ID do formulário (`frm_…`).

## Retorno

Retorna o objeto do formulário com o novo `token`. O status não muda. Retorna `404` se o formulário não existir.

**Requisição** `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"
}
```

---
Fonte: https://emailit.com/pt/docs/api-reference/forms/reset-token/

## Excluir um formulário — DELETE /forms/{id}

> Exclua permanentemente um formulário de inscrição junto com todas as respostas armazenadas. Retorna 204 sem corpo.

# Excluir um formulário

Exclui permanentemente um formulário e todas as respostas armazenadas dele. Os sites que o incorporam deixam de exibi-lo. Requer uma chave de API com escopo `full`.

`DELETE /forms/{id}`

## Parâmetros de caminho

- `id` (string, obrigatório): O ID do formulário (`frm_…`).

## Retorno

Retorna `204 No Content` com o corpo vazio. Retorna `404` se o formulário não existir.

**Requisição** `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"
}
```

---
Fonte: https://emailit.com/pt/docs/api-reference/forms/delete/
