Leads
Create presigned bulk upload URL
Preferred way to import a lead CSV or Excel file (.xlsx, .xls, .ods) that is on disk, at any size. The server never reads local paths, so the file goes straight to storage and no rows pass through tool calls. Steps: (1) call this with campaign_id (and filename); (2) upload the file from a shell: curl -X PUT -H "Content-Type: text/csv" --data-binary @leads.csv "<upload_url>" (the Content-Type must match content_type, default text/csv, which also works for Excel files; the URL expires at expires_at); (3) call importLeadsFromUpload with the upload_id; (4) poll getAsyncImportJob until completed. Hosts that cannot run a shell or make HTTP requests should use createStagedLeadImport instead.
/v1/uploads/presignAuthorization
bearerAuth 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.
uuidcurl -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" }}