# Kampaně API

> Vytvářejte kampaně, vybírejte pro ně seznamy kontaktů a kampaně odešlete hned, nebo je naplánujte.

Základní URL: `https://api.emailit.com/v2`. Autentizujte se hlavičkou `Authorization: Bearer <API key>`.

## Vytvoření kampaně — POST /campaigns

> Vytvořte koncept e-mailové kampaně s odesílatelem, předmětem a tělem v HTML nebo prostém textu, připravený k výběru seznamů kontaktů a odeslání.

# Vytvoření kampaně

Vytvoří kampaň ve stavu `draft`. Vyžaduje API klíč s oprávněním `full`. Vyvolá událost `campaign.created`.

Nová kampaň nemá žádné příjemce. Seznamy kontaktů pro ni vyberte endpointem [Úprava kampaně](/cs/docs/api-reference/campaigns/update/) a potom ji [odešlete nebo naplánujte](/cs/docs/api-reference/campaigns/send/). Kredity se účtují při odeslání kampaně: 2 kredity za e-mail.

`POST /campaigns`

## Parametry v těle požadavku

- `name` (string, povinné): Interní název kampaně. Příjemci ho nevidí. Ostatní endpointy kampaní přijímají místo ID i název, takže pokud je tak používáte, dbejte, aby názvy byly jedinečné.

- `subject` (string): Předmět. Podporuje [slučovací značky](/cs/docs/campaigns/merge-tags/), například `{{first_name}}`.

- `from_email` (string): Adresa odesílatele. Musí být na ověřené odesílací doméně ve workspace, například `news@acme.com`.

- `from_name` (string): Zobrazované jméno odesílatele, například `Acme`. Zpráva se odešle od `Acme <news@acme.com>`.

- `reply_to` (string): Adresa pro odpověď. Pokud ji nenastavíte, použije se při odeslání kampaně `from_email`.

- `html` (string): Tělo v HTML, které Emailit odešle. Podporuje slučovací značky `{{first_name}}`, `{{last_name}}`, `{{email}}`, `{{unsubscribe_url}}` a `{{cf.<key>}}` pro vlastní pole. Tělo nastavte při vytváření kampaně.

- `text` (string): Tělo v prostém textu. Podporuje stejné slučovací značky jako `html`.

- `preview_text` (string): Text náhledu uložený s kampaní. Emailit ho do zprávy nevkládá; pokud ho potřebujete, přidejte do `html` skrytý preheader.

- `content` (string): Zdroj těla z editoru (například MJML), uložený beze změny. Emailit odesílá `html` a `text`, ne `content`.

- `content_type` (string): Formát `content`: `html`, `text` nebo `mjml`. Emailit MJML nekompiluje; zkompilované HTML pošlete v `html`.

## Odpověď

Vrací `201 Created` s objektem kampaně. `status` je `draft`. Odpověď nevrací `html`, `text` ani `content`.

Pokud chybí `name`, vrací `400`, a pokud API klíč nemá oprávnění `full`, vrací `403`.

**Požadavek** `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"
}
```

---
Zdroj: https://emailit.com/cs/docs/api-reference/campaigns/create/

## Načtení kampaně — GET /campaigns/{id}

> Načtěte kampaň podle ID nebo názvu, včetně jejího stavu, odesílatele, plánu odeslání a seznamů kontaktů, na které cílí.

# Načtení kampaně

Načte kampaň podle jejího ID nebo názvu. Vyžaduje API klíč s oprávněním `full`.

`GET /campaigns/{id}`

## Parametry v cestě

- `id` (string, povinné): ID kampaně (`cmp_…`), nebo název kampaně. Názvy s mezerami nebo speciálními znaky zakódujte pro URL.

## Odpověď

Vrací objekt kampaně.

- `object` (string): Vždy `campaign`.

- `id` (string): ID kampaně s předponou `cmp_`.

