# Campanhas API

> Crie campanhas, escolha as listas de contatos delas e envie ou agende o envio.

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

## Criar uma campanha — POST /campaigns

> Crie uma campanha de e-mail em rascunho com remetente, assunto e corpo HTML ou em texto, pronta para escolher as listas de contatos e enviar.

# Criar uma campanha

Cria uma campanha com o status `draft`. Requer uma chave de API com escopo `full`. Emite um evento `campaign.created`.

Uma campanha nova não tem destinatários. Escolha as listas de contatos dela com [Atualizar uma campanha](/pt/docs/api-reference/campaigns/update/) e depois [envie ou agende o envio](/pt/docs/api-reference/campaigns/send/). Os créditos são cobrados quando a campanha é enviada: 2 créditos por e-mail.

`POST /campaigns`

## Parâmetros do corpo

- `name` (string, obrigatório): Nome interno da campanha. Os destinatários não o veem. Os outros endpoints de campanhas aceitam o nome no lugar do ID, então mantenha os nomes únicos se for usá-los assim.

- `subject` (string): Linha de assunto. Aceita [tags de mesclagem](/pt/docs/campaigns/merge-tags/), como `{{first_name}}`.

- `from_email` (string): Endereço do remetente. Deve estar em um domínio de envio verificado do workspace, por exemplo `news@acme.com`.

- `from_name` (string): Nome de exibição do remetente, por exemplo `Acme`. A mensagem é enviada de `Acme <news@acme.com>`.

- `reply_to` (string): Endereço de resposta (Reply-To). Por padrão, usa `from_email` quando a campanha é enviada.

- `html` (string): Corpo HTML que o Emailit envia. Aceita as tags de mesclagem `{{first_name}}`, `{{last_name}}`, `{{email}}`, `{{unsubscribe_url}}` e `{{cf.<key>}}` para campos personalizados. Defina o corpo ao criar a campanha.

- `text` (string): Corpo em texto simples. Aceita as mesmas tags de mesclagem de `html`.

- `preview_text` (string): Texto de pré-visualização armazenado com a campanha. O Emailit não o insere na mensagem; adicione um preheader oculto a `html` se precisar de um.

- `content` (string): Fonte do corpo no editor (por exemplo, MJML), armazenada como está. O Emailit envia `html` e `text`, não `content`.

- `content_type` (string): Formato de `content`: `html`, `text` ou `mjml`. O Emailit não compila MJML; envie o HTML compilado em `html`.

## Retorno

Retorna `201 Created` com o objeto de campanha. `status` é `draft`. A resposta não devolve `html`, `text` nem `content`.

Retorna `400` se `name` estiver ausente e `403` se a chave de API não tiver o escopo `full`.

**Requisição** `POST /campaigns`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/campaigns \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "October newsletter",
    "subject": "October news for {{first_name}}",
    "from_email": "news@acme.com",
    "from_name": "Acme",
    "reply_to": "support@acme.com",
    "html": "<p>Hi {{first_name}},</p><p>Here is what changed this month.</p><p><a href=\"{{unsubscribe_url}}\">Unsubscribe</a></p>",
    "text": "Hi {{first_name}}, here is what changed this month. Unsubscribe: {{unsubscribe_url}}"
  }'
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/campaigns', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'October newsletter',
    subject: 'October news for {{first_name}}',
    from_email: 'news@acme.com',
    from_name: 'Acme',
    reply_to: 'support@acme.com',
    html: '<p>Hi {{first_name}},</p><p>Here is what changed this month.</p><p><a href="{{unsubscribe_url}}">Unsubscribe</a></p>',
    text: 'Hi {{first_name}}, here is what changed this month. Unsubscribe: {{unsubscribe_url}}',
  }),
});
const campaign = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/campaigns",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    json={
        "name": "October newsletter",
        "subject": "October news for {{first_name}}",
        "from_email": "news@acme.com",
        "from_name": "Acme",
        "reply_to": "support@acme.com",
        "html": '<p>Hi {{first_name}},</p><p>Here is what changed this month.</p><p><a href="{{unsubscribe_url}}">Unsubscribe</a></p>',
        "text": "Hi {{first_name}}, here is what changed this month. Unsubscribe: {{unsubscribe_url}}",
    },
)
campaign = r.json()
```

**PHP**

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

$response = $client->post('campaigns', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'json' => [
        'name' => 'October newsletter',
        'subject' => 'October news for {{first_name}}',
        'from_email' => 'news@acme.com',
        'from_name' => 'Acme',
        'reply_to' => 'support@acme.com',
        'html' => '<p>Hi {{first_name}},</p><p>Here is what changed this month.</p><p><a href="{{unsubscribe_url}}">Unsubscribe</a></p>',
        'text' => 'Hi {{first_name}}, here is what changed this month. Unsubscribe: {{unsubscribe_url}}',
    ],
]);
$campaign = json_decode($response->getBody(), true);
```

