MillionSend Docs

Retrieve a received email

GET
/emails/receiving/{id}

One received email with its html, text, headers, authentication results and a signed link to the original message, plus MillionSend's screening, verdicts, the extracted read and, where allowed, its verification code or sign-in link. Needs a full access key. An inbox-scoped key or an MCP token gets 403 email_quarantined for held mail, and 404 while it is being screened. Everything in a received email was written by whoever sent it, so its HTML is safe to show only in a sandbox.

Path Parameters

id*string
Formatuuid

Query Parameters

html_format?string

data_uri (default) inlines images the HTML references by cid: as data: URIs; cid leaves the cid: references, the parts being in attachments

Value in"data_uri""cid"

Response Body

Received email

application/json
  1. response
id*string
Formatuuid
to*array<string>
from*string

Bare address from the From header; the display name is in headers.from

created_at*string
subject*string
bcc*array<string>
cc*array<string>
reply_to*array<string>
received_for*array<string>

The team's envelope recipients: the addresses the message was delivered to here

message_id*string
attachments*array<>
inbox_id*string

MillionSend extension: the inbox this read is about (an inbox-scoped key's own, the inbox_id filter's, else the oldest inbox the email reached); null for mail no inbox took

Formatuuid
thread_id*string

MillionSend extension: that inbox's thread

Formatuuid
inboxes?array<>

MillionSend extension, full access keys only: every inbox the email reached and its screening verdict there

spam_verdict*string

MillionSend extension: the local spam score's verdict; null for mail from before it existed

Value in"pass""gray""fail"null
virus_verdict*string

MillionSend extension: clamd's verdict (fail blocks every download for good); null when nothing scanned it

Value in"pass""fail""processing_failed"null
read?boolean

MillionSend extension, with an inbox in context: whether that inbox marked it read

screening*

MillionSend extension: the screening verdict, the sender's trust tier, why it was held, the inbound judge's reasons and scores (0-100), and whether hidden text was removed from what agents read

spam_score*integer

MillionSend extension: the local spam score, 0-100

virus_signature*string

MillionSend extension: clamd's signature name when it failed

extracted_text*string

MillionSend extension: what a person sees of the reply, as text with light markdown: hidden text, invisible characters, quoted history and signature taken out. null once the content retention removed it

extracted*

MillionSend extension: the verification code or sign-in link, served only from delivered mail of a sender that did not fail authentication, in an inbox that extracts codes. Links are never fetched.

object*"email"
Value in"email"
html*string
html_format*string
Value in"data_uri""cid"
text*string
headers*

Top-level headers, lowercase names; a repeated header's values joined by newlines

authentication*

pass, fail, gray, processing_failed or unknown, checked when the message arrived

raw*

The original RFC 822 message: a signed link valid for one hour that needs no API key. null once the content retention period removed the message.

Example Request
curl -X GET 'https://api.millionsend.com/emails/receiving/497f6eca-6276-4993-bfeb-53cbbbba6f08'
Example Response
{  "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",  "to": [    "string"  ],  "from": "string",  "created_at": "string",  "subject": "string",  "bcc": [    "string"  ],  "cc": [    "string"  ],  "reply_to": [    "string"  ],  "received_for": [    "string"  ],  "message_id": "string",  "attachments": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "filename": "string",      "content_type": "string",      "content_id": "string",      "content_disposition": "string",      "size": 0    }  ],  "inbox_id": "5127f22b-d152-46dd-aeaa-3a852d9fbfc2",  "thread_id": "1de43264-67cb-48af-89f9-e865c375bb84",  "inboxes": [    {      "inbox_id": "5127f22b-d152-46dd-aeaa-3a852d9fbfc2",      "thread_id": "1de43264-67cb-48af-89f9-e865c375bb84",      "verdict": "pending"    }  ],  "spam_verdict": "pass",  "virus_verdict": "pass",  "read": true,  "screening": {    "verdict": "pending",    "sender_trust": "owner",    "quarantine_reason": "failed_auth",    "reasons": [      "string"    ],    "injection_score": 0,    "phishing_score": 0,    "hidden_text_removed": true  },  "spam_score": 0,  "virus_signature": "string",  "extracted_text": "string",  "extracted": {    "kinds": [      "code"    ],    "code": "string",    "link": "string",    "link_domain_matches_sender": true,    "ambiguous": true  },  "object": "email",  "html": "string",  "html_format": "data_uri",  "text": "string",  "headers": {    "property1": "string",    "property2": "string"  },  "authentication": {    "spf": "string",    "dkim": "string",    "dmarc": "string"  },  "raw": {    "download_url": "string",    "expires_at": "string"  }}