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 hasstatus: uploaded. - Files on disk or anything larger: omit
content_base64, then PUT the raw bytes toupload_urlwithin 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}/attachmentsAuthorization
bearerAuth AuthorizationBearer <token>
Use an account API key in the Authorization header: Authorization: Bearer f_....
In: header
Path Parameters
idstring
Inbox thread id.
Format
uuidRequest Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
filenamestring
Length
length <= 255content_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" }}