File Uploads

Upload files via presigned S3 URLs

Large file uploads (campaign CSV files, ambient noise audio) use a two-step presigned URL approach — the file goes directly to object storage rather than through the API server.

Campaign CSV Upload

Step 1: Get a presigned upload URL

POST
/s3/presigned-upload-url

Request body:

json
{
  "filename": "leads-june-2026.csv",
  "content_type": "text/csv",
  "purpose": "campaign"
}
ParameterTypeRequiredDescription
filenamestringRequiredThe name of the file to upload.
content_typestringRequiredMIME type of the file. Use "text/csv" for campaign contact files.
purposestringRequiredIntended use of the file. Use "campaign" for campaign CSV uploads.

Response:

Response
json
{
  "upload_url": "https://storage.sysevo.io/...",
  "file_key": "campaigns/org123/abc456/leads-june-2026.csv"
}

Step 2: Upload the file

PUT the file directly to the presigned upload_url returned in Step 1. Do not include your API key — the presigned URL already encodes the necessary authorization.

bash
curl -X PUT "https://storage.sysevo.io/..." \
  -H "Content-Type: text/csv" \
  --data-binary @leads-june-2026.csv

Step 3: Reference the file key in campaign create

Use the file_key from the presigned URL response as the contacts_file_key when creating a campaign.

json
{
  "contacts_file_key": "campaigns/org123/abc456/leads-june-2026.csv",
  ...
}

Ambient Noise Audio Upload

POST
/workflow/ambient-noise/upload-url

Request body — AmbientNoiseUploadRequest:

json
{
  "filename": "office-ambience.mp3",
  "content_type": "audio/mpeg"
}
ParameterTypeRequiredDescription
filenamestringRequiredThe name of the audio file to upload.
content_typestringRequiredMIME type of the audio file (e.g. "audio/mpeg" for MP3).

Then PUT the audio file to the returned upload_url. Reference the file_key in the agent's audio settings.

Was this page helpful?
Open Dashboard →