**201**

```json
{
  "object": "campaign",
  "id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
  "name": "October newsletter",
  "status": "draft",
  "subject": "October news for {{first_name}}",
  "from_email": "news@acme.com",
  "from_name": "Acme",
  "reply_to": "support@acme.com",
  "preview_text": null,
  "content_type": "html",
  "created_at": "2026-10-01T09:30:12.482193Z",
  "updated_at": "2026-10-01T09:30:12.482193Z"
}
```

**400**

```json
{
  "error": "Bad Request"
}
```

**403**

```json
{
  "statusCode": 403,
  "error": "Forbidden",
  "message": "Permission denied: campaigns:create"
}
```

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

## Obter uma campanha — GET /campaigns/{id}

> Obtenha uma campanha pelo ID ou pelo nome, incluindo o status, o remetente, o agendamento e as listas de contatos de destino.

# Obter uma campanha

Obtém uma campanha pelo ID ou pelo nome. Requer uma chave de API com escopo `full`.

`GET /campaigns/{id}`

## Parâmetros de caminho

- `id` (string, obrigatório): O ID da campanha (`cmp_…`) ou o nome da campanha. Codifique para URL os nomes que contêm espaços ou caracteres especiais.

## Retorno

Retorna o objeto de campanha.

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

- `id` (string): ID da campanha, com o prefixo `cmp_`.

- `status` (string): `draft`, `scheduled`, `queued`, `sending`, `sent`, `canceled` ou `archived`. `queued` significa que uma campanha agendada chegou ao horário de envio e está aguardando um worker.

- `name` (string): Nome interno da campanha.

- `subject` (string): Linha de assunto, com as tags de mesclagem não resolvidas.

- `from_email` (string): Endereço do remetente. `""` até ser definido.

- `from_name` (string): Nome de exibição do remetente. `""` até ser definido.

- `reply_to` (string): Endereço de resposta (Reply-To). `""` significa que as respostas vão para `from_email`.

- `preview_text` (string | null): Texto de pré-visualização armazenado com a campanha.

- `content_type` (string): Rótulo do formato da fonte no editor: `html`, `text` ou `mjml` para campanhas criadas pela API.

- `scheduled_at` (string | null): Quando uma campanha agendada é enviada, em UTC.

- `sent_at` (string | null): Quando o envio começou.

- `recipients` (object[]): Listas de contatos de destino da campanha. Cada item tem `audience_id` (`aud_…`) e `exclude` (`true` para uma lista excluída).

O corpo (`html`, `text` e `content`) não é incluído na resposta. As estatísticas de engajamento estão disponíveis no painel, em **Email Marketing → Campaigns**.

Retorna `404` se nenhuma campanha do workspace corresponder a `id`.

**Requisição** `GET /campaigns/{id}`

**cURL**

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

**Node.js**

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

**Python**

