SentEmail object
A SentEmail represents one message Cirrus dispatched on behalf of a user in your organization, along with the engagement it has received. It is the row shape returned by /api/v1alpha1/buyer-signals/sent-emails and the anchor for per-recipient signal drill-downs.
Message bodies are not exposed — the full body of the outbound message lives in the sender's mailbox.
The SentEmail schema
{
"id": "semail_...",
"subject": "Following up on Q3 pipeline forecasting",
"sender": {
"userId": "usr_...",
"displayName": "Alex Rivera"
},
"recipientEmails": ["guest@example.com"],
"sentAt": "2026-08-11T14:30:00Z",
"opens": 5,
"clicks": 1,
"replies": 1,
"lastOpenAt": "2026-08-12T09:22:03Z",
"lastClickAt": "2026-08-12T09:22:41Z",
"lastReplyAt": "2026-08-12T10:14:07Z",
"lastOpenLocation": "New York, NY",
"emailType": "standard",
"blastId": null
}Fields
id string
Sent-email identifier, prefixed semail_. Stable — the same physical message keeps this id across every subsequent open, click, and reply that arrives.
subject string
Subject line as it was sent. For blasts, merge fields () are preserved as placeholders — the per-recipient rendered form is not stored.
sender object
Cirrus user who sent the message.
| Attribute | Type | Description |
|---|---|---|
userId | string | User identifier, prefixed usr_. |
displayName | string | Concatenated first + last, falling back to email. |
recipientEmails array
Every address the message was sent to (to + cc + bcc combined). One-recipient messages are the common case; multi-recipient rows appear when a user cc'd colleagues or when a blast batched a small group into one physical send.
For per-recipient engagement counts, hit the sent email's /signals drill-down — this array only tells you who was on the envelope, not who engaged.
sentAt string
ISO 8601 UTC. When Cirrus dispatched the message.
opens, clicks, replies number
Raw event counts across all recipients on the send. A recipient who opens the same email three times contributes 3 to opens. For unique-recipient stats (how many people replied), pull the /signals drill-down and count replies > 0 rows.
lastOpenAt, lastClickAt, lastReplyAt string
(optional) ISO 8601 UTC. Timestamp of the most recent event of each type. null when no such event has occurred.
lastReplyAt is the "did this email get a response, and when" answer — the field to sort on when you're triaging a follow-up queue.
lastOpenLocation string
(optional) Coarse city-level geolocation of the IP that fired the most recent tracking-pixel open. null when the recipient's mail client suppressed the pixel, when the location wasn't confident, or when no open has been recorded.
Not a security signal — VPN and mail-scanner services will attribute opens to other cities routinely.
emailType string
| Value | Meaning |
|---|---|
standard | One-off email sent from a user's Sidebar / Gmail / Outlook integration. |
email-blast | Message dispatched as part of a bulk campaign. blastId is populated. |
blastId string
(optional) When emailType is email-blast, the parent blast's identifier. Use it to fetch the blast-level aggregates via Email Blasts. null for standard sends.