Properties
| Name | Type | Description |
|---|---|---|
| id | string | Unique identifier for this email. |
| organization_id | string | Organization that sent or received this email. |
| email_domain_id | object | The sending domain used, if from_address belongs to one of the org's configured domains. |
| direction | string | 'outbound' for emails Hail sent, 'inbound' for emails received. |
| from_address | string | Sender email address. |
| from_name | object | Display name used on the From: header, when the sender supplied one. Always null on inbound rows. |
| to_addresses | array | Recipient email addresses. |
| cc_addresses | object | CC recipient email addresses, if any. |
| bcc_addresses | object | BCC recipient email addresses, if any. |
| reply_to | object | Reply-To email address, if set. |
| subject | string | Email subject line. |
| status | string | Delivery status: 'queued', 'sent', 'delivered', 'failed', 'bounced', 'complained', or 'received' (inbound emails). |
| end_reason | object | Reason delivery failed or bounced, if applicable. Null on success or while pending. |
| provider_message_id | object | The email provider's identifier for this message, if assigned. |
| requested_at | string | When the send was requested, ISO 8601 timestamp. |
| sent_at | object | When the message was handed to the provider, ISO 8601 timestamp. Null until sent. |
| failed_at | object | When the send failed, ISO 8601 timestamp. Null unless it failed. |
| metadata | object | Free-form JSON object attached to the email, as sent on create. Not interpreted by Hail. |
| body_text | object | Plain-text body, if any. |
| body_html | object | HTML body, if any. |
| message_id | object | RFC 5322 Message-ID header. Inbound emails only; null on outbound rows. |
| in_reply_to | object | RFC 5322 In-Reply-To header. Inbound emails only; null on outbound rows. |
| references_ids | object | RFC 5322 References header, split into ids. Inbound emails only; null on outbound rows. |
| spam_verdict | object | Provider spam-scan verdict (e.g. 'PASS'/'FAIL'). Inbound emails only; null on outbound rows. |
| virus_verdict | object | Provider virus-scan verdict (e.g. 'PASS'/'FAIL'). Inbound emails only; null on outbound rows. |
| dkim_verdict | object | Provider DKIM-authentication verdict (e.g. 'PASS'/'FAIL'). Inbound emails only; null on outbound rows. |
| spf_verdict | object | Provider SPF-authentication verdict (e.g. 'PASS'/'FAIL'). Inbound emails only; null on outbound rows. |
| dmarc_verdict | object | Provider DMARC-authentication verdict (e.g. 'PASS'/'FAIL'). Inbound emails only; null on outbound rows. |
| provider_received_at | object | When the provider received this email, ISO 8601 timestamp. Inbound emails only. |
| raw_url | object | API endpoint that redirects to the original MIME blob. Inbound emails only; null on outbound rows. |
| attachments | array | Inbound MIME attachments on this email. Empty on outbound rows. |
| last_event_at | object | When the most recent delivery event for this email occurred, ISO 8601 timestamp. |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/hail-so/json-schema/hail-so-email-response-schema.json",
"title": "EmailResponse",
"x-generated": "2026-11-11",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/hail-so-openapi.json#/components/schemas/EmailResponse",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"title": "Id",
"description": "Unique identifier for this email."
},
"organization_id": {
"type": "string",
"format": "uuid",
"title": "Organization Id",
"description": "Organization that sent or received this email."
},
"email_domain_id": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"type": "null"
}
],
"title": "Email Domain Id",
"description": "The sending domain used, if from_address belongs to one of the org's configured domains."
},
"direction": {
"type": "string",
"enum": [
"outbound",
"inbound"
],
"title": "Direction",
"description": "'outbound' for emails Hail sent, 'inbound' for emails received.",
"default": "outbound"
},
"from_address": {
"type": "string",
"title": "From Address",
"description": "Sender email address."
},
"from_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "From Name",
"description": "Display name used on the From: header, when the sender supplied one. Always null on inbound rows."
},
"to_addresses": {
"items": {
"type": "string"
},
"type": "array",
"title": "To Addresses",
"description": "Recipient email addresses."
},
"cc_addresses": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "Cc Addresses",
"description": "CC recipient email addresses, if any."
},
"bcc_addresses": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "Bcc Addresses",
"description": "BCC recipient email addresses, if any."
},
"reply_to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Reply To",
"description": "Reply-To email address, if set."
},
"subject": {
"type": "string",
"title": "Subject",
"description": "Email subject line."
},
"status": {
"type": "string",
"enum": [
"queued",
"sent",
"delivered",
"failed",
"bounced",
"complained",
"received"
],
"title": "Status",
"description": "Delivery status: 'queued', 'sent', 'delivered', 'failed', 'bounced', 'complained', or 'received' (inbound emails)."
},
"end_reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "End Reason",
"description": "Reason delivery failed or bounced, if applicable. Null on success or while pending."
},
"provider_message_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Provider Message Id",
"description": "The email provider's identifier for this message, if assigned."
},
"requested_at": {
"type": "string",
"format": "date-time",
"title": "Requested At",
"description": "When the send was requested, ISO 8601 timestamp."
},
"sent_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"title": "Sent At",
"description": "When the message was handed to the provider, ISO 8601 timestamp. Null until sent."
},
"failed_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"title": "Failed At",
"description": "When the send failed, ISO 8601 timestamp. Null unless it failed."
},
"metadata": {
"additionalProperties": true,
"type": "object",
"title": "Metadata",
"description": "Free-form JSON object attached to the email, as sent on create. Not interpreted by Hail."
},
"body_text": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Body Text",
"description": "Plain-text body, if any."
},
"body_html": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Body Html",
"description": "HTML body, if any."
},
"message_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Message Id",
"description": "RFC 5322 Message-ID header. Inbound emails only; null on outbound rows."
},
"in_reply_to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "In Reply To",
"description": "RFC 5322 In-Reply-To header. Inbound emails only; null on outbound rows."
},
"references_ids": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "References Ids",
"description": "RFC 5322 References header, split into ids. Inbound emails only; null on outbound rows."
},
"spam_verdict": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Spam Verdict",
"description": "Provider spam-scan verdict (e.g. 'PASS'/'FAIL'). Inbound emails only; null on outbound rows."
},
"virus_verdict": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Virus Verdict",
"description": "Provider virus-scan verdict (e.g. 'PASS'/'FAIL'). Inbound emails only; null on outbound rows."
},
"dkim_verdict": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Dkim Verdict",
"description": "Provider DKIM-authentication verdict (e.g. 'PASS'/'FAIL'). Inbound emails only; null on outbound rows."
},
"spf_verdict": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Spf Verdict",
"description": "Provider SPF-authentication verdict (e.g. 'PASS'/'FAIL'). Inbound emails only; null on outbound rows."
},
"dmarc_verdict": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Dmarc Verdict",
"description": "Provider DMARC-authentication verdict (e.g. 'PASS'/'FAIL'). Inbound emails only; null on outbound rows."
},
"provider_received_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"title": "Provider Received At",
"description": "When the provider received this email, ISO 8601 timestamp. Inbound emails only."
},
"raw_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Raw Url",
"description": "API endpoint that redirects to the original MIME blob. Inbound emails only; null on outbound rows."
},
"attachments": {
"items": {
"$ref": "#/$defs/EmailAttachmentResponse"
},
"type": "array",
"title": "Attachments",
"description": "Inbound MIME attachments on this email. Empty on outbound rows.",
"default": []
},
"last_event_at": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"title": "Last Event At",
"description": "When the most recent delivery event for this email occurred, ISO 8601 timestamp."
}
},
"type": "object",
"required": [
"id",
"organization_id",
"email_domain_id",
"from_address",
"to_addresses",
"cc_addresses",
"bcc_addresses",
"reply_to",
"subject",
"status",
"end_reason",
"provider_message_id",
"requested_at",
"sent_at",
"failed_at",
"body_text",
"body_html"
],
"$defs": {
"EmailAttachmentResponse": {
"properties": {
"id": {
"type": "string",
"format": "uuid",
"title": "Id",
"description": "Unique identifier for this attachment."
},
"filename": {
"type": "string",
"title": "Filename",
"description": "Original filename of the attachment."
},
"content_type": {
"type": "string",
"title": "Content Type",
"description": "MIME type of the attachment."
},
"size_bytes": {
"type": "integer",
"title": "Size Bytes",
"description": "Size of the attachment in bytes."
},
"content_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Content Id",
"description": "MIME Content-ID, present when this attachment is referenced inline (cid:) from the HTML body. Null otherwise."
},
"url": {
"type": "string",
"title": "Url",
"description": "API endpoint that 302-redirects to a presigned download URL for this attachment."
}
},
"type": "object",
"required": [
"id",
"filename",
"content_type",
"size_bytes",
"url"
],
"title": "EmailAttachmentResponse",
"description": "One inbound MIME attachment as exposed to API consumers.\n\n``url`` is the stable Hail API endpoint that 302-redirects to a\npresigned S3 URL on access — see GET /emails/{id}/attachments/{aid}."
}
}
}
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.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/hail-so-email-response"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
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.