```python
import os, requests

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

**PHP**

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

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

**200**

```json
{
  "object": "campaign",
  "id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
  "name": "October newsletter",
  "status": "scheduled",
  "subject": "October news for {{first_name}}",
  "from_email": "news@acme.com",
  "from_name": "Acme",
  "reply_to": "support@acme.com",
  "preview_text": null,
  "content_type": "html",
  "sent_at": null,
  "scheduled_at": "2026-10-08 09:00:00+00",
  "created_at": "2026-10-01 09:30:12.482193+00",
  "updated_at": "2026-10-01 10:02:47.118204+00",
  "recipients": [
    { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV", "exclude": false },
    { "audience_id": "aud_3hRmYTSQ4ca6y9tbPI0IQPjVTL9", "exclude": true }
  ]
}
```

**404**

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

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

## Atualizar uma campanha — POST /campaigns/{id}

> Altere o nome, o remetente, o assunto ou o texto de pré-visualização de uma campanha e defina as listas de contatos para as quais ela envia ou que ela exclui.

# Atualizar uma campanha

Atualiza os campos que você passar e deixa os outros como estão. Use-o para escolher as listas de contatos da campanha antes de enviá-la. Requer uma chave de API com escopo `full`. Emite um evento `campaign.updated`.

Uma campanha agendada envia o que estiver salvo no horário de envio, então você ainda pode editá-la depois de agendar.

`POST /campaigns/{id}`

## Parâmetros de caminho

- `id` (string, obrigatório): O ID da campanha (`cmp_…`) ou o nome da campanha.

## Parâmetros do corpo

- `name` (string): Nome interno da campanha.

- `subject` (string): Linha de assunto. Aceita [tags de mesclagem](/pt/docs/campaigns/merge-tags/).

- `from_email` (string): Endereço do remetente em um domínio de envio verificado.

- `from_name` (string): Nome de exibição do remetente.

- `reply_to` (string): Endereço de resposta (Reply-To). Uma string vazia significa que as respostas vão para `from_email`.

- `preview_text` (string): Texto de pré-visualização armazenado com a campanha.

- `content` (string): Fonte do corpo no editor, armazenada como está.

- `content_type` (string): Formato de `content`: `html`, `text` ou `mjml`.

- `recipients` (object[]): As listas de contatos de destino. Substitui a relação atual. Inclua pelo menos uma lista com `exclude` definido como `false`. - `audience_id` (string, obrigatório): um ID de lista de contatos (`aud_…`) deste workspace. - `exclude` (booleano, padrão `false`): `true` salva a lista como exclusão. O painel subtrai as listas excluídas da estimativa de destinatários, mas o envio em si não aplica exclusões no momento, então remova também esses contatos das listas incluídas. IDs de listas duplicados são ignorados. No momento do envio, o Emailit envia um e-mail uma única vez a cada contato inscrito nas listas incluídas e ignora contatos descadastrados e endereços suprimidos.

O corpo HTML e o de texto são definidos quando você [cria a campanha](/pt/docs/api-reference/campaigns/create/). Campos desconhecidos no corpo são ignorados.

## Retorno

Retorna o objeto de campanha atualizado, incluindo `recipients`.

Retorna `422` se `recipients` não tiver nenhuma lista incluída ou fizer referência a uma lista de fora do workspace, e `404` se a campanha não existir.

**Requisição** `POST /campaigns/{id}`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Your October update, {{first_name}}",
    "recipients": [
      { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV" },
      { "audience_id": "aud_3hRmYTSQ4ca6y9tbPI0IQPjVTL9", "exclude": true }
    ]
  }'
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    subject: 'Your October update, {{first_name}}',
    recipients: [
      { audience_id: 'aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV' },
      { audience_id: 'aud_3hRmYTSQ4ca6y9tbPI0IQPjVTL9', exclude: true },
    ],
  }),
});
const campaign = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    json={
        "subject": "Your October update, {{first_name}}",
        "recipients": [
            {"audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV"},
            {"audience_id": "aud_3hRmYTSQ4ca6y9tbPI0IQPjVTL9", "exclude": True},
        ],
    },
)
campaign = r.json()
```

**PHP**

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

$response = $client->post('campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'json' => [
        'subject' => 'Your October update, {{first_name}}',
        'recipients' => [
            ['audience_id' => 'aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV'],
            ['audience_id' => 'aud_3hRmYTSQ4ca6y9tbPI0IQPjVTL9', 'exclude' => true],
        ],
    ],
]);
$campaign = json_decode($response->getBody(), true);
```

**200**

```json
{
  "object": "campaign",
  "id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
  "name": "October newsletter",
  "status": "draft",
  "subject": "Your October update, {{first_name}}",
  "from_email": "news@acme.com",
  "from_name": "Acme",
  "reply_to": "support@acme.com",
  "preview_text": null,
  "content_type": "html",
  "scheduled_at": null,
  "created_at": "2026-10-01 09:30:12.482193+00",
  "updated_at": "2026-10-01 10:02:47.118204+00",
  "recipients": [
    { "audience_id": "aud_3Cz7WJ9GpvD7P0PQez50xOmkZSV", "exclude": false },
    { "audience_id": "aud_3hRmYTSQ4ca6y9tbPI0IQPjVTL9", "exclude": true }
  ]
}
```

**422**

```json
{
  "message": "Validation failed.",
  "errors": {
    "recipients": ["One or more audiences are invalid."]
  }
}
```

**404**

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

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

## Listar campanhas — GET /campaigns

> Liste as campanhas de um workspace, das mais recentes para as mais antigas, com paginação por páginas, busca e filtros por status, nome e datas.

# Listar campanhas

Retorna as campanhas do workspace, das mais recentes para as mais antigas. Requer uma chave de API com escopo `full`.

`GET /campaigns`

## Parâmetros de consulta

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

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

- `search` (string): Busca sem diferenciar maiúsculas de minúsculas no nome ou no assunto da campanha.

- `status` (string): Atalho para filtrar por status: `draft`, `scheduled`, `sending` (também corresponde a `queued`), `sent`, `canceled`, `archived` ou `all`.

- `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=sent` ou `created_at.after=2026-09-01`. Consulte [Filtragem](/pt/docs/api-reference/filtering/) para ver as condições de cada tipo.

| Chave | Tipo | Observações |
| --- | --- | --- |
| `name` | string | |
| `subject` | string | |
| `status` | enum | `draft`, `scheduled`, `queued`, `sending`, `sent`, `archived` |
| `created_at` | date | |
| `sent_at` | date | |

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

## Retorno

Retorna uma página de objetos de campanha sem `reply_to`, `preview_text`, `content_type` e `recipients`. Use [Obter uma campanha](/pt/docs/api-reference/campaigns/get/) para obtê-los.

- `data` (object[]): As campanhas desta página.

- `total_records` (integer): Número de campanhas 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`, então 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 /campaigns`

**cURL**

```bash
curl -G https://api.emailit.com/v2/campaigns \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -d limit=20 \
  -d status=sent \
  -d order=sent_at \
  -d direction=desc
