Copy every request, as a trace, to your own observability tool, data warehouse or webhook.
Broadcast copies every request you make, as a trace, to your own monitoring tool — no instrumentation in your code. You add a destination once, with a management key; from then on each request is sent there after it has been settled.
POST /v1/observability/destinations: its type, and the settings that tool needs./v1 model route — chat, messages, responses, embeddings, rerank, pictures, speech, transcription, video, System One, batches.Every request sends a trace: one answered from the response cache (0 DA), one refused before a model ran, one whose model failed, and every stream.
| Destination | type | Receives |
|---|---|---|
| Arize AX | arize | OTLP traces |
| Braintrust | braintrust | OTLP traces |
| ClickHouse | clickhouse | a row in your table |
| Comet Opik | opik | OTLP traces |
| Datadog | datadog | LLM Observability spans |
| Google BigQuery | bigquery | a row in your table |
| Grafana Cloud | grafana | OTLP traces |
| Langfuse | langfuse | OTLP traces |
| LangSmith | langsmith | OTLP traces |
| New Relic | newrelic | OTLP traces |
| OpenTelemetry Collector | otel-collector | OTLP JSON |
| PostHog | posthog | an $ai_generation event |
| Raindrop | raindrop | a tracked event |
| Ramp | ramp | OTLP JSON |
| S3 / S3-Compatible | s3 | one JSON file per request |
| Sentry | sentry | OTLP traces |
| Snowflake | snowflake | a row in your table |
| W&B Weave | weave | OTLP traces |
| Webhook | webhook | OTLP JSON |
Up to five destinations of one type. Every address is HTTPS on the public internet. Every type also takes headers in its config — an object of strings, sent with each delivery.
curl https://opendunes.com/v1/observability/destinations \
-H "Authorization: Bearer $OPENDUNES_MANAGEMENT_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Souk Bot traces",
"type": "langfuse",
"config": { "publicKey": "pk-lf-…", "secretKey": "sk-lf-…" }
}'The answer is the destination, 201, with its secrets masked. The routes, the filters and every setting are on the Observability reference.
| When | Carries |
|---|---|
| Always | The model that answered and the one requested, the provider, start and end times, the finish reason, token counts, the cost in DA, and whether it failed |
Unless privacy_mode is on | The input and the output, as text |
| When you send them | user and session_id from the request body, the sampling parameters (temperature, max_tokens and the like), and a trace object — see below |
| When the destination opts in | an opendunes_generation object in the metadata: the cost and token counts (broadcast_generation_cost), the key's name and hash (broadcast_generation_identity), the route, streaming and user agent (broadcast_generation_request_context) |
The provider on a trace is the lab that served the request.
Add a trace object to any request body. trace_id groups several requests under one trace, trace_name, span_name and generation_name name them, parent_span_id nests one under another; every other key arrives as metadata.
{
"model": "anthropic/claude-sonnet-5",
"messages": [{ "role": "user", "content": "Wach kayen iPhone 16?" }],
"user": "customer-4521",
"session_id": "chat-2026-09-24-001",
"trace": {
"trace_name": "souk-bot-answer",
"shop": "algiers-center"
}
}| Setting | Sends |
|---|---|
sampling_rate | a share of requests, from 0.0001 to 1 — the same request always falls the same side |
api_key_hashes | only the requests of these keys |
filter_rules | only the requests that pass your rules — on the model, provider, user_id, session_id, cost, tokens and more |
enabled: false | nothing, until you enable it again |