Leads
Create presigned bulk upload URL
Optional file ingress for MCP hosts that can PUT directly to S3. Returns upload_id + temporary upload_url. Generic MCP clients that cannot perform arbitrary HTTP uploads should use staged JSON append instead. Local paths are never accepted by the server.
POST
/v1/uploads/presignAuthorization
bearerAuth AuthorizationBearer <token>
Use an account API key in the Authorization header: Authorization: Bearer f_....
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
campaign_idstring
Format
uuidfilename?string
content_type?string
curl -X POST "https://example.com/v1/uploads/presign" \ -H "Content-Type: application/json" \ -d '{ "campaign_id": "78614b6c-fe7c-41e2-8e25-c9b3a3c91904" }'{ "data": { "upload_id": "f2ef591b-135b-46fa-a604-3d4fda5bfbfb", "upload_url": "http://example.com", "expires_at": "2019-08-24T14:15:22Z", "filename": "string", "content_type": "string" }}{ "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": "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" }}