```

**Node.js**

```javascript
const params = new URLSearchParams({ limit: '20', status: 'sent', order: 'sent_at', direction: 'desc' });
const res = await fetch(`https://api.emailit.com/v2/campaigns?${params}`, {
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const { data, total_records } = await res.json();
```

**Python**

```python
import os, requests

r = requests.get(
    "https://api.emailit.com/v2/campaigns",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    params={"limit": 20, "status": "sent", "order": "sent_at", "direction": "desc"},
)
campaigns = r.json()["data"]
```

**PHP**

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

$response = $client->get('campaigns', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'query' => ['limit' => 20, 'status' => 'sent', 'order' => 'sent_at', 'direction' => 'desc'],
]);
$campaigns = json_decode($response->getBody(), true)['data'];
```

**200**

```json
{
  "data": [
    {
      "object": "campaign",
      "id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
      "name": "October newsletter",
      "status": "sent",
      "subject": "Your October update, {{first_name}}",
      "from_email": "news@acme.com",
      "from_name": "Acme",
      "sent_at": "2026-10-08 09:00:04+00",
      "scheduled_at": "2026-10-08 09:00:00+00",
      "created_at": "2026-10-01 09:30:12.482193+00",
      "updated_at": "2026-10-08 09:00:31+00"
    }
  ],
  "total_records": 34,
  "next_page_url": "/v2/campaigns?page=2&limit=20",
  "previous_page_url": null
}
```

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

## Enviar ou agendar uma campanha — POST /campaigns/{id}/send

> Envie uma campanha para as listas de contatos dela na hora ou agende uma campanha em rascunho para uma data e um horário futuros.

# Enviar ou agendar uma campanha

Envia a campanha agora ou a agenda quando você passa um `scheduled_at` futuro. Requer uma chave de API com escopo `full` e um [workspace verificado](/pt/docs/workspaces/production-access/): workspaces não verificados não podem enviar campanhas e recebem `403`.

Antes de enviar, confira se a campanha tem um `from_email` em um domínio verificado, um assunto, um corpo `html` ou `text` e pelo menos uma lista de contatos incluída (definida com [Atualizar uma campanha](/pt/docs/api-reference/campaigns/update/)). Cada e-mail custa 2 créditos.

`POST /campaigns/{id}/send`

## Parâmetros de caminho

- `id` (string, obrigatório): O ID da campanha (`cmp_…`) ou o nome da campanha.

## Parâmetros do corpo

- `scheduled_at` (string): Quando enviar. Aceita ISO 8601 (`2026-10-08T09:00:00Z`), um timestamp Unix em segundos ou linguagem natural em inglês, como `tomorrow at 9am` (interpretada em UTC). O horário deve estar no futuro e a campanha deve ser um `draft`. Omita-o para enviar agora. Para enviar antes uma campanha agendada, chame este endpoint sem `scheduled_at`.

## Retorno

**Enviar agora:** o status muda para `sending` e o Emailit emite `campaign.sending`. Em seguida, o Emailit cria um e-mail por destinatário: cada contato inscrito nas listas de contatos incluídas, sem duplicar endereços, excluindo contatos descadastrados e endereços suprimidos. Quando todos os destinatários tiverem sido passados ao pipeline de envio, o status muda para `sent` e o Emailit emite `campaign.sent`. Acompanhe a entrega no painel ou com os [eventos de e-mail](/pt/docs/webhooks/event-types/).

**Agendar:** o status muda para `scheduled` e o Emailit emite `campaign.scheduled`. No horário agendado, a campanha passa a `queued` (`campaign.queued`) e depois é enviada como descrito acima.

A resposta contém `object`, `id`, `name` e o novo `status`, além de `scheduled_at` quando você agenda.

| Status | Quando |
| --- | --- |
| `403` | O workspace não está verificado ou a chave de API não tem o escopo `full`. |
| `404` | Nenhuma campanha corresponde a `id`. |
| `422` | `scheduled_at` não pode ser interpretado ou não está no futuro, ou você tentou agendar uma campanha que não é um rascunho. |

**Requisição** `POST /campaigns/{id}/send`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN/send \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "scheduled_at": "2026-10-08T09:00:00Z" }'
```

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN/send', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.EMAILIT_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ scheduled_at: '2026-10-08T09:00:00Z' }),
});
const campaign = await res.json();
```

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN/send",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
    json={"scheduled_at": "2026-10-08T09:00:00Z"},
)
campaign = r.json()
```

**PHP**

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

$response = $client->post('campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN/send', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
    'json' => ['scheduled_at' => '2026-10-08T09:00:00Z'],
]);
$campaign = json_decode($response->getBody(), true);
```

