# Kampagnen API

> Kampagnen erstellen, ihre Kontaktlisten wählen und sie senden oder planen.

Basis-URL: `https://api.emailit.com/v2`. Authentifizieren Sie sich mit `Authorization: Bearer <API key>`.

## Kampagne erstellen — POST /campaigns

> Erstellen Sie eine E-Mail-Kampagne als Entwurf mit Absender, Betreff und HTML- oder Textinhalt, bereit für die Auswahl der Kontaktlisten und den Versand.

# Kampagne erstellen

Erstellt eine Kampagne mit dem Status `draft`. Erfordert einen API-Schlüssel mit dem Scope `full`. Löst das Event `campaign.created` aus.

Eine neue Kampagne hat keine Empfänger. Wählen Sie ihre Kontaktlisten mit [Kampagne aktualisieren](/de/docs/api-reference/campaigns/update/) aus und [senden oder planen Sie sie](/de/docs/api-reference/campaigns/send/) anschließend. Credits werden beim Versand der Kampagne berechnet: 2 Credits pro E-Mail.

`POST /campaigns`

## Body-Parameter

- `name` (string, erforderlich): Interner Name der Kampagne. Empfänger sehen ihn nicht. Andere Kampagnen-Endpunkte akzeptieren den Namen anstelle der ID; halten Sie die Namen also eindeutig, wenn Sie sie so verwenden.

- `subject` (string): Betreffzeile. Unterstützt [Platzhalter](/de/docs/campaigns/merge-tags/) wie `{{first_name}}`.

- `from_email` (string): Absenderadresse. Sie muss zu einer verifizierten Versanddomain im Workspace gehören, zum Beispiel `news@acme.com`.

- `from_name` (string): Anzeigename des Absenders, zum Beispiel `Acme`. Die Nachricht wird dann von `Acme <news@acme.com>` gesendet.

- `reply_to` (string): Reply-To-Adresse. Standardwert beim Versand der Kampagne: `from_email`.

- `html` (string): HTML-Inhalt, den Emailit versendet. Unterstützt die Platzhalter `{{first_name}}`, `{{last_name}}`, `{{email}}`, `{{unsubscribe_url}}` und `{{cf.<key>}}` für eigene Felder. Legen Sie den Inhalt beim Erstellen der Kampagne fest.

- `text` (string): Nur-Text-Inhalt. Unterstützt dieselben Platzhalter wie `html`.

- `preview_text` (string): Vorschautext, der mit der Kampagne gespeichert wird. Emailit fügt ihn nicht in die Nachricht ein; ergänzen Sie bei Bedarf einen versteckten Preheader in `html`.

- `content` (string): Editor-Quelltext des Inhalts (zum Beispiel MJML), unverändert gespeichert. Emailit sendet `html` und `text`, nicht `content`.

- `content_type` (string): Format von `content`: `html`, `text` oder `mjml`. Emailit kompiliert kein MJML; senden Sie das kompilierte HTML in `html`.

## Rückgabe

Gibt `201 Created` mit dem Kampagnen-Objekt zurück. `status` ist `draft`. Die Antwort gibt `html`, `text` und `content` nicht zurück.

Gibt `400` zurück, wenn `name` fehlt, und `403`, wenn der API-Schlüssel den Scope `full` nicht hat.

**Anfrage** `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"
}
```

---
Quelle: https://emailit.com/de/docs/api-reference/campaigns/create/

## Kampagne abrufen — GET /campaigns/{id}

> Rufen Sie eine Kampagne per ID oder Name ab, mit Status, Absender, Zeitplan und den Kontaktlisten, an die sie sich richtet.

# Kampagne abrufen

Ruft eine Kampagne anhand ihrer ID oder ihres Namens ab. Erfordert einen API-Schlüssel mit dem Scope `full`.

`GET /campaigns/{id}`

## Pfadparameter

- `id` (string, erforderlich): Die Kampagnen-ID (`cmp_…`) oder der Name der Kampagne. Namen mit Leerzeichen oder Sonderzeichen müssen Sie URL-kodieren.

## Rückgabe

Gibt das Kampagnen-Objekt zurück.

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

- `id` (string): Kampagnen-ID mit dem Präfix `cmp_`.

- `status` (string): `draft`, `scheduled`, `queued`, `sending`, `sent`, `canceled` oder `archived`. `queued` bedeutet, dass eine geplante Kampagne ihren Sendezeitpunkt erreicht hat und auf einen Worker wartet.

