Skip to content
Preview. The endpoints on this page are illustrative and are likely to change as they move toward general availability. Documentation is published in advance so you can start shaping your integration; treat request and response details as subject to revision.

Email Blasts

Read blast-level engagement analytics — summary tiles, top-blast rankings, per-blast performance, activity timeseries, and per-recipient engagement.

email-blasts:read covers every endpoint on this page. For per-recipient send data across every email (not just blasts), see Buyer Signals.

Endpoints on this page

MethodEndpointDescription
GET/api/v1alpha1/email-blasts/summaryAggregate tile stats across a period. Details ↓
GET/api/v1alpha1/email-blasts/topTop-performing blasts ranked by engagement. Details ↓
GET/api/v1alpha1/email-blastsTable of blasts sent in the period. Details ↓
GET/api/v1alpha1/email-blasts/{blastId}Summary + performance for one blast. Details ↓
GET/api/v1alpha1/email-blasts/{blastId}/activityDaily activity timeseries for one blast. Details ↓
GET/api/v1alpha1/email-blasts/{blastId}/recipientsPer-recipient engagement rows for one blast. Details ↓

Get summary tiles

GET /api/v1alpha1/email-blasts/summary

Dashboard-tile aggregates across the requested period. One object, no pagination.

Query parameters

ParameterTypeDescription
periodDaysnumber7, 14, or 30. Default 7.
ownerUserIdstring(optional) usr_... id — restrict to blasts owned by one user.

Response

  • totalSuccessfulSent excludes bounces and pre-send failures. Percentages are computed against totalSuccessfulSent, not totalRecipients.

bash
curl -s "https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/summary?periodDays=30" \
  -H "X-Cirrus-Api-Key: $TOKEN"
python
import requests

response = requests.get(
    "https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/summary",
    headers={"X-Cirrus-Api-Key": token},
    params={"periodDays": 30},
)
response.raise_for_status()
summary = response.json()
csharp
using System.Net.Http;
using System.Web;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Cirrus-Api-Key", token);

var query = HttpUtility.ParseQueryString(string.Empty);
query["periodDays"] = "30";

var uri = new UriBuilder("https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/summary")
{
    Query = query.ToString()
}.Uri;

var response = await client.GetAsync(uri);
response.EnsureSuccessStatusCode();
var summary = await response.Content.ReadAsStringAsync();
json
{
  "periodDays": 30,
  "totalBlasts": 12,
  "totalRecipients": 4820,
  "totalSuccessfulSent": 4778,
  "totalOpens": 2310,
  "totalClicks": 442,
  "totalReplies": 118,
  "openPercentage": 48.3,
  "clickPercentage": 9.2,
  "replyPercentage": 2.5
}

Get top blasts

GET /api/v1alpha1/email-blasts/top

Blasts ranked by engagement (rankingScore) across the period. The dashboard uses this to power its "top-performing blasts" carousel.

Query parameters

ParameterTypeDescription
periodDaysnumber7, 14, or 30. Default 7.
ownerUserIdstring(optional) usr_... id.
limitnumberClamped 1–20, default 5.

Response

  • unique* counts are per-recipient — a recipient who opens three times contributes 1 to uniqueOpens. Rates are computed off successfulSentCount.
  • rankingScore is a blended engagement metric (weighted mix of openRate, clickRate, replyRate) that Cirrus uses to sort. Not documented as a formula because the weighting can change; consume it as an opaque relative ranking.

bash
curl -s "https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/top?periodDays=30&limit=5" \
  -H "X-Cirrus-Api-Key: $TOKEN"
python
import requests

response = requests.get(
    "https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/top",
    headers={"X-Cirrus-Api-Key": token},
    params={"periodDays": 30, "limit": 5},
)
response.raise_for_status()
top = response.json()
csharp
using System.Net.Http;
using System.Web;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Cirrus-Api-Key", token);

var query = HttpUtility.ParseQueryString(string.Empty);
query["periodDays"] = "30";
query["limit"] = "5";

var uri = new UriBuilder("https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/top")
{
    Query = query.ToString()
}.Uri;

