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.

GET/v1/threads/{id}/messages/{message_id}/attachments/{index}

Authorization

bearerAuth
AuthorizationBearer <token>

Use an account API key in the Authorization header: Authorization: Bearer f_....

In: header

Path Parameters

idstring

Inbox thread id.

Formatuuid
message_idstring

Message id from listThreadMessages.

Formatuuid
indexinteger

index of the attachment on the message.

Range0 <= value

Query Parameters

include_content?boolean

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"  }}