Use casesWorkflow
AI Research Assistant Email Agent
Keep research conversations moving. Your agent coordinates with consenting participants and collaborators, collects agreed materials, and follows up on missing details in the same thread.
The problem
A research collaboration can produce dozens of email threads. Participants return questionnaires, collaborators share datasets, and sources clarify information they agreed to contribute. Keeping track of what arrived and what still needs an answer takes time away from the research.
An acknowledgement, a missing attachment, or a question about methodology can each require another round trip. An agent can organize those exchanges, ask focused follow-up questions, and prepare a summary for the researcher to review.
The workflow needs a stable email identity, access to incoming messages and files, and a way to preserve each conversation. Robotomail gives your agent those capabilities through an API.
How an AI agent solves this
Start with a research brief and contacts who explicitly agreed to the email exchange. Your application records the scope of that permission and checks it before each send. The agent then requests agreed materials, processes replies, and asks for clarification within the collaboration. A published paper or public address does not establish permission; see the Acceptable Use Policy.
- Sends agreed questions and requests to consenting participants and collaborators
- Processes replies to extract answers, data links, and attachments
- Sends follow-up questions in the same thread when clarification is needed
- Tracks responses and permitted reminders, stopping when a participant withdraws
- Compiles findings into a structured report for the researcher
How it works with Robotomail
Robotomail gives your research agent its own email identity with full send and receive capability. Provision a mailbox and connect incoming replies to your research workflow. Your application controls recipient permission, question scope, reminders, and human review of the findings.
Step 1: Request agreed research materials. Your agent calls POST /v1/mailboxes/{mailbox_id}/messages after checking the contact's recorded permission and suppression status, with a request that stays within the agreed collaboration.
# Verify recorded permission for this research conversation before sending.
curl -X POST https://api.robotomail.com/v1/mailboxes/{mailbox_id}/messages \
-H "Authorization: Bearer rm_live_..." \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"to": [
"author@university.edu"
],
"subject": "Materials for our agreed research collaboration",
"bodyHtml": "<p>Dear Dr. Chen,</p><p>Thank you for agreeing to exchange research materials with Acme Labs by email. For our collaboration on your paper \"Emergent Cooperation in LLM Swarms\", could you share the dataset used in Section 4, or point me to a public repository?</p><p>Thank you,<br/>Research Agent — Acme Labs</p>",
"bodyText": "Dear Dr. Chen, Thank you for agreeing to exchange research materials with Acme Labs by email. For our collaboration on your paper \"Emergent Cooperation in LLM Swarms\", could you share the dataset used in Section 4, or point me to a public repository? Thank you, Research Agent — Acme Labs"
}
JSONStep 2: Receive and parse replies. When a contact responds, Robotomail delivers the full message to your webhook. The payload includes the text body, any attachments (stored in R2 with download URLs), and the thread ID for context.
{
"event": "message.received",
"timestamp": "2026-09-23T10:00:00Z",
"data": {
"message_id": "11111111-1111-4111-8111-111111111111",
"mailbox_id": "22222222-2222-4222-8222-222222222222",
"mailbox_address": "research-assistant@yourcompany.com",
"from": "author@university.edu",
"to": [
"research-assistant@yourcompany.com"
],
"cc": [],
"subject": "Re: Materials for our agreed research collaboration",
"body_text": "Happy to share these materials for our collaboration. The dataset is available at github.com/chen-lab/lm-swarms-data. Let me know if you need the preprocessing scripts as well.",
"thread_id": "33333333-3333-4333-8333-333333333333",
"received_at": "2026-09-23T10:00:00Z",
"attachments": []
}
}Step 3: Follow up in the same thread. If the agent needs more detail and the contact still permits the exchange, it sends a follow-up using the inReplyTo field to keep the conversation organized. The contact sees a single, coherent thread in their inbox.
# inReplyTo below stands for the fetched message.messageId; see the reply example below.
curl -X POST https://api.robotomail.com/v1/mailboxes/{mailbox_id}/messages \
-H "Authorization: Bearer rm_live_..." \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"to": [
"author@university.edu"
],
"subject": "Re: Materials for our agreed research collaboration",
"bodyHtml": "<p>Thank you, Dr. Chen. The preprocessing scripts would be very helpful — could you share those as well?</p>",
"inReplyTo": "<original-message@example.com>",
"bodyText": "Thank you, Dr. Chen. The preprocessing scripts would be very helpful — could you share those as well?"
}
JSONYour agent can use the threads API to retrieve full conversation history for any contact, making it easy to build summaries and track which questions remain unanswered. Start with a platform mailbox like research@robotomail.co or add your organization's domain.
Key benefits
- Organized collaboration: Keep questions, responses, and missing materials together for each participant
- Context-aware follow-up: The agent uses thread history to ask intelligent follow-up questions
- Attachment handling: Datasets, papers, and files sent by contacts are automatically stored and accessible via API
- Professional identity: Send from a real address with proper DNS authentication — recipients see a legitimate sender, not a bot
- Get started quickly: Check the API docs and introductory post to build your first research agent
Get started and start gathering information in minutes. Webhook delivery on every plan, backed by a 30-day money-back guarantee.
Connect the workflow to a real reply
The webhook's data.message_id is a database ID used to retrieve or deduplicate a message. Fetch it with the GET message endpoint, then use the response's message.messageId (the RFC Message-ID) as inReplyTo. Keep data.thread_id for your application's conversation state. Do not use a database ID or thread ID as a reply header. Stop and investigate if the fetched message has no Message-ID.
Examples use illustrative IDs. Replace them with IDs from your account; never construct an email Message-ID from a database ID. These workflows email other people and need a paid plan. Test Free with your verified account email first; see plans.
Verify the webhook signature over the raw body, persist the event and deduplicate on the database message ID before acknowledging it. Run your application logic from a durable queue. The database, calendar, CRM and model functions shown above belong to your application.
This shell example fetches an incoming email and builds all required send fields. Set ROBOTOMAIL_API_KEY, ROBOTOMAIL_MAILBOX_ID and ROBOTOMAIL_MESSAGE_ID in your environment. Apply your recipient and approval rules before sending.
# Requires jq. Use mailbox_id and message_id from the verified webhook.
original=$(curl --fail --silent --show-error \
"https://api.robotomail.com/v1/mailboxes/$ROBOTOMAIL_MAILBOX_ID/messages/$ROBOTOMAIL_MESSAGE_ID" \
-H "Authorization: Bearer $ROBOTOMAIL_API_KEY") || exit 1
payload=$(printf '%s' "$original" | jq -e --arg body "Thanks, I received your message." '
.message | if (.messageId | type == "string" and length > 0) then
{to: [.fromAddress], subject: ("Re: " + .subject), bodyText: $body, inReplyTo: .messageId}
else error("Original email has no Message-ID") end
') || exit 1
curl --fail --silent --show-error \
"https://api.robotomail.com/v1/mailboxes/$ROBOTOMAIL_MAILBOX_ID/messages" \
-H "Authorization: Bearer $ROBOTOMAIL_API_KEY" \
-H "Content-Type: application/json" \
--data-binary "$payload"
Read receive and reply and webhook verification for the full setup.