# Contacts API

> Gérez les profils de contacts et les champs personnalisés, en masse ou un par un.

URL de base : `https://api.emailit.com/v2`. Authentifiez-vous avec `Authorization: Bearer <API key>`.

## Créer un contact — POST /contacts

> Créez un contact avec une adresse e-mail, des noms et des champs personnalisés, et inscrivez-le éventuellement à une ou plusieurs listes de contacts en même temps.

# Créer un contact

Crée un contact et l’inscrit éventuellement à des listes de contacts.

`POST /contacts`

Nécessite une clé API `full`. Les adresses e-mail sont uniques au sein d’un espace de travail et enregistrées en minuscules ; créer un contact qui existe déjà renvoie `409` avec le contact existant dans `existing`. Déclenche `contact.created`, et `subscriber.created` pour chaque liste. Consultez [Contacts](/fr/docs/contacts/).

## Paramètres du corps

- `email` (string, obligatoire): L’adresse e-mail du contact.

- `first_name` (string): Le prénom.

- `last_name` (string): Le nom de famille.

- `custom_fields` (object): Valeurs par clé de [champ personnalisé](/fr/docs/contacts/custom-fields/), par exemple `{"company": "Analytical Engines"}`. Les valeurs des champs de type date doivent être au format `YYYY-MM-DD`. Les clés qui ne correspondent à aucun champ personnalisé sont enregistrées telles quelles.

- `audiences` (string[]): ID des listes (`aud_…`) auxquelles inscrire le contact. Les ID qui n’existent pas dans l’espace de travail sont ignorés.

- `unsubscribed` (boolean): `true` pour créer le contact à l’état désinscrit. Les campagnes ignorent les contacts désinscrits, et leurs inscriptions aux listes sont créées à l’état désinscrit.

## Réponse

Renvoie `201` avec l’objet contact. Ici, `audiences` contient chaque liste avec son `id`, son `name` et son statut `subscribed`. Pour tous les champs, consultez [Récupérer un contact](/fr/docs/api-reference/contacts/get/).

Renvoie `422` avec `usage` lorsqu’une liste a atteint la limite d’abonnés de votre forfait. Dans ce cas, aucun contact n’est créé.

**Requête** `POST /contacts`

**Node.js**

```javascript
import { Emailit } from '@emailit/node';
const emailit = new Emailit('your_api_key');

const contact = await emailit.contacts.create({
  email: 'ada@example.com',
  first_name: 'Ada',
  last_name: 'Lovelace',
});
```

**Python**

```python
from emailit import EmailitClient
client = EmailitClient("your_api_key")

contact = client.contacts.create({
  "email": "ada@example.com",
  "first_name": "Ada",
  "last_name": "Lovelace",
})
```

**PHP**

```php
$emailit = Emailit::client('your_api_key');

$contact = $emailit->contacts()->create([
  'email' => 'ada@example.com',
  'first_name' => 'Ada',
  'last_name' => 'Lovelace',
]);
```

**Ruby**

```ruby
require "emailit"
client = Emailit::EmailitClient.new("your_api_key")

contact = client.contacts.create(
  email: "ada@example.com",
  first_name: "Ada",
  last_name: "Lovelace"
)
```

**Go**

```go
import "github.com/emailit/emailit-go/v2"
client := emailit.NewClient("your_api_key")

contact, err := client.Contacts.Create(&emailit.CreateContactRequest{
  Email:     "ada@example.com",
  FirstName: "Ada",
  LastName:  "Lovelace",
})
```

**Rust**

```rust
use emailit::Emailit;

let emailit = Emailit::new("your_api_key");

let contact = emailit.contacts.create(
  emailit::types::CreateContactParams::new("ada@example.com")
    .with_first_name("Ada")
    .with_last_name("Lovelace")
).await?;
```

**Java**

```java
import com.emailit.*;
import com.emailit.params.*;

EmailitClient emailit = new EmailitClient("your_api_key");

EmailitObject contact = emailit.contacts().create(
  ContactCreateParams.builder()
    .setEmail("ada@example.com")
    .setFirstName("Ada")
    .setLastName("Lovelace")
    .build()
);
```

**.NET**

```csharp
using Emailit;

var emailit = new EmailitClient("your_api_key");

var contact = emailit.Contacts.Create(new ContactCreateOptions {
  Email = "ada@example.com",
  FirstName = "Ada",
  LastName = "Lovelace",
});
```

**Laravel**

```php
use Emailit\Laravel\Facades\Emailit;

$contact = Emailit::contacts()->create([
  'email' => 'ada@example.com',
  'first_name' => 'Ada',
  'last_name' => 'Lovelace',
]);
```

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/contacts \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "ada@example.com",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "custom_fields": { "company": "Analytical Engines", "plan": "pro" },
    "audiences": ["aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2"]
  }'