- `status` (string): `draft`, `scheduled`, `queued`, `sending`, `sent`, `canceled` nebo `archived`. `queued` znamená, že naplánovaná kampaň dosáhla času odeslání a čeká na volný odesílací proces.

- `name` (string): Interní název kampaně.

- `subject` (string): Předmět s nevyhodnocenými slučovacími značkami.

- `from_email` (string): Adresa odesílatele. `""`, dokud není nastavená.

- `from_name` (string): Zobrazované jméno odesílatele. `""`, dokud není nastavené.

- `reply_to` (string): Adresa pro odpověď. `""` znamená, že odpovědi chodí na `from_email`.

- `preview_text` (string | null): Text náhledu uložený s kampaní.

- `content_type` (string): Označení formátu zdroje z editoru: u kampaní vytvořených přes API `html`, `text` nebo `mjml`.

- `scheduled_at` (string | null): Kdy se naplánovaná kampaň odešle, v UTC.

- `sent_at` (string | null): Kdy začalo odesílání.

- `recipients` (object[]): Seznamy kontaktů, na které kampaň cílí. Každá položka má `audience_id` (`aud_…`) a `exclude` (`true` u vyloučeného seznamu).

Tělo (`html`, `text` a `content`) odpověď neobsahuje. Statistiky zapojení najdete ve webovém rozhraní v sekci **Email Marketing → Campaigns**.

Pokud parametru `id` neodpovídá žádná kampaň ve workspace, vrací `404`.

**Požadavek** `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"
}
```

---
Zdroj: https://emailit.com/cs/docs/api-reference/campaigns/get/

## Úprava kampaně — POST /campaigns/{id}

> Změňte název, odesílatele, předmět nebo text náhledu kampaně a nastavte seznamy kontaktů, kterým se odešle, nebo které se vyloučí.

# Úprava kampaně

Upraví pole, která předáte, a ostatní ponechá beze změny. Použijte ho k výběru seznamů kontaktů kampaně před odesláním. Vyžaduje API klíč s oprávněním `full`. Vyvolá událost `campaign.updated`.

Naplánovaná kampaň odešle to, co je v čase odeslání uložené, takže ji můžete upravovat i po naplánování.

`POST /campaigns/{id}`

## Parametry v cestě

- `id` (string, povinné): ID kampaně (`cmp_…`), nebo název kampaně.

## Parametry v těle požadavku

- `name` (string): Interní název kampaně.

- `subject` (string): Předmět. Podporuje [slučovací značky](/cs/docs/campaigns/merge-tags/).

- `from_email` (string): Adresa odesílatele na ověřené odesílací doméně.

- `from_name` (string): Zobrazované jméno odesílatele.

- `reply_to` (string): Adresa pro odpověď. Prázdný řetězec znamená, že odpovědi chodí na `from_email`.

- `preview_text` (string): Text náhledu uložený s kampaní.

- `content` (string): Zdroj těla z editoru, uložený beze změny.

- `content_type` (string): Formát `content`: `html`, `text` nebo `mjml`.

- `recipients` (object[]): Seznamy kontaktů, na které má kampaň cílit. Nahradí stávající výčet. Zahrňte alespoň jeden seznam s `exclude` nastaveným na `false`. - `audience_id` (string, povinné): ID seznamu kontaktů (`aud_…`) v tomto workspace. - `exclude` (boolean, výchozí hodnota `false`): `true` uloží seznam jako vyloučený. Webové rozhraní vyloučené seznamy odečítá od odhadu počtu příjemců, samotné odeslání ale vyloučení zatím neuplatňuje, takže tyto kontakty odeberte i ze zahrnutých seznamů. Duplicitní ID seznamů se ignorují. Při odeslání Emailit pošle e-mail jednou každému přihlášenému kontaktu ze zahrnutých seznamů a přeskočí odhlášené kontakty a blokované adresy.

Tělo v HTML a prostém textu se nastavuje při [vytvoření kampaně](/cs/docs/api-reference/campaigns/create/). Neznámá pole v těle požadavku se ignorují.

## Odpověď