var response = await client.GetAsync(uri);
response.EnsureSuccessStatusCode();
var top = await response.Content.ReadAsStringAsync();
json
{
  "items": [
    {
      "blastId": "blast_...",
      "blastName": "Q3 product update — pipeline forecasting",
      "recipientCount": 482,
      "successfulSentCount": 478,
      "uniqueOpens":   231,
      "uniqueClicks":   44,
      "uniqueReplies":  12,
      "openRate":  48.3,
      "clickRate":  9.2,
      "replyRate":  2.5,
      "rankingScore": 78.4
    }
  ]
}

List email blasts

GET /api/v1alpha1/email-blasts

Table of blasts sent in the period, one row per blast. This is the primary browse endpoint — supports search, sort, and paging.

Query parameters

ParameterTypeDescription
cursorstringStandard keyset cursor.
limitnumberClamped 1–100, default 25.
sortstringsentAt, openRate, clickRate, replyRate, engagementScore, recipientCount. Prefix - for descending. Default -sentAt.
periodDaysnumber7, 14, or 30. Default 7.
ownerUserIdstring(optional) usr_... id.
searchstring(optional) Substring match on blast name or template name. Case-insensitive.

Response

See the EmailBlastmodel for the full field reference.


bash
curl -s "https://altus.cirrusinsight.com/api/v1alpha1/email-blasts?periodDays=30&limit=25" \
  -H "X-Cirrus-Api-Key: $TOKEN"
python
import requests

response = requests.get(
    "https://altus.cirrusinsight.com/api/v1alpha1/email-blasts",
    headers={"X-Cirrus-Api-Key": token},
    params={"periodDays": 30, "limit": 25},
)
response.raise_for_status()
page = response.json()
csharp
using System.Net.Http;
using System.Web;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Cirrus-Api-Key", token);

var query = HttpUtility.ParseQueryString(string.Empty);
query["periodDays"] = "30";
query["limit"] = "25";

var uri = new UriBuilder("https://altus.cirrusinsight.com/api/v1alpha1/email-blasts")
{
    Query = query.ToString()
}.Uri;

var response = await client.GetAsync(uri);
response.EnsureSuccessStatusCode();
var page = await response.Content.ReadAsStringAsync();
json
{
  "items": [
    {
      "blastId": "blast_...",
      "blastName": "Q3 product update — pipeline forecasting",
      "templateName": "Product Update — Q3",
      "sentAt": "2026-07-14T13:00:12Z",
      "sender": {
        "userId": "usr_...",
        "displayName": "Alex Rivera"
      },
      "recipientCount": 482,
      "openRate": 48.3,
      "clickRate": 9.2,
      "replyRate": 2.5,
      "engagementScore": 78.4
    }
  ],
  "nextCursor": null
}

Get an email blast

GET /api/v1alpha1/email-blasts/{blastId}

One blast's summary + performance snapshot. Two nested objects: summary (identity — name, template, sender, status, recipient count) and performance (engagement rates + raw counts).

Response

  • status is one of: Draft, Assigned, Scheduled, SendNow, Rejected, Processing, Queued, Sending, Success, PartialSuccess, Failure, Sent, PastDue. Most integrations only care about Sending and Sent.
  • successfulSentCount subtracts pre-send failures and hard bounces from recipientCount. Rates on performance are computed off successfulSentCount.

Errors

  • 404 email-blast-not-found — no blast with that id in your org.

bash
curl -s "https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/blast_..." \
  -H "X-Cirrus-Api-Key: $TOKEN"
python
import requests

response = requests.get(
    f"https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/{blast_id}",
    headers={"X-Cirrus-Api-Key": token},
)
response.raise_for_status()
blast = response.json()
csharp
using System.Net.Http;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Cirrus-Api-Key", token);

var response = await client.GetAsync(
    $"https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/{blastId}");
response.EnsureSuccessStatusCode();
var blast = await response.Content.ReadAsStringAsync();
json
{
  "blastId": "blast_...",
  "summary": {
    "blastName": "Q3 product update — pipeline forecasting",
    "templateName": "Product Update — Q3",
    "subject": "Q3 product update — new pipeline forecasting",
    "sender": {
      "userId": "usr_...",
      "displayName": "Alex Rivera"
    },
    "sentAt": "2026-07-14T13:00:12Z",
    "status": "Sent",
    "recipientCount": 482,
    "successfulSentCount": 478
  },
  "performance": {
    "totalOpens":  542,
    "totalClicks":  61,
    "totalReplies": 14,
    "openRate":  48.3,
    "clickRate":  9.2,
    "replyRate":  2.5,
    "engagementScore": 78.4
  }
}

