Write one JSON file per OpenDunes request into an S3 bucket, or any S3-compatible store.
With the s3 destination, every OpenDunes request is written as one JSON file into a bucket of yours — Amazon S3, or any store that speaks the S3 API.
| Setting | Required | Description |
|---|---|---|
bucketName | Yes | The bucket |
accessKeyId · secretAccessKey | Yes | Credentials allowed to write to the bucket |
region | No | The bucket's region. Default us-east-1 |
endpoint | No | An S3-compatible store's address; the bucket is addressed as its path |
sessionToken | No | For temporary credentials |
prefix | No | Default opendunes-traces |
pathTemplate | No | Where files go. Default {prefix}/{date} |
pathTemplate takes {prefix}, {date} (2026-09-24), {year}, {month}, {day} and {apiKeyName}. Each file is named <receipt id>-<unix seconds>.json.
curl https://opendunes.com/v1/observability/destinations \
-H "Authorization: Bearer $OPENDUNES_MANAGEMENT_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "S3",
"type": "s3",
"config": {
"bucketName": "souk-traces",
"region": "eu-west-3",
"accessKeyId": "AKIA…",
"secretAccessKey": "…",
"pathTemplate": "{prefix}/{apiKeyName}/{date}"
}
}'One signed PUT per request. The file:
{
"trace": {
"id": "…",
"name": "…",
"timestamp": "2026-09-24T09:12:03.000Z",
"userId": "customer-4521",
"sessionId": "chat-2026-09-24-001",
"input": [],
"output": "…",
"metadata": {},
"observations": [
{
"type": "GENERATION",
"model": "anthropic/claude-sonnet-5",
"provider": "…",
"promptTokens": 18,
"completionTokens": 42,
"totalTokens": 60,
"totalCost": 0.2574,
"finishReason": "stop"
}
]
}
}totalCost is in DA. Each observation also carries its ids, start and end times, the sampling parameters, the input and output, and a level.
Back to Broadcast overview.