```

**201**

```json
{
  "object": "contact",
  "id": "con_4K9kQdrXth7am0TPKvPrR5yd2oo",
  "email": "ada@example.com",
  "first_name": "Ada",
  "last_name": "Lovelace",
  "custom_fields": {
    "company": "Analytical Engines",
    "plan": "pro"
  },
  "unsubscribed": false,
  "audiences": [
    {
      "id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
      "name": "Newsletter",
      "subscribed": true
    }
  ],
  "created_at": "2026-10-01T10:20:31.704113Z",
  "updated_at": "2026-10-01T10:20:31.704113Z"
}
```

**400**

```json
{
  "error": "Custom field \"Birthday\" must be a date in YYYY-MM-DD format"
}
```

**409**

```json
{
  "error": "Contact with this email already exists",
  "existing": {
    "object": "contact",
    "id": "con_4K9kQdrXth7am0TPKvPrR5yd2oo",
    "email": "ada@example.com",
    "first_name": "Ada",
    "last_name": "Lovelace",
    "custom_fields": {
      "company": "Analytical Engines",
      "plan": "pro"
    },
    "unsubscribed": false,
    "audiences": [
      {
        "id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
        "name": "Newsletter",
        "subscribed": true
      }
    ],
    "created_at": "2026-10-01T10:20:31.704113Z",
    "updated_at": "2026-10-01T10:20:31.704113Z"
  }
}
```

**422**

```json
{
  "error": "Pro includes 50,000 subscribers per audience.",
  "usage": {
    "used": 50000,
    "limit": 50000,
    "plan": "pro"
  }
}
```

---
Source: https://emailit.com/fr/docs/api-reference/contacts/create/

## Récupérer un contact — GET /contacts/{id}

> Récupérez un contact par son ID ou son adresse e-mail, avec ses champs personnalisés et toutes ses inscriptions aux listes de contacts, dates d’inscription comprises.

# Récupérer un contact

Récupère un contact avec ses champs personnalisés et ses inscriptions aux listes de contacts.

`GET /contacts/{id}`

Nécessite une clé API `full`.

## Paramètres de chemin

- `id` (string, obligatoire): L’ID du contact (`con_…`) ou son adresse e-mail, encodée pour l’URL.

## Réponse

Renvoie l’objet contact.

- `object` (string): Toujours `contact`.

- `id` (string): L’ID du contact.

- `email` (string): L’adresse e-mail, en minuscules.

- `first_name` (string | null): Le prénom.

- `last_name` (string | null): Le nom de famille.

- `custom_fields` (object): Valeurs des champs personnalisés par clé. `{}` s’il n’y en a aucun.

- `unsubscribed` (boolean): `true` si le contact s’est désinscrit de toutes les campagnes.

- `audiences` (object[]): Les listes de contacts auxquelles appartient le contact, chacune avec `id`, `name` et un objet `subscriber` : `id` (`sub_…`), `subscribed`, `subscribed_at`, `unsubscribed_at`, `created_at` et `updated_at`.

- `created_at` (string): Date de création du contact.

- `updated_at` (string): Date de la dernière modification du contact.

**Requête** `GET /contacts/{id}`

**Node.js**

```javascript
import { Emailit } from '@emailit/node';
const emailit = new Emailit('your_api_key');

const contact = await emailit.contacts.get('con_4K9kQdrXth7am0TPKvPrR5yd2oo');
```

**Python**

```python
from emailit import EmailitClient
client = EmailitClient("your_api_key")

contact = client.contacts.get("con_4K9kQdrXth7am0TPKvPrR5yd2oo")
```

**PHP**

```php
$emailit = Emailit::client('your_api_key');

$contact = $emailit->contacts()->get('con_4K9kQdrXth7am0TPKvPrR5yd2oo');
```

**Ruby**

```ruby
require "emailit"
client = Emailit::EmailitClient.new("your_api_key")

contact = client.contacts.get("con_4K9kQdrXth7am0TPKvPrR5yd2oo")
```

**Go**

```go
import "github.com/emailit/emailit-go/v2"
client := emailit.NewClient("your_api_key")

contact, err := client.Contacts.Get("con_4K9kQdrXth7am0TPKvPrR5yd2oo")
```

**Rust**

```rust
use emailit::Emailit;

let emailit = Emailit::new("your_api_key");

let contact = emailit.contacts.get("con_4K9kQdrXth7am0TPKvPrR5yd2oo").await?;
```

**Java**

```java
import com.emailit.*;

EmailitClient emailit = new EmailitClient("your_api_key");

EmailitObject contact = emailit.contacts().get("con_4K9kQdrXth7am0TPKvPrR5yd2oo");
```

**.NET**

```csharp
using Emailit;

var emailit = new EmailitClient("your_api_key");

var contact = emailit.Contacts.Get("con_4K9kQdrXth7am0TPKvPrR5yd2oo");
```

**Laravel**

```php
use Emailit\Laravel\Facades\Emailit;