- `name` (string): Interner Name der Kampagne.

- `subject` (string): Betreffzeile mit nicht aufgelösten Platzhaltern.

- `from_email` (string): Absenderadresse. `""`, solange sie nicht festgelegt ist.

- `from_name` (string): Anzeigename des Absenders. `""`, solange er nicht festgelegt ist.

- `reply_to` (string): Reply-To-Adresse. `""` bedeutet, dass Antworten an `from_email` gehen.

- `preview_text` (string | null): Vorschautext, der mit der Kampagne gespeichert ist.

- `content_type` (string): Formatbezeichnung des Editor-Quelltexts: `html`, `text` oder `mjml` bei Kampagnen, die per API erstellt wurden.

- `scheduled_at` (string | null): Sendezeitpunkt einer geplanten Kampagne, in UTC.

- `sent_at` (string | null): Beginn des Versands.

- `recipients` (object[]): Kontaktlisten, an die sich die Kampagne richtet. Jeder Eintrag hat `audience_id` (`aud_…`) und `exclude` (`true` für eine ausgeschlossene Kontaktliste).

Der Inhalt (`html`, `text` und `content`) ist nicht in der Antwort enthalten. Engagement-Statistiken finden Sie in der Weboberfläche unter **Email Marketing → Campaigns**.

Gibt `404` zurück, wenn keine Kampagne im Workspace zu `id` passt.

**Anfrage** `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"
}
```

---
Quelle: https://emailit.com/de/docs/api-reference/campaigns/get/

## Kampagne aktualisieren — POST /campaigns/{id}

> Ändern Sie Name, Absender, Betreff oder Vorschautext einer Kampagne und legen Sie fest, an welche Kontaktlisten sie gesendet wird und welche sie ausschließt.

# Kampagne aktualisieren

Aktualisiert die übergebenen Felder und lässt die übrigen unverändert. Damit wählen Sie die Kontaktlisten der Kampagne aus, bevor Sie sie senden. Erfordert einen API-Schlüssel mit dem Scope `full`. Löst das Event `campaign.updated` aus.

Eine geplante Kampagne sendet den Stand, der zu ihrem Sendezeitpunkt gespeichert ist; Sie können sie also auch nach dem Planen noch bearbeiten.

`POST /campaigns/{id}`

## Pfadparameter

- `id` (string, erforderlich): Die Kampagnen-ID (`cmp_…`) oder der Name der Kampagne.

## Body-Parameter

- `name` (string): Interner Name der Kampagne.

- `subject` (string): Betreffzeile. Unterstützt [Platzhalter](/de/docs/campaigns/merge-tags/).

- `from_email` (string): Absenderadresse auf einer verifizierten Versanddomain.

- `from_name` (string): Anzeigename des Absenders.

- `reply_to` (string): Reply-To-Adresse. Ein leerer String bedeutet, dass Antworten an `from_email` gehen.

- `preview_text` (string): Vorschautext, der mit der Kampagne gespeichert wird.

- `content` (string): Editor-Quelltext des Inhalts, unverändert gespeichert.

- `content_type` (string): Format von `content`: `html`, `text` oder `mjml`.

- `recipients` (object[]): Die Kontaktlisten, an die sich die Kampagne richtet. Ersetzt die aktuelle Liste. Geben Sie mindestens eine Kontaktliste mit `exclude` auf `false` an. - `audience_id` (String, erforderlich): eine Kontaktlisten-ID (`aud_…`) in diesem Workspace. - `exclude` (Boolean, Standardwert `false`): `true` speichert die Kontaktliste als Ausschluss. Die Weboberfläche zieht ausgeschlossene Kontaktlisten von ihrer Empfängerschätzung ab, der Versand selbst wendet Ausschlüsse derzeit aber nicht an. Entfernen Sie diese Kontakte deshalb auch aus den eingeschlossenen Kontaktlisten. Doppelte Kontaktlisten-IDs werden ignoriert. Beim Versand sendet Emailit jedem angemeldeten Kontakt der eingeschlossenen Kontaktlisten genau eine E-Mail und überspringt abgemeldete Kontakte und gesperrte Adressen.

Den HTML- und Textinhalt legen Sie beim [Erstellen der Kampagne](/de/docs/api-reference/campaigns/create/) fest. Unbekannte Felder im Body werden ignoriert.

## Rückgabe