**200 scheduled**

```json
{
  "object": "campaign",
  "id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
  "name": "October newsletter",
  "status": "scheduled",
  "scheduled_at": "2026-10-08T09:00:00.000000Z"
}
```

**200 sending**

```json
{
  "object": "campaign",
  "id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
  "name": "October newsletter",
  "status": "sending"
}
```

**403**

```json
{
  "code": "unverified_workspace_recipient",
  "error": "Workspace not verified",
  "message": "Unverified workspaces cannot send campaigns. You can send individual emails only to workspace members' account emails."
}
```

**422**

```json
{
  "error": "Campaign cannot be scheduled",
  "message": "Campaign status is 'sent'. Only draft campaigns can be scheduled."
}
```

---
Fonte: https://emailit.com/pt/docs/api-reference/campaigns/send/

## Cancelar uma campanha — POST /campaigns/{id}/cancel

> Cancele uma campanha em rascunho ou em envio. Os e-mails que já estão na fila de entrega não são recolhidos.

# Cancelar uma campanha

Define o status da campanha como `canceled` e emite um evento `campaign.canceled`. Requer uma chave de API com escopo `full`.

Só é possível cancelar campanhas com o status `draft` ou `sending`; qualquer outro status retorna `422`. Cancelar uma campanha em envio não recolhe os e-mails que já estão na fila de entrega.