$contact = Emailit::contacts()->get('con_4K9kQdrXth7am0TPKvPrR5yd2oo');
```

**cURL**

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

**200**

```json
{
  "object": "contact",
  "id": "con_4K9kQdrXth7am0TPKvPrR5yd2oo",
  "email": "ada@example.com",
  "first_name": "Ada",
  "last_name": "Lovelace",
  "custom_fields": {
    "company": "Analytical Engines",
    "plan": "pro"
  },
  "unsubscribed": false,
  "audiences": [
    {
      "id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
      "name": "Newsletter",
      "subscriber": {
        "id": "sub_4KECYl5AwXEy8ezswYRhuddttxo",
        "subscribed": true,
        "subscribed_at": "2026-10-01T10:20:31.000000Z",
        "unsubscribed_at": null,
        "created_at": "2026-10-01T10:20:31.000000Z",
        "updated_at": "2026-10-01T10:20:31.000000Z"
      }
    }
  ],
  "created_at": "2026-10-01T10:20:31.000000Z",
  "updated_at": "2026-10-01T10:20:31.000000Z"
}
```

**404**

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

---
Source: https://emailit.com/fr/docs/api-reference/contacts/get/

## Mettre à jour un contact — POST /contacts/{id}

> Modifiez l’adresse e-mail, les noms, les champs personnalisés ou le statut de désinscription d’un contact, ou remplacez les listes de contacts auxquelles il appartient.

# Mettre à jour un contact

Met à jour un contact. Seuls les champs que vous envoyez sont modifiés.

`POST /contacts/{id}`

Nécessite une clé API `full`. Déclenche `contact.updated`, avec les valeurs précédentes des champs modifiés dans `previous`. Modifier `audiences` déclenche aussi `subscriber.created` et `subscriber.deleted` pour les inscriptions ajoutées et supprimées.

## Paramètres de chemin

- `id` (string, obligatoire): L’ID du contact (`con_…`) ou son adresse e-mail, encodée pour l’URL.

## Paramètres du corps

- `email` (string): Une nouvelle adresse e-mail. Ne doit pas appartenir à un autre contact.

- `first_name` (string): Le prénom.

- `last_name` (string): Le nom de famille.

- `custom_fields` (object): Valeurs des champs personnalisés par clé. Remplacent tous les champs personnalisés du contact : incluez ceux que vous voulez conserver.

- `unsubscribed` (boolean): `true` pour désinscrire le contact de toutes les campagnes, `false` pour le réinscrire. Les inscriptions existantes aux listes conservent leur propre statut.

- `audiences` (string[]): La liste complète des ID des listes de contacts auxquelles le contact doit appartenir. Le contact est ajouté aux listes dont il ne fait pas encore partie et retiré de celles qui ne figurent pas dans votre tableau. Envoyez `[]` pour le retirer de toutes les listes. Pour ajouter ou retirer une seule liste sans les énumérer toutes, utilisez [Ajouter un abonné](/fr/docs/api-reference/audiences/subscribers/add/) ou [Supprimer un abonné](/fr/docs/api-reference/audiences/subscribers/delete/).

## Réponse

Renvoie le contact mis à jour, au même format que [Récupérer un contact](/fr/docs/api-reference/contacts/get/). Une requête sans aucun de ces champs renvoie `400`.

**Requête** `POST /contacts/{id}`

**Node.js**

```javascript
import { Emailit } from '@emailit/node';
const emailit = new Emailit('your_api_key');

const contact = await emailit.contacts.update('con_4K9kQdrXth7am0TPKvPrR5yd2oo', {
  first_name: 'Augusta',
});
```

**Python**

```python
from emailit import EmailitClient
client = EmailitClient("your_api_key")

contact = client.contacts.update("con_4K9kQdrXth7am0TPKvPrR5yd2oo", {
  "first_name": "Augusta",
})
```

**PHP**

```php
$emailit = Emailit::client('your_api_key');

$contact = $emailit->contacts()->update('con_4K9kQdrXth7am0TPKvPrR5yd2oo', [
  'first_name' => 'Augusta',
]);
```

**Ruby**

```ruby
require "emailit"
client = Emailit::EmailitClient.new("your_api_key")

contact = client.contacts.update("con_4K9kQdrXth7am0TPKvPrR5yd2oo",
  first_name: "Augusta"
)
```

**Go**

```go
import "github.com/emailit/emailit-go/v2"
client := emailit.NewClient("your_api_key")

contact, err := client.Contacts.Update("con_4K9kQdrXth7am0TPKvPrR5yd2oo", &emailit.UpdateContactRequest{
  FirstName: "Augusta",
})
```

**Rust**

```rust
use emailit::Emailit;

let emailit = Emailit::new("your_api_key");

let contact = emailit.contacts.update("con_4K9kQdrXth7am0TPKvPrR5yd2oo",
  emailit::types::UpdateContactParams {
    first_name: Some("Augusta".into()),
    ..Default::default()
  }
).await?;
```

**Java**

```java
import com.emailit.*;
import com.emailit.params.*;

EmailitClient emailit = new EmailitClient("your_api_key");

EmailitObject contact = emailit.contacts().update("con_4K9kQdrXth7am0TPKvPrR5yd2oo", 
  ContactUpdateParams.builder()
    .setFirstName("Augusta")
    .build()
);
```

**.NET**

```csharp
using Emailit;

