e2a-dev · Schema

MessageView

CompanyEmailOpenSourceAPIAI

Properties

Name Type Description
attachments array
authentication object Inbound SMTP authentication evidence. Only dmarc.status=pass authenticates the RFC 5322 From domain; even a pass does not authenticate the mailbox local part, a person, or message content. Null means
body object
cc array
conversation_id string
created_at string
deleted_at string When the message was moved to the trash. Omitted for live messages. A trashed message is restorable until purged — 30 days after deletion by default (deployment-configurable). Live message data is oth
delivered_to string The envelope Delivered-To address — this delivery's per-agent target (the mailbox that actually received this row), distinct from the To header (the to array).
delivery_detail string
delivery_status string Outbound delivery rollup (worst recipient status by precedence; outbound only). Open set; tolerate unknown values. Known values: accepted, sending, sent, delivered, deferred, bounced, complained, fail
direction string
envelope_from stringnull SMTP MAIL FROM address for inbound SMTP delivery; null for outbound messages, a null reverse path, or providerless delivery.
flag_reason string
flagged boolean
header_from stringnull Parsed RFC 5322 From address for inbound mail or the sender identity for outbound mail; null when unavailable and never replaced by Reply-To.
hold_reason object
id string
labels array
parsed object
protection arraynull Screening breakdown behind the hold — detector categories + rationale (review surface only, beta).
raw_message stringnull Base64-encoded canonical RAW MIME. Required but null while an outbound message is pending review because reviewer-editable content lives in body until approval composes the final MIME; non-null for in
read_status string
reply_to array The parsed Reply-To header of an inbound message. Populated for inbound only; always empty for outbound (a Reply-To you SET on a send is a request-side field on the send/reply/forward body and is not
review_status string Review-hold lifecycle (outbound only). Open set; tolerate unknown values. Known values: pending_review, sent, review_rejected, review_expired_approved, review_expired_rejected. Note: an APPROVED outbo
scheduled_at string Beta: scheduled sending may change before it is declared stable. Future instant a scheduled outbound send was queued to be submitted (outbound only; treat as "not before"). Set when the message was cr
sent_as string From identity used at relay accept time (outbound only). Open set; tolerate unknown values. Known values: own_address, relay.
size_bytes integer RAW MIME byte length of the whole stored message (headers + bodies + encoded attachments as transported). Distinct from attachments[].size_bytes, which is one attachment's DECODED payload size. This v
subject string
thread_id string Beta: server-owned email thread identity. This field may evolve or be removed before it is declared stable. Omitted when no thread has been assigned.
to array
verified_domain stringnull RFC 5322 Author Domain validated by an aligned DMARC pass. Null for non-pass verdicts and deliveries without inbound SMTP evaluation — this includes dmarc.status=none (sender publishes no DMARC record
webhook_error string
webhook_status string
View JSON Schema on GitHub

JSON Schema

e2a-dev-message-view-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/e2a-dev/json-schema/e2a-dev-message-view-schema.json",
  "title": "MessageView",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/_original/e2a-dev-api-openapi.yml#/components/schemas/MessageView",
  "additionalProperties": true,
  "properties": {
    "attachments": {
      "items": {
        "$ref": "#/$defs/AttachmentMetaView"
      },
      "type": "array"
    },
    "authentication": {
      "anyOf": [
        {
          "$ref": "#/$defs/Authentication"
        },
        {
          "maxProperties": 0,
          "minProperties": 1,
          "type": [
            "object",
            "null"
          ]
        }
      ],
      "description": "Inbound SMTP authentication evidence. Only dmarc.status=pass authenticates the RFC 5322 From domain; even a pass does not authenticate the mailbox local part, a person, or message content. Null means there was no authenticating inbound SMTP peer, as with outbound or providerless loopback delivery."
    },
    "body": {
      "$ref": "#/$defs/MessageBodyView"
    },
    "cc": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "conversation_id": {
      "type": "string"
    },
    "created_at": {
      "format": "date-time",
      "type": "string"
    },
    "deleted_at": {
      "description": "When the message was moved to the trash. Omitted for live messages. A trashed message is restorable until purged — 30 days after deletion by default (deployment-configurable). Live message data is otherwise retained indefinitely.",
      "format": "date-time",
      "type": "string"
    },
    "delivered_to": {
      "description": "The envelope Delivered-To address — this delivery's per-agent target (the mailbox that actually received this row), distinct from the To header (the to array).",
      "type": "string"
    },
    "delivery_detail": {
      "type": "string"
    },
    "delivery_status": {
      "description": "Outbound delivery rollup (worst recipient status by precedence; outbound only). Open set; tolerate unknown values. Known values: accepted, sending, sent, delivered, deferred, bounced, complained, failed. Lifecycle: accepted → sending → sent → delivered | deferred | bounced | complained | failed. While a future scheduled_at is pending, delivery_status remains accepted; scheduled is the SendResultView.status presentation value, not a delivery_status. (Legacy 'queued' is superseded by 'accepted'.)",
      "type": "string"
    },
    "direction": {
      "enum": [
        "inbound",
        "outbound"
      ],
      "type": "string"
    },
    "envelope_from": {
      "description": "SMTP MAIL FROM address for inbound SMTP delivery; null for outbound messages, a null reverse path, or providerless delivery.",
      "type": [
        "string",
        "null"
      ]
    },
    "flag_reason": {
      "type": "string",
      "x-stability-level": "beta"
    },
    "flagged": {
      "type": "boolean",
      "x-stability-level": "beta"
    },
    "header_from": {
      "description": "Parsed RFC 5322 From address for inbound mail or the sender identity for outbound mail; null when unavailable and never replaced by Reply-To.",
      "type": [
        "string",
        "null"
      ]
    },
    "hold_reason": {
      "$ref": "#/$defs/HoldReasonView",
      "x-stability-level": "beta"
    },
    "id": {
      "type": "string"
    },
    "labels": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "parsed": {
      "$ref": "#/$defs/MessageParsedView"
    },
    "protection": {
      "description": "Screening breakdown behind the hold — detector categories + rationale (review surface only, beta).",
      "items": {
        "$ref": "#/$defs/ProtectionFindingView"
      },
      "type": [
        "array",
        "null"
      ],
      "x-stability-level": "beta"
    },
    "raw_message": {
      "contentEncoding": "base64",
      "description": "Base64-encoded canonical RAW MIME. Required but null while an outbound message is pending review because reviewer-editable content lives in body until approval composes the final MIME; non-null for inbound and composed outbound messages.",
      "type": [
        "string",
        "null"
      ]
    },
    "read_status": {
      "type": "string"
    },
    "reply_to": {
      "description": "The parsed Reply-To header of an inbound message. Populated for inbound only; always empty for outbound (a Reply-To you SET on a send is a request-side field on the send/reply/forward body and is not echoed back here).",
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "review_status": {
      "description": "Review-hold lifecycle (outbound only). Open set; tolerate unknown values. Known values: pending_review, sent, review_rejected, review_expired_approved, review_expired_rejected. Note: an APPROVED outbound hold reads as sent here — the message view intentionally collapses the approved outcome into the delivery lifecycle. The distinct review_approved spelling appears only in the approve result (SendResultView.status, for inbound release) and the email.review_approved webhook event, not in this field.",
      "type": "string"
    },
    "scheduled_at": {
      "description": "Beta: scheduled sending may change before it is declared stable. Future instant a scheduled outbound send was queued to be submitted (outbound only; treat as \"not before\"). Set when the message was created with a future send_at and retained afterwards; omitted for immediate sends. Moving the message to trash before provider submission starts prevents submission; if submission already has a fresh lease, delete returns 409 send_in_progress. Restoring before scheduled_at re-arms it; restoring at or after scheduled_at returns it live with delivery_status=failed and leaves the send canceled.",
      "format": "date-time",
      "type": "string",
      "x-stability-level": "beta"
    },
    "sent_as": {
      "description": "From identity used at relay accept time (outbound only). Open set; tolerate unknown values. Known values: own_address, relay.",
      "type": "string"
    },
    "size_bytes": {
      "description": "RAW MIME byte length of the whole stored message (headers + bodies + encoded attachments as transported). Distinct from attachments[].size_bytes, which is one attachment's DECODED payload size. This value is the dominant term of the account's storage-quota accounting (usage.storage_bytes).",
      "format": "int64",
      "type": "integer"
    },
    "subject": {
      "type": "string"
    },
    "thread_id": {
      "description": "Beta: server-owned email thread identity. This field may evolve or be removed before it is declared stable. Omitted when no thread has been assigned.",
      "type": "string",
      "x-stability-level": "beta"
    },
    "to": {
      "items": {
        "type": "string"
      },
      "type": "array"
    },
    "verified_domain": {
      "description": "RFC 5322 Author Domain validated by an aligned DMARC pass. Null for non-pass verdicts and deliveries without inbound SMTP evaluation — this includes dmarc.status=none (sender publishes no DMARC record, common and NOT itself suspicious) as well as dmarc.status=fail (an actual mismatch). Only DMARC ties a passing SPF or DKIM identity back to this header domain; a bare SPF or DKIM pass without DMARC does not. This authenticates the domain, not the address local part, individual sender, or message content.",
      "type": [
        "string",
        "null"
      ]
    },
    "webhook_error": {
      "type": "string"
    },
    "webhook_status": {
      "type": "string"
    }
  },
  "required": [
    "id",
    "header_from",
    "envelope_from",
    "verified_domain",
    "authentication",
    "to",
    "cc",
    "reply_to",
    "delivered_to",
    "subject",
    "conversation_id",
    "direction",
    "read_status",
    "labels",
    "created_at",
    "raw_message",
    "attachments"
  ],
  "type": "object",
  "$defs": {
    "AttachmentMetaView": {
      "additionalProperties": true,
      "properties": {
        "content_id": {
          "description": "Content-ID (angle brackets stripped) for an inline part referenced by a body 'cid:' URL, e.g. an embedded image; the key a cid: reference resolves against. Omitted for non-inline attachments.",
          "type": "string"
        },
        "content_type": {
          "type": "string"
        },
        "filename": {
          "type": "string"
        },
        "index": {
          "description": "Stable 0-based attachment index (document order) — the fetch key for the attachment-bytes endpoint.",
          "format": "int64",
          "type": "integer"
        },
        "size_bytes": {
          "description": "DECODED attachment payload size in bytes (Content-Transfer-Encoding undone) — the size of the file a download yields, not its encoded size inside the raw MIME.",
          "format": "int64",
          "type": "integer"
        }
      },
      "required": [
        "size_bytes",
        "index"
      ],
      "type": "object"
    },
    "Authentication": {
      "additionalProperties": true,
      "properties": {
        "dkim": {
          "description": "One result per DKIM signature, in message header order. An unsigned message carries an empty array.",
          "items": {
            "$ref": "#/$defs/DKIMResult"
          },
          "type": "array"
        },
        "dmarc": {
          "$ref": "#/$defs/DMARCResult",
          "description": "DMARC evaluation of the RFC 5322 Author Domain against aligned SPF and DKIM evidence."
        },
        "spf": {
          "$ref": "#/$defs/SPFResult",
          "description": "SPF evidence for the SMTP peer and RFC 5321 identity."
        }
      },
      "required": [
        "spf",
        "dkim",
        "dmarc"
      ],
      "type": "object"
    },
    "DKIMResult": {
      "additionalProperties": true,
      "properties": {
        "aligned": {
          "description": "Whether a passing DKIM signing domain aligns with the RFC 5322 Author Domain under the discovered DMARC policy; null unless status is pass and an applicable DMARC record was discovered.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "detail": {
          "description": "Free-text diagnostic for humans and logs. Never parse or branch on this field.",
          "type": "string"
        },
        "domain": {
          "description": "DKIM signing domain from the signature d= tag; null when it could not be parsed.",
          "type": [
            "string",
            "null"
          ]
        },
        "selector": {
          "description": "DKIM selector from the signature s= tag; null when it could not be parsed.",
          "type": [
            "string",
            "null"
          ]
        },
        "status": {
          "description": "Result for this DKIM signature. policy means e2a deliberately refused the signature, such as one using the unsafe l= body-length tag.",
          "enum": [
            "pass",
            "fail",
            "none",
            "neutral",
            "policy",
            "temperror",
            "permerror"
          ],
          "type": "string"
        }
      },
      "required": [
        "status",
        "domain",
        "selector",
        "aligned"
      ],
      "type": "object"
    },
    "DMARCResult": {
      "additionalProperties": true,
      "properties": {
        "aligned_by": {
          "description": "Mechanisms that both passed and aligned. Empty unless status is pass; each mechanism appears at most once.",
          "items": {
            "enum": [
              "spf",
              "dkim"
            ],
            "type": "string"
          },
          "type": "array"
        },
        "detail": {
          "description": "Free-text diagnostic for humans and logs. Never parse or branch on this field.",
          "type": "string"
        },
        "domain": {
          "description": "RFC 5322 Author Domain evaluated by DMARC; null when no single valid Author Domain exists.",
          "type": [
            "string",
            "null"
          ]
        },
        "policy": {
          "description": "Effective policy requested by the applicable DMARC record. This is sender-published metadata, not an action e2a took and not authentication strength.",
          "enum": [
            "none",
            "quarantine",
            "reject"
          ],
          "type": [
            "string",
            "null"
          ]
        },
        "status": {
          "description": "DMARC verdict. Only pass authenticates domain-authorized use of the RFC 5322 Author Domain. none means the sender publishes no DMARC record (common, not itself suspicious) and is distinct from fail, an actual alignment mismatch.",
          "enum": [
            "pass",
            "fail",
            "none",
            "temperror",
            "permerror"
          ],
          "type": "string"
        }
      },
      "required": [
        "status",
        "domain",
        "policy",
        "aligned_by"
      ],
      "type": "object"
    },
    "HoldReasonView": {
      "additionalProperties": true,
      "properties": {
        "category": {
          "description": "Top screening category when a scan hold has detail enrichment.",
          "type": "string"
        },
        "code": {
          "description": "Stable machine-readable hold code. Open set; tolerate unknown values.",
          "type": "string"
        },
        "confidence": {
          "description": "Screening confidence from 0 through 1 when available. Intended for expanded technical detail, not the queue summary.",
          "format": "double",
          "type": "number"
        },
        "detail": {
          "description": "Validated plain-language detector rationale when available.",
          "type": "string"
        },
        "summary": {
          "description": "Plain-language explanation suitable for showing directly to a reviewer.",
          "type": "string"
        },
        "type": {
          "description": "Producer that caused the hold. Open set; tolerate unknown values. Known values: gate, scan, send, unknown.",
          "type": "string"
        }
      },
      "required": [
        "type",
        "code",
        "summary"
      ],
      "type": "object",
      "x-stability-level": "beta"
    },
    "MessageBodyView": {
      "additionalProperties": true,
      "properties": {
        "html": {
          "type": "string"
        },
        "text": {
          "type": "string"
        }
      },
      "type": "object"
    },
    "MessageParsedView": {
      "additionalProperties": true,
      "properties": {
        "html": {
          "type": "string"
        },
        "text": {
          "type": "string"
        },
        "truncated": {
          "type": "boolean"
        }
      },
      "required": [
        "text",
        "truncated"
      ],
      "type": "object"
    },
    "ProtectionFindingView": {
      "additionalProperties": true,
      "properties": {
        "action": {
          "description": "Applied action for this finding. Open set. Known values: flag, review, block.",
          "type": "string"
        },
        "categories": {
          "description": "Detected threat categories, highest-confidence first (scan findings only).",
          "items": {
            "$ref": "#/$defs/ThreatCategoryView"
          },
          "type": [
            "array",
            "null"
          ]
        },
        "detector": {
          "description": "Content-scan detector(s) that contributed (scan findings only), e.g. \"gemini\".",
          "type": "string"
        },
        "score": {
          "description": "Aggregate content-scan score 0..1 (scan findings only).",
          "format": "double",
          "type": "number"
        },
        "source": {
          "description": "Which producer flagged the message. Open set; tolerate unknown values. Known values: gate, scan.",
          "type": "string"
        },
        "summary": {
          "description": "Short natural-language rationale for a scan finding (curated; never the raw provider payload).",
          "type": "string"
        }
      },
      "required": [
        "source"
      ],
      "type": "object",
      "x-stability-level": "beta"
    },
    "SPFResult": {
      "additionalProperties": true,
      "properties": {
        "aligned": {
          "description": "Whether a passing SPF identity aligns with the RFC 5322 Author Domain under the discovered DMARC policy; null unless status is pass and an applicable DMARC record was discovered.",
          "type": [
            "boolean",
            "null"
          ]
        },
        "detail": {
          "description": "Free-text diagnostic for humans and logs. Never parse or branch on this field.",
          "type": "string"
        },
        "domain": {
          "description": "RFC 5321 identity domain evaluated by SPF; null when no SPF identity was available.",
          "type": [
            "string",
            "null"
          ]
        },
        "status": {
          "description": "SPF evaluation result. Only pass can contribute to DMARC alignment.",
          "enum": [
            "pass",
            "fail",
            "none",
            "neutral",
            "softfail",
            "temperror",
            "permerror"
          ],
          "type": "string"
        }
      },
      "required": [
        "status",
        "domain",
        "aligned"
      ],
      "type": "object"
    },
    "ThreatCategoryView": {
      "additionalProperties": true,
      "properties": {
        "name": {
          "type": "string"
        },
        "score": {
          "format": "double",
          "type": "number"
        }
      },
      "required": [
        "name"
      ],
      "type": "object",
      "x-stability-level": "beta"
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/e2a-dev-message-view"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.