The connection is tested before it is saved: Nixflex writes and deletes a tiny probe object in your bucket when you save the settings, so a saved configuration is a working configuration. Every recording upload is then verified - Nixflex reads the object back and checks its size before treating the recording as stored.
How it works
1
You connect a bucket
In Settings → Recording storage, or via the API below. You provide the bucket name, an endpoint URL, and credentials that allow writing objects.
2
Recordings go to your bucket
After each call, the audio is uploaded to
recordings/<call_id>.mp3 in your bucket (.wav for web calls). Nixflex stores only the object path, never the audio.3
The call record points at your bucket
recording_url becomes a path like byo:your-bucket/recordings/<call_id>.mp3. The dashboard shows where the file lives instead of a player - the audio is in your custody, so Nixflex has nothing to stream.If your bucket rejects an upload
A recording is never lost to a storage problem. If your bucket cannot take the file - deleted bucket, rotated credentials, an outage - the recording falls back to Nixflex’s standard EU storage for that call, and the call’s Events tab records aSTORAGE_FAILED event with the reason, so you can fix the bucket and know exactly which calls were affected.
Supported providers
Any storage that speaks the S3 API works. That includes:Amazon S3
Leave the endpoint empty and set your bucket’s region (for example
eu-west-2). Use an IAM key pair with PutObject on the bucket.Cloudflare R2
Endpoint:
https://<account_id>.r2.cloudflarestorage.com, region auto. Create an R2 API token with Object Read & Write scoped to the bucket.Wasabi
Endpoint:
https://s3.<region>.wasabisys.com with the matching region. Use an access key pair from the Wasabi console.MinIO / self-hosted
Your own
https:// endpoint. Any S3-compatible self-hosted store works the same way - useful for fully on-premise requirements.Google Cloud Storage also works through its S3 interoperability mode with HMAC keys. Azure Blob Storage does not speak the S3 API natively and needs an S3-compatible gateway in front of it.
Setting it up via the API
Storage is configured per API key - every call under the key uses it, across all your numbers and carriers.
The request returns
verified: true only after the probe write succeeds. Broken credentials are rejected, never saved.
Read the current configuration (the secret is never included):
What changes for you
recording_urlon the call record and in thecall.completedwebhook carries thebyo:path instead of a playable URL. If your code downloads recordings from that field, read the file from your own bucket instead.- The dashboard shows “Stored in your bucket” with the object path in place of the audio player.
- Deleting calls (GDPR deletion) removes the call record from Nixflex. Files in your bucket are in your custody - Nixflex never deletes from your storage, so apply your own retention rules there.
- Retention limits do not apply to your bucket. Nixflex’s 90-day cleanup covers Nixflex storage; your files are yours for as long as you keep them.
Consent and compliance
Where the file lives does not change the recording rules - announcement and consent requirements still apply. See Call recording.Related
- Call recording - switching recording on and off
- Webhooks -
recording_urlincall.completed - Data retention - what Nixflex keeps and for how long