var emailit = new EmailitClient("your_api_key");

var contact = emailit.Contacts.Update("con_4K9kQdrXth7am0TPKvPrR5yd2oo", new ContactUpdateOptions {
  FirstName = "Augusta",
});
```

**Laravel**

```php
use Emailit\Laravel\Facades\Emailit;

$contact = Emailit::contacts()->update('con_4K9kQdrXth7am0TPKvPrR5yd2oo', [
  'first_name' => 'Augusta',
]);
```

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/contacts/con_4K9kQdrXth7am0TPKvPrR5yd2oo \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"first_name": "Augusta"}'
```

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/contacts/ada%40example.com \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "custom_fields": { "company": "Analytical Engines", "plan": "business" },
    "audiences": ["aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2", "aud_4KOlh9t2uw5od4qypqCtyrZyDq2"]
  }'
```

**200**

```json
{
  "object": "contact",
  "id": "con_4K9kQdrXth7am0TPKvPrR5yd2oo",
  "email": "ada@example.com",
  "first_name": "Augusta",
  "last_name": "Lovelace",
  "custom_fields": {
    "company": "Analytical Engines",
    "plan": "pro"
  },
  "unsubscribed": false,
  "audiences": [
    {
      "id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
      "name": "Newsletter",
      "subscriber": {
        "id": "sub_4KECYl5AwXEy8ezswYRhuddttxo",
        "subscribed": true,
        "subscribed_at": "2026-10-01T10:20:31.000000Z",
        "unsubscribed_at": null,
        "created_at": "2026-10-01T10:20:31.000000Z",
        "updated_at": "2026-10-01T10:20:31.000000Z"
      }
    }
  ],
  "created_at": "2026-10-01T10:20:31.000000Z",
  "updated_at": "2026-10-02T09:03:17.000000Z"
}
```

**400**

```json
{
  "error": "No valid fields provided for update. Provide at least one of: email, first_name, last_name, custom_fields, unsubscribed, audiences"
}
```

**404**

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

**409**

```json
{
  "error": "Another contact with this email already exists"
}
```

---
Source: https://emailit.com/fr/docs/api-reference/contacts/update/

## Lister les contacts — GET /contacts

> Listez les contacts d’un espace de travail, du plus récent au plus ancien, filtrés par liste de contacts, statut d’inscription, champs personnalisés ou n’importe quel champ du contact.

# Lister les contacts

Renvoie une page de contacts, du plus récent au plus ancien.

`GET /contacts`

Nécessite une clé API `full`. Utilisez les mêmes paramètres avec [Exporter des contacts](/fr/docs/api-reference/contacts/export/) pour télécharger tous les résultats dans un fichier.

## Paramètres de requête

- `page` (integer): La page à renvoyer.

- `limit` (integer): Nombre de contacts par page, de 1 à 100.

- `search` (string): Recherche insensible à la casse sur l’adresse e-mail, le prénom ou le nom de famille. `q` fonctionne aussi.

- `audience_id` (string): Uniquement les contacts de cette liste (`aud_…`).

- `unsubscribed` (boolean): `true` ou `false`. Uniquement les contacts ayant ce statut de désinscription.

- `sort` (string): `email`, `first_name`, `last_name`, `name`, `audiences`, `created_at` ou `updated_at`.

- `order` (string): `asc` ou `desc`. Sur cet endpoint, `order` est le sens du tri, pas la clé de tri.

- `match` (string): `all` ou `or`. Mode de combinaison des filtres ci-dessous.

## Filtres

Ajoutez des filtres sous la forme `key.condition=value`, par exemple `email.ends_with=@acme.com` ou `custom_fields.plan.exact=pro`. Consultez [Filtrage et tri](/fr/docs/api-reference/filtering/).

| Clé | Type | Remarques |
| --- | --- | --- |
| `email` | chaîne | |
| `first_name` | chaîne | |
| `last_name` | chaîne | |
| `name` | chaîne | Prénom et nom de famille séparés par une espace. |
| `audiences` | chaîne | Le premier nom de liste du contact dans l’ordre alphabétique. |
| `unsubscribed` | booléen | |
| `created_at` | date | |
| `updated_at` | date | |
| `audience_id` | chaîne | Uniquement `exact` et `not_exact`. La valeur est un ID de liste. |
| `custom_fields.<key>` | chaîne | Remplacez `<key>` par la clé d’un champ personnalisé. Les valeurs sont comparées comme du texte. |

Les anciens paramètres `filter[audience_id]`, `filter[unsubscribed]` et `filter[custom_fields][<key>]` fonctionnent toujours.

## Réponse

- `data` (object[]): Les contacts de cette page, chacun avec `audiences` sous la forme `id`, `name` et `subscribed`. Consultez [Récupérer un contact](/fr/docs/api-reference/contacts/get/).

- `total_records` (integer): Le nombre de contacts correspondants, toutes pages confondues.

- `next_page_url` (string | null): Chemin de la page suivante avec vos filtres, ou `null`. Consultez [Pagination](/fr/docs/api-reference/pagination/).

- `previous_page_url` (string | null): Chemin de la page précédente, ou `null`.

**Requête** `GET /contacts`

**Node.js**

```javascript
import { Emailit } from '@emailit/node';
const emailit = new Emailit('your_api_key');

