Faivelo
Dashboard
AI & Developers

Intake and Lens

Turn a mailbox into a parsing endpoint. Every email in comes back as structured data, with the fields you care about filled in by Lens.

Intake watches a mailbox. Every email that lands in it is fetched whole, the reply is separated from quoted history, attachments become download links, and the result reaches you as a signed intake.message webhook, or waits in the API if you set no webhook. Lens is the optional layer on top: you describe the fields you want, Lens reads each email and fills them in.

Intake is included on the Pro and Business plans. Free trials can set it up and watch messages arrive in the Activity view; webhooks start delivering on a paid plan. Lens comes with 500 runs a month on Pro and 2,000 on Business; past that it runs on extra usage, at about a tenth of a cent per email.

Set it up

  1. Open Intake in the sidebar and choose Set up Intake.
  2. Pick a mailbox, or create one on the spot (invoices@, support@, leads@).
  3. Give us a webhook URL, pick an endpoint you already have, or choose to read messages from the API instead.
  4. Turn on Lens if you want fields. Start from a template (Invoice, Order, Support ticket, Lead, Job application) or write your own list.
  5. Press Send me a test email. A real email goes to the address, and the parsed payload appears on the page a few seconds later.

Intake mailboxes are ordinary mailboxes. Mail keeps arriving as usual, replies work, and you can read the inbox in webmail. Set a retention period (7, 30 or 90 days, or forever) and Intake deletes parsed records and the stored copy after it.

The payload

intake.message uses the same envelope as every other webhook. data looks like this:

{
  "mailbox": "invoices@example.com",
  "message_id": "msg_01J8ZK3V5Q",
  "thread_id": "thr_01J8ZK3V5Q",
  "from": { "name": "Dana Whitfield", "address": "dana@northwind.io" },
  "to": [{ "name": "", "address": "invoices@example.com" }],
  "cc": [],
  "reply_to": null,
  "subject": "Invoice NW-2041 for September",
  "received_at": "2026-09-20T14:02:11Z",
  "reply": "Hi team, please find September's invoice attached. Thanks, Dana",
  "text": "Hi team, please find September's invoice attached...\n\nOn Sep 18, 2026, Example wrote:\n> Could you send it?",
  "html": "<div>Hi team, ...</div>",
  "headers": { "message_id": "<a1b2c3@northwind.io>", "date": "Sun, 20 Sep 2026 14:02:11 +0000" },
  "attachments": [
    { "name": "invoice-NW-2041.pdf", "content_type": "application/pdf", "size": 48213, "url": "https://faivelo.com/api/intake/attachments/…", "expires_at": "2026-09-21T14:02:11Z", "text": "INVOICE NW-2041\nNorthwind Supplies\nDue 2026-10-18 ..." }
  ],
  "lens": { "vendor_name": "Northwind Supplies", "invoice_number": "NW-2041", "total_amount": 1240.5, "currency": "USD" },
  "intake_id": "clx1intake01",
  "test": false
}
FieldWhat it is
replyThe message with quoted history and the signature removed. What most apps want.
text, htmlThe full body, cut at 100 KB and 200 KB.
attachments[].urlA signed link, valid for 24 hours. No API key needed.
attachments[].textThe readable text inside a PDF, Word, spreadsheet or plain-text attachment (first three files, up to 20,000 characters each). null for images, scans and anything else.
lensYour fields, keyed as you named them. null when Lens is off or did not run.
intake_idThe id to fetch this message again from the API.
testtrue for the emails Faivelo sends from Send me a test email.

Lens fields

Each field has a key, a type (text, number, date, yes/no, email address, list) and a one-line description of what to look for. Lens returns null for anything the email does not say and never invents values. Dates come back as YYYY-MM-DD, numbers without currency symbols.

Edit fields any time from the Lens tab. Test on recent emails runs your current list on the last few parsed messages without saving, so you can tune descriptions before they go live.

Lens reads the email text and the text inside document attachments (PDF, Word, spreadsheets, plain text), so a CV or an invoice sent as a PDF with an empty body still fills every field. Scanned PDFs and images are not read.

Reading from the API

Everything Intake parses is also available with an API key that has the mail:read scope:

curl "https://faivelo.com/api/v1/intake/messages?mailbox=invoices@example.com" \
  -H "Authorization: Bearer $FAIVELO_API_KEY"

GET /v1/intake/messages lists parsed messages newest first (page with ?before=). GET /v1/intake/messages/{id} returns one with the full payload and fresh attachment links. See the API reference for the schema.