Vrací upravený objekt kampaně včetně `recipients`.

Pokud `recipients` neobsahuje žádný zahrnutý seznam kontaktů nebo odkazuje na seznam mimo workspace, vrací `422`, a pokud kampaň neexistuje, vrací `404`.

**Požadavek** `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"
}
```

---
Zdroj: https://emailit.com/cs/docs/api-reference/campaigns/update/

## Výpis kampaní — GET /campaigns

> Vypište kampaně workspace od nejnovějších se stránkováním po stránkách, vyhledáváním a filtry podle stavu, názvu a data.

# Výpis kampaní

Vrací kampaně workspace od nejnovějších. Vyžaduje API klíč s oprávněním `full`.

`GET /campaigns`

## Parametry dotazu

- `page` (integer): Číslo stránky, začíná na 1.

- `limit` (integer): Počet kampaní na stránce, od 1 do 100.

- `search` (string): Hledá v názvu nebo předmětu kampaně bez ohledu na velikost písmen.

- `status` (string): Zkrácený filtr podle stavu: `draft`, `scheduled`, `sending` (zahrnuje i `queued`), `sent`, `canceled`, `archived` nebo `all`.

- `match`, `order`, `direction`: viz [Filtrování](https://emailit.com/cs/docs/api-reference/filtering/).

### Klíče filtrů

Filtry používají parametry dotazu ve tvaru `key.condition=value`, například `status.exact=sent` nebo `created_at.after=2026-09-01`. Podmínky pro jednotlivé typy najdete na stránce [Filtrování a řazení](/cs/docs/api-reference/filtering/).

| Klíč | Typ | Poznámky |
| --- | --- | --- |
| `name` | string | |
| `subject` | string | |
| `status` | enum | `draft`, `scheduled`, `queued`, `sending`, `sent`, `archived` |
| `created_at` | date | |
| `sent_at` | date | |

Klíče řazení pro `order`: `name`, `subject`, `status`, `created_at`, `sent_at`.

## Odpověď

Vrací stránku objektů kampaní bez `reply_to`, `preview_text`, `content_type` a `recipients`. Ty získáte endpointem [Načtení kampaně](/cs/docs/api-reference/campaigns/get/).

- `data` (object[]): Kampaně na této stránce.

- `total_records` (integer): Počet kampaní, které odpovídají dotazu.

- `next_page_url` (string | null): Cesta k další stránce, nebo `null` na poslední stránce. Obsahuje jen `page` a `limit`, takže když ji použijete, přidejte znovu vyhledávání a filtry.

- `previous_page_url` (string | null): Cesta k předchozí stránce, nebo `null` na první stránce.

**Požadavek** `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
}
```

---
Zdroj: https://emailit.com/cs/docs/api-reference/campaigns/list/

## Odeslání nebo naplánování kampaně — POST /campaigns/{id}/send

> Odešlete kampaň jejím seznamům kontaktů hned, nebo naplánujte koncept kampaně na budoucí datum a čas.

# Odeslání nebo naplánování kampaně

Odešle kampaň hned, nebo ji naplánuje, když předáte budoucí `scheduled_at`. Vyžaduje API klíč s oprávněním `full` a [ověřený workspace](/cs/docs/workspaces/production-access/): neověřené workspace nemohou kampaně odesílat a dostanou `403`.

Před odesláním se ujistěte, že kampaň má `from_email` na ověřené doméně, předmět, tělo `html` nebo `text` a alespoň jeden zahrnutý seznam kontaktů (nastavíte ho endpointem [Úprava kampaně](/cs/docs/api-reference/campaigns/update/)). Každý e-mail stojí 2 kredity.

`POST /campaigns/{id}/send`

## Parametry v cestě

- `id` (string, povinné): ID kampaně (`cmp_…`), nebo název kampaně.

## Parametry v těle požadavku

- `scheduled_at` (string): Kdy odeslat. Přijímá ISO 8601 (`2026-10-08T09:00:00Z`), unixové časové razítko v sekundách nebo přirozený jazyk, například `tomorrow at 9am` (vyhodnocuje se v UTC). Čas musí být v budoucnosti a kampaň musí být ve stavu `draft`. Pokud chcete odeslat hned, parametr vynechte. Pokud chcete naplánovanou kampaň odeslat dřív, zavolejte tento endpoint bez `scheduled_at`.

## Odpověď

**Odeslání hned:** stav se změní na `sending` a Emailit vyvolá `campaign.sending`. Emailit potom vytvoří jeden e-mail pro každého příjemce: pro každý přihlášený kontakt ze zahrnutých seznamů kontaktů, bez duplicitních adres, odhlášených kontaktů a blokovaných adres. Jakmile jsou všichni příjemci předáni k odeslání, stav se změní na `sent` a Emailit vyvolá `campaign.sent`. Doručování sledujte ve webovém rozhraní nebo pomocí [událostí e-mailů](/cs/docs/webhooks/event-types/).

**Naplánování:** stav se změní na `scheduled` a Emailit vyvolá `campaign.scheduled`. V naplánovaný čas kampaň přejde do stavu `queued` (`campaign.queued`) a potom se odešle stejně jako výše.

Odpověď obsahuje `object`, `id`, `name` a nový `status`, při naplánování také `scheduled_at`.

| Stavový kód | Kdy |
| --- | --- |
| `403` | Workspace není ověřený, nebo API klíč nemá oprávnění `full`. |
| `404` | Parametru `id` neodpovídá žádná kampaň. |
| `422` | `scheduled_at` nelze zpracovat nebo není v budoucnosti, nebo jste se pokusili naplánovat kampaň, která není koncept. |

**Požadavek** `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."
}
```

---
Zdroj: https://emailit.com/cs/docs/api-reference/campaigns/send/

## Zrušení kampaně — POST /campaigns/{id}/cancel

> Zrušte koncept kampaně nebo kampaň, která se právě odesílá. E-maily, které už jsou ve frontě k doručení, se nestáhnou zpět.

# Zrušení kampaně

Nastaví stav kampaně na `canceled` a vyvolá událost `campaign.canceled`. Vyžaduje API klíč s oprávněním `full`.

Zrušit lze jen kampaně ve stavu `draft` nebo `sending`; jakýkoli jiný stav vrací `422`. Zrušení kampaně, která se odesílá, nestáhne zpět e-maily, které už jsou ve frontě k doručení.

`POST /campaigns/{id}/cancel`

## Parametry v cestě

- `id` (string, povinné): ID kampaně (`cmp_…`), nebo název kampaně.

## Odpověď

Vrací `object`, `id`, `name` a `status` (`canceled`).

Pokud stav kampaně není `draft` ani `sending`, vrací `422`, a pokud kampaň neexistuje, vrací `404`.

**Požadavek** `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"
}
```

---
Zdroj: https://emailit.com/cs/docs/api-reference/campaigns/cancel/

## Smazání kampaně — DELETE /campaigns/{id}

> Trvale smažte kampaň podle ID nebo názvu. Vyvolá událost campaign.deleted; už odeslaných e-mailů se to nedotkne.

# Smazání kampaně

Trvale smaže kampaň. Vyžaduje API klíč s oprávněním `full`. Vyvolá událost `campaign.deleted`.

Smazání kampaně nemá vliv na e-maily, které už byly odeslány nebo zařazeny do fronty. Pokud chcete zastavit kampaň, která se odesílá, nejdřív ji [zrušte](/cs/docs/api-reference/campaigns/cancel/).

`DELETE /campaigns/{id}`

## Parametry v cestě

- `id` (string, povinné): ID kampaně (`cmp_…`), nebo název kampaně.

## Odpověď

Vrací `object`, `id`, `name` a `deleted: true`. Pokud kampaň neexistuje, vrací `404`.

**Požadavek** `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"
}
```

---
Zdroj: https://emailit.com/cs/docs/api-reference/campaigns/delete/