const contacts = await emailit.contacts.list();
```

**Python**

```python
from emailit import EmailitClient
client = EmailitClient("your_api_key")

contacts = client.contacts.list()
```

**PHP**

```php
$emailit = Emailit::client('your_api_key');

$contacts = $emailit->contacts()->list();
```

**Ruby**

```ruby
require "emailit"
client = Emailit::EmailitClient.new("your_api_key")

contacts = client.contacts.list
```

**Go**

```go
import "github.com/emailit/emailit-go/v2"
client := emailit.NewClient("your_api_key")

contacts, err := client.Contacts.List(nil)
```

**Rust**

```rust
use emailit::Emailit;

let emailit = Emailit::new("your_api_key");

let contacts = emailit.contacts.list(None).await?;
```

**Java**

```java
import com.emailit.*;

EmailitClient emailit = new EmailitClient("your_api_key");

EmailitObject contacts = emailit.contacts().list();
```

**.NET**

```csharp
using Emailit;

var emailit = new EmailitClient("your_api_key");

var contacts = emailit.Contacts.List();
```

**Laravel**

```php
use Emailit\Laravel\Facades\Emailit;

$contacts = Emailit::contacts()->list();
```

**cURL**

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

**cURL**

```bash
curl -G https://api.emailit.com/v2/contacts \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  --data-urlencode "audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2" \
  --data-urlencode "custom_fields.plan.exact=pro" \
  --data-urlencode "sort=email" \
  --data-urlencode "order=asc" \
  --data-urlencode "limit=100"
```

**200**

```json
{
  "data": [
    {
      "object": "contact",
      "id": "con_4K9kQdrXth7am0TPKvPrR5yd2oo",
      "email": "ada@example.com",
      "first_name": "Ada",
      "last_name": "Lovelace",
      "custom_fields": {
        "company": "Analytical Engines",
        "plan": "pro"
      },
      "unsubscribed": false,
      "audiences": [
        {
          "id": "aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
          "name": "Newsletter",
          "subscribed": true
        }
      ],
      "created_at": "2026-10-01T10:20:31.704113Z",
      "updated_at": "2026-10-01T10:20:31.704113Z"
    },
    {
      "object": "contact",
      "id": "con_4KiXIs4xLTcJIAHnKJaLcnMZYh7",
      "email": "grace@example.com",
      "first_name": "Grace",
      "last_name": "Hopper",
      "custom_fields": {},
      "unsubscribed": true,
      "audiences": [],
      "created_at": "2026-09-28T07:55:02.118342Z",
      "updated_at": "2026-09-30T18:11:40.902215Z"
    }
  ],
  "total_records": 2,
  "next_page_url": null,
  "previous_page_url": null
}
```

---
Source: https://emailit.com/fr/docs/api-reference/contacts/list/

## Mettre à jour des contacts en masse — POST /contacts/bulk

> Appliquez une action à 100 contacts au maximum en une seule fois : les supprimer, les ajouter à une liste de contacts ou les en retirer, les désinscrire ou les réinscrire.

# Mettre à jour des contacts en masse

Exécute une action sur 100 contacts au maximum en une seule requête.

`POST /contacts/bulk`

Nécessite une clé API `full`. Chaque ID doit correspondre à un contact de l’espace de travail ; sinon, rien n’est modifié et la réponse indique les ID manquants dans `missing`. Chaque contact déclenche les mêmes événements qu’avec les endpoints portant sur un seul contact. Si la liste de contacts atteint la limite d’abonnés de votre forfait pendant `add_to_audience`, la requête s’arrête avec `422`, et les contacts traités jusque-là restent ajoutés.

| Action | Effet |
| --- | --- |
| `delete` | Supprime les contacts et leurs inscriptions aux listes, comme [Supprimer un contact](/fr/docs/api-reference/contacts/delete/). |
| `add_to_audience` | Ajoute les contacts à `audience_id`. Les contacts qui y figurent déjà restent inchangés. |
| `remove_from_audience` | Retire les contacts de `audience_id`. |
| `unsubscribe` | Définit `unsubscribed` sur `true` : les campagnes ignorent alors ces contacts. |
| `resubscribe` | Définit `unsubscribed` sur `false`. |

## Paramètres du corps

- `action` (string, obligatoire): `delete`, `add_to_audience`, `remove_from_audience`, `unsubscribe` ou `resubscribe`.

- `ids` (string[], obligatoire): ID de contacts (`con_…`), de 1 à 100. Les adresses e-mail ne sont pas acceptées ici. Les doublons sont ignorés.

- `audience_id` (string): L’ID de la liste. Obligatoire pour `add_to_audience` et `remove_from_audience`.

## Réponse

- `object` (string): Toujours `contact_bulk`.

- `action` (string): L’action exécutée.

- `processed` (integer): Nombre de contacts traités.

- `ids` (string[]): Les ID des contacts traités.

**Requête** `POST /contacts/bulk`

**Node.js**

```javascript
const response = await fetch('https://api.emailit.com/v2/contacts/bulk', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer your_api_key',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({"action": "add_to_audience", "ids": ["con_4K9kQdrXth7am0TPKvPrR5yd2oo", "con_4KiXIs4xLTcJIAHnKJaLcnMZYh7"], "audience_id": "aud_4KOlh9t2uw5od4qypqCtyrZyDq2"}),
});
const result = await response.json();
```

**Python**

```python
import requests

