Read cold email replies and bounces by API
Messages in one of your inboxes, newest first, sent and received alike: a 200-character preview each, with direction and a bounced flag (a hard bounce is a label on your own sent message). Pass message_id to read one message in full. Poll it after a send.
AgentMail:
all inputs ✓
✓ marks a combination proven with a real provider call. Others are wired and unit-tested; their first live run verifies them.
| Provider | Status |
|---|---|
AgentMail |
live |
Unit: per_read · unmatched results billed: no
The exact quote is returned by /v1/inspect before every call and held with headroom on execution. The quote is the price floor: if the provider's actual cost overruns it, the run bills the overrun at the same rate, never above the hold. The unused part of every hold is released.
curl https://api.jell.run/v1/run \ -H "Authorization: Bearer $JELL_API_KEY" \ -d '{ "capability": "email.messages", "input": { "inbox_id": "..." }, "routing": {"provider": "auto"} }'
{
"properties": {
"after": {
"description": "ISO 8601 timestamp with a timezone, e.g. 2026-09-04T13:17:00Z. UTC offsets are accepted and normalized to UTC milliseconds.",
"type": "string"
},
"from": {
"description": "Sender substring filters",
"items": {
"type": "string"
},
"type": "array"
},
"inbox_id": {
"description": "From email.inbox or email.inboxes",
"type": "string"
},
"labels": {
"description": "e.g. [\"received\"] for what came in, [\"sent\"] for your own mail (where a bounce shows as \"bounced\")",
"items": {
"type": "string"
},
"type": "array"
},
"limit": {
"default": 20,
"type": "integer"
},
"message_id": {
"description": "Read this one message in full (text) instead of listing",
"type": "string"
}
},
"required": [
"inbox_id"
],
"type": "object"
}
messages · count