API Reference

Get Campaign Engagement

GET /campaigns/:id/engagement — list the individual recipients who opened, clicked, or replied.

GET/campaigns/:id/engagement

Returns the per-recipient engagement for a campaign: who opened it, who clicked a link, and who replied. Where the campaign object carries roll-up counts, this endpoint names the individual contacts behind them, so you can sync engaged recipients into a segment or your own CRM.

Each list is ordered newest engagement first and is capped at 500 rows. There are no pagination parameters — limit, after, and before are ignored — so a campaign with more than 500 openers returns only the 500 most recent. Reply text is clipped to 300 characters; fetch the full body with GET /emails/receiving/:id using received_email_id.

Path parameters
idstringrequired

The campaign ID.

Response fields

objectstringoptional

Always campaign_engagement.

campaign_idstringoptional

The campaign this engagement belongs to.

openedarrayoptional

Recipients who opened, each with email, contact_id (nullable), opened_at, and open_count.

clickedarrayoptional

Recipients who clicked a tracked link, each with email, contact_id (nullable), clicked_at, and click_count.

repliedarrayoptional

Replies received, each with email, contact_id (nullable), replied_at (nullable), received_email_id, subject, preview, category (the AI reply intent — interested, neutral, not_interested, or null when not yet classified), and received_at.

import { Mailblastr } from 'mailblastr';

const mb = new Mailblastr('mb_xxxxxxxxx');

const { data, error } = await mb.campaigns.engagement('8f5c2a1e-7b3d-4f9a-9c12-2e6d4a7b8c90');
console.log({ data, error });

Response

{
  "object": "campaign_engagement",
  "campaign_id": "8f5c2a1e-7b3d-4f9a-9c12-2e6d4a7b8c90",
  "opened": [
    {
      "email": "ada@example.com",
      "contact_id": "3c1f7b90-52ad-4e6b-9f01-8d4c2b6e7a13",
      "opened_at": "2026-06-23T22:41:08.113Z",
      "open_count": 3
    }
  ],
  "clicked": [
    {
      "email": "ada@example.com",
      "contact_id": "3c1f7b90-52ad-4e6b-9f01-8d4c2b6e7a13",
      "clicked_at": "2026-06-23T22:42:55.007Z",
      "click_count": 1
    }
  ],
  "replied": [
    {
      "email": "grace@example.com",
      "contact_id": null,
      "replied_at": "2026-06-24T08:12:00.412Z",
      "received_email_id": "b41d9e77-1c05-4f2a-8ab3-6e9d0f5c1274",
      "subject": "Re: Launch week",
      "preview": "Looks great — can you send me the pricing sheet?",
      "category": "interested",
      "received_at": "2026-06-24T08:12:00.412Z"
    }
  ]
}
Requires a full-access key (read scope). Errors: not_found if the campaign does not exist or is not yours.