Inbox

Create reply attachment

Creates an attachment to send with createReplyJob or createForwardJob on this thread. Pass the returned attachment_id in attachment_ids.

Two ways to provide the file:

  • Small generated files (4 MB or less): send content_base64. The response has status: uploaded.
  • Files on disk or anything larger: omit content_base64, then PUT the raw bytes to upload_url within 2 hours: curl -X PUT -H "Content-Type: <content_type>" --data-binary @file "<upload_url>". Do not paste large files into tool calls as base64.

Limits per message: 10 files, 10 MB each, 15 MB total. A send fails with attachment_upload_missing if the file was never uploaded.

POST/v1/threads/{id}/attachments

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

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

filenamestring
Lengthlength <= 255
content_type?string

Defaults to application/octet-stream.

content_base64?string

File content, base64-encoded, 4 MB or less decoded.

curl -X POST "https://example.com/v1/threads/497f6eca-6276-4993-bfeb-53cbbbba6f08/attachments" \  -H "Content-Type: application/json" \  -d '{    "filename": "proposal.pdf",    "content_type": "application/pdf"  }'
{  "data": {    "attachment_id": "0d3c3b0e-6a52-4c39-9a5e-2f4a3f1f6b1a",    "filename": "proposal.pdf",    "content_type": "application/pdf",    "status": "pending_upload",    "size": null,    "upload_url": "https://example.supabase.co/storage/v1/object/upload/sign/inbox-attachments/...",    "upload_expires_at": "2026-10-02T23:00: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": "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"  }}