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-urlRequest body:
json
{
"filename": "leads-june-2026.csv",
"content_type": "text/csv",
"purpose": "campaign"
}| Parameter | Type | Required | Description |
|---|---|---|---|
filename | string | Required | The name of the file to upload. |
content_type | string | Required | MIME type of the file. Use "text/csv" for campaign contact files. |
purpose | string | Required | Intended 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.csvStep 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-urlRequest body — AmbientNoiseUploadRequest:
json
{
"filename": "office-ambience.mp3",
"content_type": "audio/mpeg"
}| Parameter | Type | Required | Description |
|---|---|---|---|
filename | string | Required | The name of the audio file to upload. |
content_type | string | Required | MIME 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 →