Sign inGet started

Get one campaign a watched brand sent

GET
/v1/email/competitive/watchlist/brands/{watchlist_brand_id}/campaigns/{campaign_id}
// Requires Insights preview access for the organization.
const watchlist = await bird.email.competitive.watchlist.get({ range: 30 });
const entry = watchlist.data.find((row) => row.name === "Everlane" && row.watchlist_brand_id);
if (!entry?.watchlist_brand_id) throw new Error("Add Everlane to the watchlist first");
const watchlistBrandId = entry.watchlist_brand_id;
const page = await bird.email.competitive.watchlist.brands.campaigns.list(watchlistBrandId, { range: 30, limit: 1 });
const campaign = page.data[0];
if (!campaign) throw new Error("No captured campaigns");
const report = await bird.email.competitive.watchlist.brands.campaigns.get(watchlistBrandId, campaign.id);
console.log(report);
Antwort200
{
  "id": "3914827265",
  "subject": "The Summer Sale: 40% off everything",
  "sent_at": "2026-08-09T14:02:00Z",
  "image_url": "https://images.example.com/creatives/c154c8c4-6356-40e6-92d2-7c6727ec36ca.jpg",
  "reach": 410000,
  "read_rate": 0.228,
  "has_creative": true,
  "discount_percent": 40,
  "inbox_rate": 0.879,
  "spam_rate": 0.121
}
Returns one campaign an email panel observed a watched brand sending. It carries the same figures the brand's campaign list gives for that campaign, so a page can open one campaign without reading the whole list first.
The campaign has to be one the brand in the path sent. An identifier that belongs to another brand's campaign comes back as not found, whether or not the panel holds it. A workspace can read the campaigns of the brands it watches, and no others.
The panel folds a day of low-volume sending into one synthetic entry, and the campaign list leaves those out. They stand for a day of sending rather than for a campaign anyone sent, so they come back as not found here as well.
API-key calls require Insights preview access for your organization.
Parameter
watchlist_brand_id
string
The watched brand that sent the campaign.
campaign_id
string
The campaign to return, taken from the brand's campaign list.
Antwort-Payload
id
string
erforderlich
The identifier for this campaign. Use it to fetch this one campaign on its own.
It is a string, and it needs to stay one. The values are long enough that JavaScript, and any other language that stores every number as a floating point value, will round them, and a rounded identifier matches no campaign at all. Compare it and pass it back as text.
subject
string
erforderlich
The subject line the panel saw on this campaign.
sent_at
string
erforderlich
When the panel first saw this campaign arrive.
image_url
nullable string
erforderlich
Where the panel's capture of the rendered email can be fetched, null when it captured none. Panels image only some of what they observe, so an absent creative is an ordinary outcome rather than a failed one. The image is served from the panel's own host rather than from ours, so a page embedding it has to allow that host.
reach
nullable integer
erforderlich
Estimated recipients this campaign reached, null when the panel observed the campaign but published no estimate for it.
read_rate
nullable number
erforderlich
Estimated share of recipients who read this campaign, null when the panel published no rate for it. Panel read rates count dwell time, so they do not move with the automatic opens that inflate a sender's own open rate.
has_creative
boolean
erforderlich
Whether the panel captured the rendered email for this campaign.
discount_percent
nullable number
erforderlich
The discount the subject line leads with, null when it names none. Read from the subject text, so it finds a stated offer and not one revealed inside the email.
inbox_rate
nullable number
erforderlich
Share of this campaign that reached an inbox, null when the panel observed it without recording where it landed. It describes this send rather than the brand's domain, so a single bad campaign is visible against a brand whose overall placement still looks healthy.
spam_rate
nullable number
erforderlich
Share of this campaign that was filed as spam, null on the same terms.