Gibt das aktualisierte Kampagnen-Objekt einschließlich `recipients` zurück.

Gibt `422` zurück, wenn `recipients` keine eingeschlossene Kontaktliste enthält oder auf eine Kontaktliste außerhalb des Workspaces verweist, und `404`, wenn die Kampagne nicht existiert.

**Anfrage** `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"
}
```

---
Quelle: https://emailit.com/de/docs/api-reference/campaigns/update/

## Kampagnen auflisten — GET /campaigns

> Listen Sie die Kampagnen eines Workspaces auf, neueste zuerst, mit seitenbasierter Paginierung, Suche und Filtern nach Status, Name und Datum.

# Kampagnen auflisten

Gibt die Kampagnen des Workspaces zurück, neueste zuerst. Erfordert einen API-Schlüssel mit dem Scope `full`.

`GET /campaigns`

## Query-Parameter

- `page` (integer): Seitennummer, beginnend bei 1.

- `limit` (integer): Kampagnen pro Seite, von 1 bis 100.

- `search` (string): Abgleich mit dem Namen oder Betreff der Kampagne, ohne Beachtung der Groß-/Kleinschreibung.

- `status` (string): Kurzfilter für den Status: `draft`, `scheduled`, `sending` (erfasst auch `queued`), `sent`, `canceled`, `archived` oder `all`.