Get blast activity

GET /api/v1alpha1/email-blasts/{blastId}/activity

Daily activity timeseries for one blast. Same shape as /buyer-signals/activity, scoped to a single blast.

Query parameters

ParameterTypeDescription
periodDaysnumber7, 14, or 30. Default 7. Windowed relative to today, not the blast's send time.

Response

  • sends is typically zero for days after the send date — the blast dispatches once, then engagement trickles in. Historical opens/clicks/replies show up on their respective event dates.

Errors

  • 404 email-blast-not-found — no blast with that id in your org.

bash
curl -s "https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/blast_.../activity?periodDays=14" \
  -H "X-Cirrus-Api-Key: $TOKEN"
python
import requests

response = requests.get(
    f"https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/{blast_id}/activity",
    headers={"X-Cirrus-Api-Key": token},
    params={"periodDays": 14},
)
response.raise_for_status()
chart = response.json()
csharp
using System.Net.Http;
using System.Web;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Cirrus-Api-Key", token);

var query = HttpUtility.ParseQueryString(string.Empty);
query["periodDays"] = "14";

var uri = new UriBuilder(
    $"https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/{blastId}/activity")
{
    Query = query.ToString()
}.Uri;

var response = await client.GetAsync(uri);
response.EnsureSuccessStatusCode();
var chart = await response.Content.ReadAsStringAsync();
json
{
  "periodDays": 14,
  "items": [
    { "date": "2026-08-11", "action": "sends",   "count":   0 },
    { "date": "2026-08-11", "action": "opens",   "count":  22 },
    { "date": "2026-08-11", "action": "clicks",  "count":   4 },
    { "date": "2026-08-11", "action": "replies", "count":   1 }
  ]
}

List blast recipients

GET /api/v1alpha1/email-blasts/{blastId}/recipients

Per-recipient engagement rows for one blast — one row per contact who was on the send list.

Query parameters

ParameterTypeDescription
cursorstringStandard keyset cursor.
limitnumberClamped 1–100, default 25.
sortstringlastReplyAt, lastOpenAt, replies, opens, sentAt. Prefix - for descending. Default -lastOpenAt.
hasRepliedboolean(optional) true restricts to recipients whose reply was tracked.
searchstring(optional) Substring match on recipient email.

Response

  • Same shape as the sent-emails signal drill-down under Buyer Signals — the columns are the tracked-event roll-up per recipient. Blasts just scope it to one campaign's recipient list.

Errors

  • 404 email-blast-not-found — no blast with that id in your org.
bash
curl -s "https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/blast_.../recipients?limit=50" \
  -H "X-Cirrus-Api-Key: $TOKEN"
python
import requests

response = requests.get(
    f"https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/{blast_id}/recipients",
    headers={"X-Cirrus-Api-Key": token},
    params={"limit": 50},
)
response.raise_for_status()
page = response.json()
csharp
using System.Net.Http;
using System.Web;

var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-Cirrus-Api-Key", token);

var query = HttpUtility.ParseQueryString(string.Empty);
query["limit"] = "50";

var uri = new UriBuilder(
    $"https://altus.cirrusinsight.com/api/v1alpha1/email-blasts/{blastId}/recipients")
{
    Query = query.ToString()
}.Uri;

var response = await client.GetAsync(uri);
response.EnsureSuccessStatusCode();
var page = await response.Content.ReadAsStringAsync();
json
{
  "items": [
    {
      "recipientEmail": "guest@example.com",
      "sentAt": "2026-07-14T13:00:14Z",
      "opens":   5,
      "clicks":  1,
      "replies": 1,
      "lastOpenAt":  "2026-07-14T14:12:03Z",
      "lastReplyAt": "2026-07-14T15:22:18Z",
      "lastOpenLocation": "New York, NY"
    }
  ],
  "nextCursor": null
}

Raleigh, NC — a Cirruspath, Inc. company