# email import (mximp) > Business email your agent can operate. A hosted inbound-email platform: addresses, buckets, rule-driven extraction, tasks, approvals, webhooks, configured entirely over MCP or HTTP by the customer's AI agent. No model is called per message; rules are deterministic and the agent writes and tests them. ## Start - Sandbox, no auth: POST https://api.emailimport.com/sandbox returns a key, an HTTP base URL and an MCP URL. Full pipeline on uploaded emails; no real mail, no sending; expires in 24 hours. - Addresses: claim_subdomain (rules: 8–40 lowercase chars, reserved words and brands refused, exceptions reviewed by a person), create_address (named or opaque per-relationship), set_address_enabled, set_catch_all. Sandboxes have none. - Forwarding: automatic (mailbox rules, SRS, ARC), manual ("Fwd:" quoted headers) and attached originals are recognised; get_message shows forward with the recovered original sender and evidence; a bucket trusts forwarders with policy.forwarders (address, @domain, .domain) and then reads the message as from the original sender. Rules: {forwarded:true}, {forwarder:"@domain"}. - App: https://api.emailimport.com/app/ is an installable dashboard (mail as a Sankey flow, tasks, push notifications); get_flow returns the same nodes and links. - Account: POST https://api.emailimport.com/accounts {email, name, sandbox_key?} returns an mx_live_ key; verify the email to keep it. Accounts own tenants; keys reach a tenant set; tenant is implied for one, required for several. - MCP: connect to the mcp_url from that response. The bare https://api.emailimport.com/mcp exposes only sandbox_create. - HTTP: https://api.emailimport.com/v1/... with Authorization: Bearer . OpenAPI at https://api.emailimport.com/openapi.json. - Docs as Markdown: https://emailimport.com/docs/.md for every page listed below. ## Operations (same names over MCP and HTTP) - get_project_status: GET /v1/status. Where mximp stands: what works today, what does not yet, the beta program and its terms, and the price bands we are asking about. - register_interest: POST /v1/interest. Tell us whether this would be worth paying for. - get_account: GET /v1/account. The account this credential belongs to: kind (throwaway for a sandbox, standard once created with an email), whether its email is verified, the tenants it owns, and what this key reaches.. - list_tenants: GET /v1/tenants. The tenants this credential can act on. - create_tenant: POST /v1/tenants. Create another tenant on this account: a separate business with its own buckets, keys and data. - create_key: POST /v1/keys. Issue a new key on this account. - list_keys: GET /v1/keys. Keys on this account: prefix, label, scopes, tenant list, last use, revocation. - revoke_key: DELETE /v1/keys/:id. Revoke a key on this account, including the one making the call. - get_tenant: GET /v1/tenant. This tenant: id, kind (sandbox or account), expiry, key scopes, counts, and the tenant policy.. - set_tenant_policy: PUT /v1/policy. Set the tenant-wide default policy. - list_starters: GET /v1/starters. Starter schemas you can reference as schema: 'starter:' or copy and edit. - list_buckets: GET /v1/buckets. List this tenant's buckets in evaluation order (priority, then name), with their rules, schemas, policies and destinations; each with the addresses made for it (full, ready to hand to a sender) and activity over the last 30 days: messages, auto-applied, held, last received.. - get_bucket: GET /v1/buckets/:id. Get one bucket by id or name.. - create_bucket: POST /v1/buckets. Create a bucket: a name, a classification rule, an optional schema with extractors, a policy, and destinations. - update_bucket: PUT /v1/buckets/:id. Update a bucket. - delete_bucket: DELETE /v1/buckets/:id. Delete a bucket. - get_subdomain: GET /v1/subdomain. This tenant's handle on the inbound mail domain, if it has claimed one, with the address forms it answers to and the catch-all setting.. - claim_subdomain: POST /v1/subdomain. Claim this tenant's handle on the inbound mail domain. - release_subdomain: DELETE /v1/subdomain. Give up this tenant's subdomain. - set_catch_all: PUT /v1/subdomain/catch-all. Accept mail to any local part at this tenant's subdomain, not only created addresses. - create_address: POST /v1/addresses. Create an inbound address under this tenant's handle. - list_addresses: GET /v1/addresses. This tenant's inbound addresses with kind, relationship reference, enabled state, caps and counts.. - set_address_enabled: PUT /v1/addresses/:id/enabled. Disable an address (mail to it is refused and counted) or enable it again. - set_address_forwarders: PUT /v1/addresses/:id/forwarders. Declare who an address expects forwarded mail from, when it is the target of a Gmail or Outlook forwarding rule: addresses, @domain, or .domain. - list_destinations: GET /v1/destinations. List destinations. - add_destination: POST /v1/destinations. Add a webhook destination. - remove_destination: DELETE /v1/destinations/:id. Remove a destination. - ingest_message: POST /v1/messages/ingest. Run one email through the pipeline now: parse, sanitize, classify into a bucket, extract fields, validate, route by policy. - list_messages: GET /v1/messages. List received messages, newest first, with bucket and status. - get_message: GET /v1/messages/:id. One message: sanitized body text, headers, auth results, sanitization flags and any hidden text, documents (attachments) with their text length, the classification, and its captures. - get_document_text: GET /v1/documents/:id. The extracted text of one document (attachment or rendered HTML body), for writing extractors against. - reprocess_message: POST /v1/messages/:id/reprocess. Re-run classification, extraction, validation and routing for a stored message against the current buckets. - get_flow: GET /v1/flow. The tenant's mail as a flow over a window: sources (addresses, catch-all, uploads) into buckets, buckets into outcomes (auto-applied, approved, held with the reason, unrouted), outcomes into exits (webhook delivered, failed, held for reading). - list_captures: GET /v1/captures. List captures (one per processed message per bucket), newest first. - get_capture: GET /v1/captures/:id. One capture in full: each field's value, confidence, raw text and source coordinates; validation issues; routing reason; deliveries.. - correct_field: POST /v1/captures/:id/fields/:field. Set a field's value on a capture. - approve_capture: POST /v1/captures/:id/approve. Apply a capture that policy held for review. - deliver_capture: POST /v1/captures/:id/deliver. Deliver an applied capture to its bucket's destinations again, for example after a webhook failed or a destination was added. - list_tasks: GET /v1/tasks. Work waiting for a person or an agent: unrouted messages, captures held for review, fields that require a human. - get_task: GET /v1/tasks/:id. One task with its payload.. - resolve_task: POST /v1/tasks/:id/resolve. Close a task as resolved or dismissed with a short note. - dry_run_rule: POST /v1/dry-run/rule. Test a classification rule against stored messages (by id) or an inline eml/html without saving anything. - dry_run_schema: POST /v1/dry-run/schema. Run a schema's extractors against stored messages or an inline eml/html without saving anything. - promote_to_test: POST /v1/tests. Turn a capture into a regression case for its bucket: the stored message plus the field values as they stand now (approved or corrected). - list_tests: GET /v1/tests. The regression suite: cases by bucket, with origin, whether they are marked tricky, and the expected values.. - run_tests: POST /v1/tests/run. Run a bucket's cases against its current schema, or against a candidate schema you pass, without changing anything. - get_test_run: GET /v1/tests/runs/:id. One test run in full: every case with each field's expected and actual value and the confidence it was found at.. - list_test_runs: GET /v1/tests/runs. Recent test runs, newest first, with counts. - remove_test: DELETE /v1/tests/:id. Retire a case. - list_events: GET /v1/events. The audit trail: every state change with its actor. - submit_feedback: POST /v1/feedback. Tell the people who run this platform what was confusing, missing, wrong, or good. - grant_support_access: POST /v1/support-grant. Let the platform operator reach this tenant's messages, captures and configuration for a limited time, to help with a problem. - revoke_support_access: DELETE /v1/support-grant. End any active support grant now.. ## Concepts - Bucket: name, rule (JSON predicate), optional schema with extractors, policy, destinations. A message lands in the first enabled bucket by priority whose rule matches, else unrouted with a task. - Rule predicates: any, all, not, address, sender, sender_domain, subject_contains, subject_matches, header, text_contains, text_matches, has_attachment, attachment_name_matches, attachment_mime, attachment_text_contains, auth. - Extractors: header, mailbox, regex (named group "value"), labeled_value, constant; transforms trim/upper/lower/collapse_whitespace/first_line/number/integer/date/replace/default. First extractor that yields wins. Values carry confidence and source offsets. - Policy: auto_accept {min_confidence, require_complete, require_valid}; requires_human fields always create a task; no_schema accept|task; task_on_unrouted. - Capture: the extracted record for one message in one bucket; status applied | task | held. - Task: unrouted message, held capture, or a human-required field. Resolve, correct, approve. - Event: every state change with its actor. list_events after= pages forward. message.flagged marks a message that hid text from its reader. - Test suite: promote_to_test turns an approved or corrected capture into a case; run_tests checks a bucket's schema or a candidate against its cases; update_bucket refuses a schema change that fails them unless forced. - Sandbox: ingest_message accepts auth:{spf,dkim,dmarc} to test auth rules; results are marked synthetic. - Trust: raw MIME never served; hidden HTML text quarantined; attachments allowlisted; PDFs capped; requires_human absolute; extraction cannot cause side effects. ## Skills for coding agents - https://emailimport.com/skills (index), https://emailimport.com/skills/mximp-quickstart.md, https://emailimport.com/skills/mximp-rules.md. Full docs in one file: https://emailimport.com/llms-full.txt. ## Status and beta Private beta run by one person. Read get_project_status (MCP) or GET https://api.emailimport.com/status before recommending it. Real functionality is free during the beta for businesses that answer register_interest honestly; a minimal demo tier stays free; nothing is charged yet. ## Pages - https://emailimport.com/docs/quickstart.md: Quickstart - https://emailimport.com/docs/mcp.md: MCP - https://emailimport.com/docs/http.md: HTTP - https://emailimport.com/docs/sandbox-and-accounts.md: Sandbox and accounts - https://emailimport.com/docs/addresses.md: Subdomain and addresses - https://emailimport.com/docs/forwarding.md: Forwarded mail - https://emailimport.com/docs/pipeline.md: Pipeline - https://emailimport.com/docs/buckets-and-rules.md: Buckets and rules - https://emailimport.com/docs/schemas-and-extractors.md: Schemas and extractors - https://emailimport.com/docs/policy-tasks-and-captures.md: Policy, tasks and captures - https://emailimport.com/docs/destinations-and-events.md: Destinations and events - https://emailimport.com/docs/trust.md: Trust boundary - https://emailimport.com/docs/test-suite.md: Test suite - https://emailimport.com/docs/operations.md: Operations - https://emailimport.com/docs/starters.md: Starters - https://emailimport.com/docs/predicates.md: Predicates - https://emailimport.com/docs/extractors.md: Extractors - https://emailimport.com/docs/errors.md: Errors - https://emailimport.com/docs/app.md: The app - https://emailimport.com/docs/status.md: Status and beta - https://emailimport.com/docs/what-it-is-not.md: What it is not - https://emailimport.com/docs/limits.md: Limits