response = requests.post(
  "https://api.emailit.com/v2/contacts/bulk",
  headers={"Authorization": "Bearer your_api_key"},
  json={"action": "add_to_audience", "ids": ["con_4K9kQdrXth7am0TPKvPrR5yd2oo", "con_4KiXIs4xLTcJIAHnKJaLcnMZYh7"], "audience_id": "aud_4KOlh9t2uw5od4qypqCtyrZyDq2"}
)
result = response.json()
```

**PHP**

```php
$ch = curl_init('https://api.emailit.com/v2/contacts/bulk');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer your_api_key',
    'Content-Type: application/json',
  ],
  CURLOPT_POSTFIELDS => json_encode(['action' => 'add_to_audience', 'ids' => ['con_4K9kQdrXth7am0TPKvPrR5yd2oo', 'con_4KiXIs4xLTcJIAHnKJaLcnMZYh7'], 'audience_id' => 'aud_4KOlh9t2uw5od4qypqCtyrZyDq2']),
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
```

**Ruby**

```ruby
require "net/http"
require "json"

uri = URI("https://api.emailit.com/v2/contacts/bulk")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer your_api_key"
req["Content-Type"] = "application/json"
req.body = { action: "add_to_audience", ids: ["con_4K9kQdrXth7am0TPKvPrR5yd2oo", "con_4KiXIs4xLTcJIAHnKJaLcnMZYh7"], audience_id: "aud_4KOlh9t2uw5od4qypqCtyrZyDq2" }.to_json
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
result = JSON.parse(http.request(req).body)
```

**Go**

```go
payload := strings.NewReader(`{"action": "add_to_audience", "ids": ["con_4K9kQdrXth7am0TPKvPrR5yd2oo", "con_4KiXIs4xLTcJIAHnKJaLcnMZYh7"], "audience_id": "aud_4KOlh9t2uw5od4qypqCtyrZyDq2"}`)
req, _ := http.NewRequest("POST", "https://api.emailit.com/v2/contacts/bulk", payload)
req.Header.Set("Authorization", "Bearer your_api_key")
req.Header.Set("Content-Type", "application/json")

resp, err := http.DefaultClient.Do(req)
if err != nil {
  return err
}
defer resp.Body.Close()
```

**Rust**

```rust
let response = reqwest::Client::new()
    .post("https://api.emailit.com/v2/contacts/bulk")
    .bearer_auth("your_api_key")
    .json(&serde_json::json!({"action": "add_to_audience", "ids": ["con_4K9kQdrXth7am0TPKvPrR5yd2oo", "con_4KiXIs4xLTcJIAHnKJaLcnMZYh7"], "audience_id": "aud_4KOlh9t2uw5od4qypqCtyrZyDq2"}))
    .send()
    .await?;
```

**Java**

```java
import java.net.http.*;
import java.net.URI;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
  .uri(URI.create("https://api.emailit.com/v2/contacts/bulk"))
  .header("Authorization", "Bearer your_api_key")
  .header("Content-Type", "application/json")
  .POST(HttpRequest.BodyPublishers.ofString("{\"action\": \"add_to_audience\", \"ids\": [\"con_4K9kQdrXth7am0TPKvPrR5yd2oo\", \"con_4KiXIs4xLTcJIAHnKJaLcnMZYh7\"], \"audience_id\": \"aud_4KOlh9t2uw5od4qypqCtyrZyDq2\"}"))
  .build();
HttpResponse<String> response = client.send(request,
  HttpResponse.BodyHandlers.ofString());
```

**.NET**

```csharp
using System.Net.Http.Headers;
using System.Text;

var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "your_api_key");

var content = new StringContent(@"{""action"": ""add_to_audience"", ""ids"": [""con_4K9kQdrXth7am0TPKvPrR5yd2oo"", ""con_4KiXIs4xLTcJIAHnKJaLcnMZYh7""], ""audience_id"": ""aud_4KOlh9t2uw5od4qypqCtyrZyDq2""}", Encoding.UTF8, "application/json");
var response = await http.PostAsync("https://api.emailit.com/v2/contacts/bulk", content);
```

**Laravel**

```php
use Illuminate\Support\Facades\Http;

$result = Http::withToken('your_api_key')
  ->post('https://api.emailit.com/v2/contacts/bulk', ['action' => 'add_to_audience', 'ids' => ['con_4K9kQdrXth7am0TPKvPrR5yd2oo', 'con_4KiXIs4xLTcJIAHnKJaLcnMZYh7'], 'audience_id' => 'aud_4KOlh9t2uw5od4qypqCtyrZyDq2'])
  ->json();
