Skip to the documentation
API

Add a contact to an audience

Takes an address already in the workspace book and returns the membership, with the contact it points at. There is one membership per audience and contact, so adding somebody already in the audience answers `200` with the original `addedAt` rather than adding a second one or failing. That makes the call safe to retry.

POSTapi.openemail.uk/audiences/{id}/contacts

Runs the real call against your workspace, with your own key.

POST /audiences/{id}/contacts

Takes an address already in the workspace book and returns the membership, with the contact it points at. There is one membership per audience and contact, so adding somebody already in the audience answers 200 with the original addedAt rather than adding a second one or failing. That makes the call safe to retry.

Example

Needs audiences:write.

curl
curl -X POST "$OE/audiences/aud_4c1b8e2a7d9f05c36b4e8a71/contacts" -H "$AUTH" -H 'content-type: application/json' -d '{  "email": "[email protected]"}'
Response
{  "object": "audience_member",  "audienceId": "aud_4c1b8e2a7d9f05c36b4e8a71",  "addedAt": "2026-09-18T09:30:00.000Z",  "contact": {    "object": "contact",    "email": "[email protected]",    "name": "Grace Hopper",    "source": "manual",    "notes": null,    "lastSeenAt": null,    "createdAt": "2026-09-18T09:00:00.000Z",    "updatedAt": "2026-09-18T09:00:00.000Z"  }}

An address that is not a contact is refused with 422 contact_not_found rather than created on the spot. Save it with POST /contacts first.

audiences:write is the only scope checked. Putting a contact in a list is not a write to the contact.

One call per contact. There is no bulk add in this version, and deleting the contact later drops this membership with it.