# Clean lists, built in.

Store your contacts once, unique by email, and group them into audiences you target from a broadcast. A typed property registry keeps your data clean, and a 1,000-row batch upsert gets a list in fast.

## One contact record. Attributes that don't drift.

Audiences are part of the Bird Email API: a contact is unique by email and shared across your audiences, an audience is just a set of those contacts, and attributes always live on the contact, not copied onto every list. The property registry means a typo'd field is rejected at write time, not discovered in a campaign.

## Five things that keep your data clean.

The data model does the bookkeeping, so your lists don't rot.

## Get a whole list in with one call.

Upsert is idempotent on email, so re-running an import updates rather than duplicates. Add up to 1,000 contacts and join them to an audience in the same request, with no separate membership step and no de-dupe pass afterward. Larger lists go up in batches of 1,000. Each call is independent, so an interrupted import is safe to resume where it stopped.

## Fields that can't drift.

Custom contact data goes through a typed registry. Declare each field once as a string, number, or boolean, with an optional fallback, and a typo'd key or wrong-typed value is rejected the moment you write it, not discovered halfway through a campaign. Because attributes live on the contact, not the list, moving someone between audiences never leaves a stale copy behind.

## Works with the rest of Email.

Target the audiences you build here from a broadcast, and the same contacts receive transactional mail through the send API.

## About 40% of the world's commercial email already runs on Bird.

Transactional and marketing email on infrastructure we've run for a decade. Audiences are one capability of the Bird Email API: sending, broadcasts, deliverability, suppression, and analytics ship with it.