```

**cURL**

```bash
curl -X POST https://api.emailit.com/v2/contacts/bulk \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action": "add_to_audience", "ids": ["con_4K9kQdrXth7am0TPKvPrR5yd2oo", "con_4KiXIs4xLTcJIAHnKJaLcnMZYh7"], "audience_id": "aud_4KOlh9t2uw5od4qypqCtyrZyDq2"}'
```

**200**

```json
{
  "object": "contact_bulk",
  "action": "add_to_audience",
  "processed": 2,
  "ids": ["con_4K9kQdrXth7am0TPKvPrR5yd2oo", "con_4KiXIs4xLTcJIAHnKJaLcnMZYh7"]
}
```

**400**

```json
{
  "error": "A maximum of 100 contacts can be updated per request"
}
```

**404**

```json
{
  "error": "One or more contacts were not found",
  "missing": ["con_4K3pZc1Q9nWm2LrT8vYb5Hd0XaE"]
}
```

**422**

```json
{
  "error": "Pro includes 50,000 subscribers per audience.",
  "usage": {
    "used": 50000,
    "limit": 50000,
    "plan": "pro"
  }
}
```

---
Source: https://emailit.com/fr/docs/api-reference/contacts/bulk/

## Exporter des contacts — GET /contacts/export

> Téléchargez les contacts qui correspondent à vos filtres dans un fichier CSV ou Excel, avec leurs listes de contacts et leurs champs personnalisés. 10 000 contacts au maximum.

# Exporter des contacts

Télécharge les contacts correspondants dans un fichier CSV ou XLSX.

`GET /contacts/export`

Nécessite une clé API `full`. Accepte les mêmes paramètres de recherche, de filtre et de tri que [Lister les contacts](/fr/docs/api-reference/contacts/list/), transmis dans la chaîne de requête, sans pagination. `POST /contacts/export` fonctionne de la même manière. Un export peut inclure 10 000 contacts au maximum ; si davantage de contacts correspondent, la requête renvoie `422` : affinez alors les filtres.

## Paramètres de requête

- `format` (string): `csv` ou `xlsx`.

- `search, audience_id, unsubscribed, sort, order, match, key.condition` (string): Les mêmes paramètres que [Lister les contacts](/fr/docs/api-reference/contacts/list/).

## Réponse

Renvoie le fichier en pièce jointe : `contacts.csv` (`text/csv; charset=utf-8`) ou `contacts.xlsx`. Chaque ligne correspond à un contact, avec les colonnes suivantes :

| Colonne | Contenu |
| --- | --- |
| `email` | L’adresse e-mail. |
| `first_name`, `last_name` | Le prénom et le nom de famille. |
| `unsubscribed` | `true` ou `false`. |
| `audiences` | Les noms des listes du contact, séparés par `; `. |
| Une colonne par champ personnalisé | La valeur de chaque champ personnalisé défini dans l’espace de travail ; la colonne porte le nom de sa clé. Les listes de valeurs sont jointes par `;`. |
| `created_at`, `updated_at` | Horodatages ISO 8601. |

**Requête** `GET /contacts/export`

**Node.js**

```javascript
import { writeFile } from 'node:fs/promises';

const response = await fetch('https://api.emailit.com/v2/contacts/export?format=csv&audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2', {
  headers: { Authorization: 'Bearer your_api_key' },
});
await writeFile('contacts.csv', Buffer.from(await response.arrayBuffer()));
```

**Python**

```python
import requests

response = requests.get(
  "https://api.emailit.com/v2/contacts/export?format=csv&audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2",
  headers={"Authorization": "Bearer your_api_key"}
)
with open("contacts.csv", "wb") as f:
    f.write(response.content)
```

**PHP**

```php
$ch = curl_init('https://api.emailit.com/v2/contacts/export?format=csv&audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'Authorization: Bearer your_api_key',
  ],
]);
file_put_contents('contacts.csv', curl_exec($ch));
curl_close($ch);
```

**Ruby**

```ruby
require "net/http"

uri = URI("https://api.emailit.com/v2/contacts/export?format=csv&audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer your_api_key"
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
File.binwrite("contacts.csv", http.request(req).body)
```

**Go**

```go
req, _ := http.NewRequest("GET", "https://api.emailit.com/v2/contacts/export?format=csv&audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2", nil)
req.Header.Set("Authorization", "Bearer your_api_key")

resp, err := http.DefaultClient.Do(req)
if err != nil {
  return err
}
defer resp.Body.Close()

out, _ := os.Create("contacts.csv")
defer out.Close()
io.Copy(out, resp.Body)
```

**Rust**

```rust
let bytes = reqwest::Client::new()
    .get("https://api.emailit.com/v2/contacts/export?format=csv&audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2")
    .bearer_auth("your_api_key")
    .send()
    .await?
    .bytes()
    .await?;
std::fs::write("contacts.csv", &bytes)?;
```

**Java**

```java
import java.net.http.*;
import java.net.URI;
import java.nio.file.Path;

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
  .uri(URI.create("https://api.emailit.com/v2/contacts/export?format=csv&audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2"))
  .header("Authorization", "Bearer your_api_key")
  .GET()
  .build();
client.send(request, HttpResponse.BodyHandlers.ofFile(Path.of("contacts.csv")));
```

**.NET**

```csharp
using System.Net.Http.Headers;

var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "your_api_key");

