Parsing transactional email is one of those problems that looks trivial until it isn’t. You write a regex for the order confirmation your supplier sends. It works for six months. Then their template changes — a new line break, a currency symbol swap, a subject-line reword — and your pipeline silently starts returning empty strings. Nobody notices until a reconciliation run fails at 11 PM.
The same brittleness shows up anywhere structured data hides inside human-formatted messages: order confirmations, shipping notices, payment receipts. The format drifts, the regex rots, and the failure is silent.
MailFrame is built to end that class of problem — starting with email. (PDF and image inputs are on the roadmap; raw email is what ships today.)
What MailFrame Does
MailFrame accepts a raw email (MIME) and returns structured JSON that conforms to a schema you define. You describe the shape of data you want; MailFrame handles extraction, validation, confidence scoring, and delivery.
The API base is https://api.mailframe.ai. There is one core endpoint:
POST /v1/parse
Send it the raw email, tell it which schema to use, and get typed JSON back.
Two Ways to Ingest
HTTP POST
For email your application already has in hand — a message pulled from an inbox, a fetch from S3, a pipeline step — POST the raw MIME directly:
curl -X POST https://api.mailframe.ai/v1/parse \
-H "Authorization: Bearer $MAILFRAME_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"schema_id": "inv_schema_01jx...",
"webhook_url": "https://yourapp.com/hooks/mailframe",
"input": { "type": "email", "raw": "<base64-encoded MIME>" }
}'
The response is immediate for synchronous mode, or a job reference for async delivery.
Email Forwarding (on the roadmap)
A second ingestion mode is planned for after launch: unique per-schema inboxes such as parse+inv_schema_01jx@in.mailframe.ai that you can forward, auto-forward, or route email to directly. MailFrame would receive the raw MIME, run extraction against the bound schema, and deliver the result to your webhook — no polling, no cron jobs. Until it ships, send the same raw MIME to POST /v1/parse.
This will be particularly useful for supplier invoices, order confirmations, and shipping notifications that arrive in a shared inbox — configure a mail rule once and the data flows automatically.
A Schema-First Approach
You define what you want as a JSON Schema. For an invoice:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["vendor", "invoice_number", "total_amount", "line_items"],
"properties": {
"vendor": { "type": "string" },
"invoice_number": { "type": "string" },
"invoice_date": { "type": "string", "format": "date" },
"total_amount": { "type": "number" },
"currency": { "type": "string", "enum": ["USD", "EUR", "GBP"] },
"line_items": {
"type": "array",
"items": {
"type": "object",
"required": ["description", "quantity", "unit_price"],
"properties": {
"description": { "type": "string" },
"quantity": { "type": "number" },
"unit_price": { "type": "number" }
}
}
}
}
}
MailFrame validates every extraction attempt against this schema before returning a result. Fields that cannot be extracted with sufficient confidence are surfaced explicitly, never silently defaulted.
What the Output Looks Like
{
"job_id": "job_01jx9kz4m3p8q2n7",
"schema_id": "inv_schema_01jx...",
"status": "completed",
"confidence": 0.97,
"data": {
"vendor": "Acme Supplies Ltd.",
"invoice_number": "INV-2026-00842",
"invoice_date": "2026-04-28",
"total_amount": 4318.50,
"currency": "USD",
"line_items": [
{ "description": "Bolt M8x20 (box of 500)", "quantity": 10, "unit_price": 24.50 },
{ "description": "Steel Bracket Type-B", "quantity": 50, "unit_price": 63.17 }
]
},
"low_confidence_fields": []
}
A top-level confidence score and a low_confidence_fields array give you signal before you decide whether to auto-process or route for human review. More on the confidence-scoring internals in a separate post.
Signed Webhook Delivery
Results are delivered via HMAC-SHA256 signed webhooks so you can verify every payload is genuine. The MailFrame-Signature header carries the signature. Retries use exponential backoff, and anything that exhausts all retry attempts is intended to land in a dead-letter queue you can inspect and replay — the DLQ and replay tooling are rolling out during early access.
Early Access
MailFrame is in limited early-access beta. Pricing tiers start at a free tier (100 parse operations/month) and scale up through Indie ($19/mo, 500 ops), Startup ($49/mo, 5,000 ops), Scale ($149/mo, 50,000 ops), and Enterprise with custom volume and SLAs.
If you are building on top of document or email data today — reconciliation pipelines, procurement automation, logistics integrations — we would like to talk. Request early access on the site. We are onboarding teams selectively right now and can turn around schema design review within 24 hours.
The inbox that does nothing is leaving structured data on the floor. MailFrame picks it up.