---
title: "Set a contact's audiences"
description: "Says exactly which audiences one contact is in, in one call. The contact joins every audience in `audienceIds` it is not in yet and leaves every other one. The default audience is always kept, so an empty list leaves the contact in the default audience alone."
url: "https://openemail.uk/docs/api/contacts/audiences"
area: "API"
category: "Mailbox"
---

# Set a contact's audiences

Says exactly which audiences one contact is in, in one call. The contact joins every audience in `audienceIds` it is not in yet and leaves every other one. The default audience is always kept, so an empty list leaves the contact in the default audience alone.

`PUT /contacts/{email}/audiences`

## PUT /contacts/{email}/audiences

Says exactly which audiences one contact is in, in one call. The contact joins every audience in `audienceIds` it is not in yet and leaves every other one. The default audience is always kept, so an empty list leaves the contact in the default audience alone.

## Example

Needs `audiences:write`, because it writes memberships rather than the contact. URL-encode the `@`. `audienceIds` holds up to 100 ids.

**curl**

```
curl -X PUT "$OE/contacts/grace%40example.com/audiences" -H "$AUTH" -H 'content-type: application/json' -d '{
  "audienceIds": ["aud_4c1b8e2a7d9f05c36b4e8a71"]
}'
```

**Response**

```
{
  "object": "contact",
  "email": "grace@example.com",
  "name": "Grace Hopper",
  "source": "manual",
  "notes": null,
  "lastSeenAt": null,
  "createdAt": "2026-09-18T09:00:00.000Z",
  "updatedAt": "2026-09-18T09:00:00.000Z",
  "audiences": [
    { "id": "aud_9f2c4b7e1a0d63d84c5f2e7b", "name": "All contacts", "builtin": "default" },
    { "id": "aud_4c1b8e2a7d9f05c36b4e8a71", "name": "Product updates", "builtin": null }
  ]
}
```

> The contact has to exist already. An address that is not in the book is a `404` `contact_not_found`. Create it with `POST /contacts`, which takes `audienceIds` too.

> An id that names no audience in this workspace is a `404` `audience_not_found` and nothing changes, so a typo cannot quietly take somebody out of a list. Sending the same call again changes nothing.

> The response is the contact as `GET /contacts/{email}` returns it, with every audience it is in after the change.