- `match`, `order`, `direction`: siehe [Filtern und Sortieren](https://emailit.com/de/docs/api-reference/filtering/).

### Filterschlüssel

Filter verwenden Query-Parameter der Form `key.condition=value`, zum Beispiel `status.exact=sent` oder `created_at.after=2026-09-01`. Die Bedingungen pro Typ finden Sie unter [Filtern](/de/docs/api-reference/filtering/).

| Schlüssel | Typ | Hinweise |
| --- | --- | --- |
| `name` | string | |
| `subject` | string | |
| `status` | enum | `draft`, `scheduled`, `queued`, `sending`, `sent`, `archived` |
| `created_at` | date | |
| `sent_at` | date | |

Sortierschlüssel für `order`: `name`, `subject`, `status`, `created_at`, `sent_at`.

## Rückgabe

Gibt eine Seite mit Kampagnen-Objekten ohne `reply_to`, `preview_text`, `content_type` und `recipients` zurück. Diese Felder liefert [Kampagne abrufen](/de/docs/api-reference/campaigns/get/).

- `data` (object[]): Kampagnen auf dieser Seite.

- `total_records` (integer): Anzahl der Kampagnen, die der Abfrage entsprechen.

- `next_page_url` (string | null): Pfad der nächsten Seite oder `null` auf der letzten Seite. Er enthält nur `page` und `limit`; fügen Sie Ihre Suche und Filter also erneut hinzu, wenn Sie ihm folgen.

- `previous_page_url` (string | null): Pfad der vorherigen Seite oder `null` auf der ersten Seite.

**Anfrage** `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
}
```

---
Quelle: https://emailit.com/de/docs/api-reference/campaigns/list/

## Kampagne senden oder planen — POST /campaigns/{id}/send

> Senden Sie eine Kampagne sofort an ihre Kontaktlisten oder planen Sie eine Kampagne im Entwurf für einen späteren Zeitpunkt.

# Kampagne senden oder planen

Sendet die Kampagne sofort oder plant sie, wenn Sie ein zukünftiges `scheduled_at` übergeben. Erfordert einen API-Schlüssel mit dem Scope `full` und einen [verifizierten Workspace](/de/docs/workspaces/production-access/): Nicht verifizierte Workspaces können keine Kampagnen senden und erhalten `403`.

Stellen Sie vor dem Versand sicher, dass die Kampagne eine `from_email` auf einer verifizierten Domain, einen Betreff, einen `html`- oder `text`-Inhalt und mindestens eine eingeschlossene Kontaktliste hat (festgelegt mit [Kampagne aktualisieren](/de/docs/api-reference/campaigns/update/)). Jede E-Mail kostet 2 Credits.

`POST /campaigns/{id}/send`

## Pfadparameter

- `id` (string, erforderlich): Die Kampagnen-ID (`cmp_…`) oder der Name der Kampagne.

## Body-Parameter

- `scheduled_at` (string): Sendezeitpunkt. Akzeptiert ISO 8601 (`2026-10-08T09:00:00Z`), einen Unix-Zeitstempel in Sekunden oder natürliche Sprache wie `tomorrow at 9am` (in UTC interpretiert). Der Zeitpunkt muss in der Zukunft liegen und die Kampagne muss ein Entwurf (`draft`) sein. Lassen Sie den Parameter weg, um sofort zu senden. Um eine geplante Kampagne früher zu senden, rufen Sie diesen Endpunkt ohne `scheduled_at` auf.

## Rückgabe

**Sofort senden:** Der Status wechselt zu `sending` und Emailit löst `campaign.sending` aus. Anschließend erstellt Emailit eine E-Mail pro Empfänger: für jeden angemeldeten Kontakt der eingeschlossenen Kontaktlisten, nach Adresse dedupliziert, ohne abgemeldete Kontakte und gesperrte Adressen. Sobald alle Empfänger an die Versand-Pipeline übergeben sind, wechselt der Status zu `sent` und Emailit löst `campaign.sent` aus. Verfolgen Sie die Zustellung in der Weboberfläche oder mit [E-Mail-Events](/de/docs/webhooks/event-types/).

**Planen:** Der Status wechselt zu `scheduled` und Emailit löst `campaign.scheduled` aus. Zum geplanten Zeitpunkt wechselt die Kampagne zu `queued` (`campaign.queued`) und wird dann wie oben beschrieben gesendet.

Die Antwort enthält `object`, `id`, `name` und den neuen `status`, beim Planen zusätzlich `scheduled_at`.

| Status | Wann |
| --- | --- |
| `403` | Der Workspace ist nicht verifiziert oder der API-Schlüssel hat nicht den Scope `full`. |
| `404` | Keine Kampagne passt zu `id`. |
| `422` | `scheduled_at` lässt sich nicht parsen oder liegt nicht in der Zukunft, oder Sie haben versucht, eine Kampagne zu planen, die kein Entwurf ist. |

**Anfrage** `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."
}
```

---
Quelle: https://emailit.com/de/docs/api-reference/campaigns/send/

## Kampagne stornieren — POST /campaigns/{id}/cancel

> Stornieren Sie eine Kampagne im Entwurf oder im laufenden Versand. E-Mails, die bereits zur Zustellung in der Warteschlange stehen, werden nicht zurückgeholt.

# Kampagne stornieren

Setzt den Status der Kampagne auf `canceled` und löst das Event `campaign.canceled` aus. Erfordert einen API-Schlüssel mit dem Scope `full`.

Nur Kampagnen mit dem Status `draft` oder `sending` lassen sich stornieren; jeder andere Status gibt `422` zurück. Wenn Sie eine Kampagne im laufenden Versand stornieren, werden E-Mails, die bereits zur Zustellung in der Warteschlange stehen, nicht zurückgeholt.

`POST /campaigns/{id}/cancel`

## Pfadparameter

- `id` (string, erforderlich): Die Kampagnen-ID (`cmp_…`) oder der Name der Kampagne.

## Rückgabe

Gibt `object`, `id`, `name` und `status` (`canceled`) zurück.

Gibt `422` zurück, wenn der Status der Kampagne nicht `draft` oder `sending` ist, und `404`, wenn die Kampagne nicht existiert.

**Anfrage** `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"
}
```

---
Quelle: https://emailit.com/de/docs/api-reference/campaigns/cancel/

## Kampagne löschen — DELETE /campaigns/{id}

> Löschen Sie eine Kampagne endgültig per ID oder Name. Löst das Event campaign.deleted aus; bereits gesendete E-Mails sind nicht betroffen.

# Kampagne löschen

Löscht eine Kampagne endgültig. Erfordert einen API-Schlüssel mit dem Scope `full`. Löst das Event `campaign.deleted` aus.

Das Löschen einer Kampagne wirkt sich nicht auf E-Mails aus, die bereits gesendet oder in die Warteschlange gestellt wurden. Um eine Kampagne im laufenden Versand anzuhalten, [stornieren Sie sie](/de/docs/api-reference/campaigns/cancel/) zuerst.

`DELETE /campaigns/{id}`

## Pfadparameter

- `id` (string, erforderlich): Die Kampagnen-ID (`cmp_…`) oder der Name der Kampagne.

## Rückgabe

Gibt `object`, `id`, `name` und `deleted: true` zurück. Gibt `404` zurück, wenn die Kampagne nicht existiert.

**Anfrage** `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"
}
```

---
Quelle: https://emailit.com/de/docs/api-reference/campaigns/delete/
