Skip to main content
Connect a mailbox with POST /v1/mailboxes (mailboxes:manage). Every message that arrives is read as a submission, and a deal thread ends in one job:
  • A message with attachments starts a job with every document its thread has sent so far.
  • A reply that adds documents (the missing statement) starts a new job with the thread’s documents plus its own; the earlier job’s superseded_by names it. Earlier reads are reused, so only the new files cost anything.
  • A forward whose documents the thread already holds returns the thread’s job (merged).
  • A message with no document (a question, a thank-you) starts none.
GET /v1/mailboxes/{id}/messages lists what became of each message (job, merged, ignored:<reason> or refused), never its subject, body or attachments. PATCH a mailbox to pause it.

Kinds of mailbox

Works with any mail system. POST /v1/mailboxes with {"kind": "forwarding"} answers a private address, <token>@in.parser-app.com. Forward your deals inbox to it with a Gmail filter or an Outlook rule. Mail to an unknown address bounces.Gmail first sends a confirmation code to a new forwarding address. It starts no job, and GET /v1/mailboxes/{id}/verification shows the code and link so you can confirm it.Anyone who learns the address can mail it, so:
  • Allowed senders: PATCH /v1/mailboxes/{id} with {"settings": {"allowed_sender_domains": ["funder.com"]}} takes only mail forwarded from those domains (and their subdomains), judged by the envelope sender: the mail system that forwards, not the ISO in From. A Gmail filter or Outlook rule of deals@funder.com keeps funder.com there. Other mail is ignored:sender_not_allowed.
  • Hourly cap: a mailbox takes 300 pushed messages an hour. Beyond that, mail is held and delivered later, never lost.
  • Rotation: POST /v1/mailboxes/{id}/rotate-address gives the mailbox a new address. The old one bounces from then on, and Gmail asks you to confirm the new one.
Mail already in a mailbox when it is connected is not parsed. POST /v1/mailboxes/{id}/resync?since= reads up to 7 days back. A mailbox whose credential is revoked becomes reauth_required and emits mailbox.disconnected.

A provider posting mail itself

A forwarding mailbox also comes with an inbound_secret, shown once at creation, so a mail provider can post raw messages for that mailbox to POST /v1/intake/email:
With an API key instead (jobs:write), any raw email can be posted the same way, without a mailbox.

Routing

With the email_routing module, each email is classified before it is parsed: new_submission, more_documents, question_or_update, internal_note, contract_or_funding or not_deal_related. The answer is on the job (result.email.routing) and on an ignored email’s response, for your CRM or inbox to route by. Only an email judged not_deal_related with at least the tenant’s skip_confidence (0.9 by default), in a thread that holds no deal, goes unparsed. A reply in a deal’s thread is never skipped, and an unsure verdict is parsed as usual. The classifier sees the sender and recipient domains, the subject, the start of the body and the attachments’ names and sizes, never their content. Bulk and automatic mail with no document (newsletters, receipts, out-of-office replies) is not classified at all.