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/presign

Authorization

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
Formatuuid
filename?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"  }}