Inbox
Download message attachment
Returns a short-lived signed URL (15 minutes) for one attachment on a sent or received message. Find message_id and index in listThreadMessages (or the reply.received webhook) and only call this when downloadable is true.
A received file is fetched from the mailbox on the first download and kept, so the first call can take a few seconds and later calls are fast. Download received files soon after they arrive: once the email leaves the mailbox inbox it can no longer be fetched.
Pass include_content=true to also get content_base64 when the file is 3 MB or smaller, for agents that cannot open URLs.
/v1/threads/{id}/messages/{message_id}/attachments/{index}Authorization
bearerAuth Use an account API key in the Authorization header: Authorization: Bearer f_....
In: header
Path Parameters
Inbox thread id.
uuidMessage id from listThreadMessages.
uuidindex of the attachment on the message.
0 <= valueQuery Parameters
When true, also return the file as content_base64 if it is 3 MB or smaller.
curl -X GET "https://example.com/v1/threads/497f6eca-6276-4993-bfeb-53cbbbba6f08/messages/497f6eca-6276-4993-bfeb-53cbbbba6f08/attachments/0"{ "data": { "index": 0, "filename": "bid.pdf", "content_type": "application/pdf", "size": 184233, "url": "https://example.supabase.co/storage/v1/object/sign/inbox-attachments/...", "expires_at": "2026-10-02T21:15:00.000Z" }}{ "error": { "type": "invalid_request_error", "code": "invalid_flow", "message": "Flow validation failed" }, "details": [ { "path": "nodes[1].data.variants[0].id", "code": "invalid_variant_id", "message": "Email variants must have a stable UUID id." } ]}{ "error": { "type": "authentication_error", "code": "invalid_api_key", "message": "A valid Furnace API key is required" }}{ "error": { "type": "invalid_request_error", "code": "campaign_not_found", "message": "Campaign not found" }}{ "error": { "type": "invalid_request_error", "code": "target_missing_enrollment", "message": "The existing contact for this address has no active enrollment in this campaign; launch the campaign or re-add the contact before replacing. Call GET /v1/threads/{id}/replace-lead/preview to inspect the match first." }}{ "error": { "type": "rate_limit_error", "code": "rate_limit_exceeded", "message": "Rate limit exceeded for this account" }}{ "error": { "type": "api_error", "code": "internal_error", "message": "Internal server error" }}{ "error": { "type": "api_error", "code": "internal_error", "message": "Internal server error" }}