var bytes = await http.GetByteArrayAsync("https://api.emailit.com/v2/contacts/export?format=csv&audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2");
await File.WriteAllBytesAsync("contacts.csv", bytes);
```

**Laravel**

```php
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Storage;

$csv = Http::withToken('your_api_key')
  ->get('https://api.emailit.com/v2/contacts/export?format=csv&audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2')
  ->body();
Storage::put('contacts.csv', $csv);
```

**cURL**

```bash
curl "https://api.emailit.com/v2/contacts/export?format=csv&audience_id=aud_4KbFmQPy1feMCGAY8F8pAhiZ1u2" \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -o contacts.csv
```

**200**

```text
email,first_name,last_name,unsubscribed,audiences,company,plan,created_at,updated_at
ada@example.com,Ada,Lovelace,false,Newsletter,Analytical Engines,pro,2026-10-01T10:20:31.000000Z,2026-10-01T10:20:31.000000Z
```

**400**

```json
{
  "error": "format must be csv or xlsx"
}
```

**422**

```json
{
  "error": "Export is limited to 10000 contacts. Narrow your filters and try again."
}
```

---
Source: https://emailit.com/fr/docs/api-reference/contacts/export/

## Supprimer un contact — DELETE /contacts/{id}

> Supprimez définitivement un contact et retirez-le de toutes les listes de contacts. Les e-mails déjà envoyés à ce contact restent dans vos logs.

# Supprimer un contact

Supprime définitivement un contact et toutes ses inscriptions aux listes.

`DELETE /contacts/{id}`

Nécessite une clé API `full`. La suppression est irréversible. Pour ne plus envoyer d’e-mails à une personne tout en conservant sa fiche, [mettez à jour le contact](/fr/docs/api-reference/contacts/update/) avec `unsubscribed: true`, ou ajoutez l’adresse à vos [adresses bloquées](/fr/docs/api-reference/suppressions/create/). Déclenche `subscriber.deleted` pour chaque inscription, puis `contact.deleted`.

## Paramètres de chemin

- `id` (string, obligatoire): L’ID du contact (`con_…`) ou son adresse e-mail, encodée pour l’URL.

## Réponse

- `object` (string): Toujours `contact`.

- `id` (string): L’ID du contact supprimé.

- `email` (string): L’adresse e-mail du contact.

- `deleted` (boolean): Toujours `true`.

**Requête** `DELETE /contacts/{id}`

**Node.js**

```javascript
import { Emailit } from '@emailit/node';
const emailit = new Emailit('your_api_key');

await emailit.contacts.delete('con_4Kt4ZXloQR8WGcMsYx8PFCUjokM');
```

**Python**

```python
from emailit import EmailitClient
client = EmailitClient("your_api_key")

client.contacts.delete("con_4Kt4ZXloQR8WGcMsYx8PFCUjokM")
```

**PHP**

```php
$emailit = Emailit::client('your_api_key');

$emailit->contacts()->delete('con_4Kt4ZXloQR8WGcMsYx8PFCUjokM');
```

**Ruby**

```ruby
require "emailit"
client = Emailit::EmailitClient.new("your_api_key")

client.contacts.delete("con_4Kt4ZXloQR8WGcMsYx8PFCUjokM")
```

**Go**

```go
import "github.com/emailit/emailit-go/v2"
client := emailit.NewClient("your_api_key")

err := client.Contacts.Delete("con_4Kt4ZXloQR8WGcMsYx8PFCUjokM")
```

**Rust**

```rust
use emailit::Emailit;

let emailit = Emailit::new("your_api_key");

emailit.contacts.delete("con_4Kt4ZXloQR8WGcMsYx8PFCUjokM").await?;
```

**Java**

```java
import com.emailit.*;

EmailitClient emailit = new EmailitClient("your_api_key");

emailit.contacts().delete("con_4Kt4ZXloQR8WGcMsYx8PFCUjokM");
```

**.NET**

```csharp
using Emailit;

var emailit = new EmailitClient("your_api_key");

emailit.Contacts.Delete("con_4Kt4ZXloQR8WGcMsYx8PFCUjokM");
```

**Laravel**

```php
use Emailit\Laravel\Facades\Emailit;

Emailit::contacts()->delete('con_4Kt4ZXloQR8WGcMsYx8PFCUjokM');
```

**cURL**

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

**200**

```json
{
  "object": "contact",
  "id": "con_4Kt4ZXloQR8WGcMsYx8PFCUjokM",
  "email": "alan@example.com",
  "deleted": true
}
```

**404**

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

---
Source: https://emailit.com/fr/docs/api-reference/contacts/delete/
