# Export broadcasts as CSV

`GET /v1/email/broadcasts/export`

Downloads the workspace's broadcasts as a CSV file, one row per broadcast,
newest first. The header names fifteen columns, in this order:
`created_at`, `broadcast_id`, `status`, `template_name`, `audience_id`,
`audience_name`, `recipient_count`, `sent_count`, `delivered_count`,
`track_opens`, `open_rate`, `track_clicks`, `click_rate`, `scheduled_at`
and `sent_at`. `broadcast_id` is what joins a row back to the rest of the
API. It takes the same filters as the broadcast list, so the file matches
what the list shows for the same query. `recipient_count` is empty until a
send resolves the audience, so an empty cell there means the broadcast has
no recipient list yet rather than a list of nobody.

`open_rate` and `click_rate` are decimal fractions to four places, over the
recipients the message reached: `open_rate` is unique non-prefetched opens
divided by that number, and `click_rate` is unique clicks divided by it.
That divisor is not the `delivered_count` column, which resolves each
recipient to a single status and so counts a recipient who delivered and
then complained under the complaint, so neither rate can be reproduced from
this file alone. Either is empty when its `track_opens` or `track_clicks`
flag is `false`, and also when the message reached nobody, so an empty rate
does not mean tracking is off. Both flags default to `true` and the export
narrows by no status of its own, so a `draft` or `scheduled` row is included
unless `status` excludes it, and carries `track_opens` as `true` with
`open_rate` empty.

A text cell whose first character is `=`, `+`, `-`, `@`, a tab or a carriage
return is written with a leading apostrophe, so a spreadsheet reads it as
text rather than as a formula. A value that begins with an apostrophe of
its own is written unchanged, so the original text cannot always be
recovered from the CSV cell. Match records by `broadcast_id` or `audience_id`,
rather than by `template_name` or `audience_name`.

The file is complete or it is refused: a query matching more broadcasts than
one file carries returns a 422 naming the limit rather than a truncated
download. Narrow it with `created_after` and `created_before` and request
each window separately.

## Code samples

### cURL

```sh
curl -X GET "https://us1.platform.bird.com/v1/email/broadcasts/export" \
  -H "Authorization: Bearer $TOKEN"
```

## Query parameters

- `status` (array): Filter by lifecycle status. Repeat the parameter to match more than one status, for example `?status=accepted&status=sending`.
- `audience_id` (string): Filter by audience. Only broadcasts that use this audience are returned.
- `tag` (string): Filter by tag. Pass `name` to match any broadcast that has that tag name, or pass `name:value` to match a specific tag pair, for example `campaign:spring_launch`.
- `q` (string): Case-insensitive substring match against the broadcast's tag names and values, or the referenced template's name.
- `created_after` (string): Limits the response to resources created at or after this timestamp. Combine it with `created_before` to select a time window. Use an RFC 3339 timestamp with a timezone offset.
- `created_before` (string): Limits the response to resources created before this timestamp. Combine it with `created_after` to select a time window. Use an RFC 3339 timestamp with a timezone offset.

## Related resources

- [Getting started with email](/learn/email/getting-started-with-email) (video)
- [Email](/products/email) (product)
- [Build your first integration](/learn/paths/integration) (course)
- [Send your first email](/docs/get-started/send-your-first-email) (docs)

[Get an implementation brief](/learn/workspace?topic=email)
