# Email campaigns

> The routes of the previous email only campaigns. Deprecated, still working for existing integrations.

Source: https://docs.emelia.io/docs/campaigns/legacy/email

> **Deprecated.** These routes manage the email only campaigns of the previous system. They keep working, but new integrations should create [Campaigns](https://docs.emelia.io/docs/campaigns.md) with `EMAIL` steps: same sending engine, plus LinkedIn, conditions and tracking per step.

## What you can still do

| Need                                    | Route                                                                                                                                  |
| --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| List or read the legacy email campaigns | [List campaigns](https://docs.emelia.io/docs/campaigns/legacy/email/list-campaigns.md), [Get a campaign](https://docs.emelia.io/docs/campaigns/legacy/email/get-campaign.md)             |
| Feed a running legacy campaign          | [Add a contact](https://docs.emelia.io/docs/campaigns/legacy/email/add-contact.md), [Add a contact to a list](https://docs.emelia.io/docs/campaigns/legacy/email/add-contact-to-list.md) |
| Update one field of a contact           | [Set a contact field](https://docs.emelia.io/docs/campaigns/legacy/email/set-contact-field.md)                                                                  |
| Read the results                        | [Get activities](https://docs.emelia.io/docs/campaigns/legacy/email/get-activities.md), [Get statistics](https://docs.emelia.io/docs/campaigns/legacy/email/get-statistics.md)           |

[`POST /emails/campaign/contacts`](https://docs.emelia.io/docs/campaigns/legacy/email/add-contact.md)

**curl**

```bash
curl -X POST https://api.emelia.io/emails/campaign/contacts \
  -H "Authorization: $EMELIA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id": "6650f1a2b839d80011c5a0f1", "contact": {"email": "claire.fontaine@nexora.io", "firstName": "Claire", "lastName": "Fontaine"}}'
```

**JavaScript**

```js
await fetch('https://api.emelia.io/emails/campaign/contacts', {
  method: 'POST',
  headers: { Authorization: process.env.EMELIA_API_KEY, 'Content-Type': 'application/json' },
  body: JSON.stringify({
    id: '6650f1a2b839d80011c5a0f1',
    contact: { email: 'claire.fontaine@nexora.io', firstName: 'Claire', lastName: 'Fontaine' },
  }),
});
```

**Python**

```python
import os
import requests

requests.post(
    "https://api.emelia.io/emails/campaign/contacts",
    headers={"Authorization": os.environ["EMELIA_API_KEY"]},
    json={
        "id": "6650f1a2b839d80011c5a0f1",
        "contact": {"email": "claire.fontaine@nexora.io", "firstName": "Claire", "lastName": "Fontaine"},
    },
)
```

The contact goes to a list named after the campaign. Keys other than `email`, `firstName`, `lastName` and `phoneNumber` become custom variables. A finished campaign starts again, a running one schedules the contact at once, and an email already in the campaign is refused.

## Good to know

* The listing of contacts pages from `page=0` and answers `{ success, list, count }`. Its `event` filter must be an array: `event[]=REPLIED`.
* `PATCH .../settings/global` replaces the whole schedule. `minInterval` and `maxInterval` are in seconds, `dailyLimit` must be at least `dailyContact`.
* The steps are an ordered array. Every step after the first needs `delay.amount` above 0.
* `GET /stats` answers `401` for an unknown campaign, and a flat summary unless `detailed=true`.