`POST /campaigns/{id}/cancel`

## Parâmetros de caminho

- `id` (string, obrigatório): O ID da campanha (`cmp_…`) ou o nome da campanha.

## Retorno

Retorna `object`, `id`, `name` e `status` (`canceled`).

Retorna `422` se o status da campanha não for `draft` nem `sending`, e `404` se a campanha não existir.

**Requisição** `POST /campaigns/{id}/cancel`

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN/cancel \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

**Node.js**

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

**Python**

```python
import os, requests

r = requests.post(
    "https://api.emailit.com/v2/campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN/cancel",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
campaign = r.json()
```

**PHP**

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

$response = $client->post('campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN/cancel', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$campaign = json_decode($response->getBody(), true);
```

**200**

```json
{
  "object": "campaign",
  "id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
  "name": "October newsletter",
  "status": "canceled"
}
```

**422**

```json
{
  "error": "Campaign cannot be canceled",
  "message": "Campaign status is 'scheduled'. Only 'draft' or 'sending' campaigns can be canceled."
}
```

**404**

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

---
Fonte: https://emailit.com/pt/docs/api-reference/campaigns/cancel/

## Excluir uma campanha — DELETE /campaigns/{id}

> Exclua permanentemente uma campanha pelo ID ou pelo nome. Emite um evento campaign.deleted; os e-mails já enviados não são afetados.

# Excluir uma campanha

Exclui permanentemente uma campanha. Requer uma chave de API com escopo `full`. Emite um evento `campaign.deleted`.

Excluir uma campanha não afeta os e-mails que já foram enviados ou colocados na fila. Para interromper uma campanha em envio, [cancele-a](/pt/docs/api-reference/campaigns/cancel/) primeiro.

`DELETE /campaigns/{id}`

## Parâmetros de caminho

- `id` (string, obrigatório): O ID da campanha (`cmp_…`) ou o nome da campanha.

## Retorno

Retorna `object`, `id`, `name` e `deleted: true`. Retorna `404` se a campanha não existir.

**Requisição** `DELETE /campaigns/{id}`

**cURL**

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

**Node.js**

```javascript
const res = await fetch('https://api.emailit.com/v2/campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN', {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${process.env.EMAILIT_API_KEY}` },
});
const result = await res.json();
```

**Python**

```python
import os, requests

r = requests.delete(
    "https://api.emailit.com/v2/campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
    headers={"Authorization": f"Bearer {os.environ['EMAILIT_API_KEY']}"},
)
result = r.json()
```

**PHP**

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

$response = $client->delete('campaigns/cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN', [
    'headers' => ['Authorization' => 'Bearer ' . getenv('EMAILIT_API_KEY')],
]);
$result = json_decode($response->getBody(), true);
```

**200**

```json
{
  "object": "campaign",
  "id": "cmp_3zNrBaNjAoPK1l0IL2GQ3pDkubN",
  "name": "October newsletter",
  "deleted": true
}
```

**404**

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

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