Trace Exports
Stream gateway trace data to an external observability or evaluation tool in near-real-time.
Overview
Export configs stream gateway trace data to an external observability or evaluation tool in near-real-time, either as OTLP traces (Arize Phoenix, Langfuse, any OTel collector) or as signed webhook deliveries to your own ingest endpoint. Delivery runs on a background exporter fed by the async logging pipeline; it never blocks the proxied request.
Entitlement and roles
integrations entitlement (Enterprise plan). Reads need the viewer role; writes (create/update/delete) need admin.Export Kinds
otlp
Entries are batched (up to 100 entries, flushed at least every 5s) and POSTed as one ExportTraceServiceRequest with Content-Type application/x-protobuf. Spans use OTel GenAI semantic conventions, so any GenAI-OTel-aware backend can read them:
gen_ai.provider.namegen_ai.request.modelgen_ai.usage.input_tokens/gen_ai.usage.output_tokensgen_ai.input.messagesgen_ai.output.messagesgen_ai.user.idgen_ai.session.id
webhook
Each entry is delivered individually as JSON with Content-Type application/json, signed with the X-Ingate-Export-Signature header: a hex-encoded HMAC-SHA256 of the raw request body, keyed by the config's secret. To verify, compute HMAC-SHA256 of the exact bytes you received, hex-encode, and compare in constant time.
Delivery Guarantees
Delivery is best-effort: one immediate retry on failure, then the entry is dropped (never queued to disk). If the exporter's internal buffer is full, the entry is dropped without any retry.
Source Filtering
include_sources controls which log sources feed a config. Values are drawn from logging.UnifiedLog.Source:
proxy: passthrough/translation trafficapi: agent monitoring / SDK ingestotel: receiver-ingested spans
An entry is exported through a config only if its source appears in that config's include_sources. Omit the field on create to default to ["proxy", "api"].
Secrets
headers and secret are write-only: they are encrypted at rest and never echoed back by any endpoint, including GET. has_secret is the only visible signal that a webhook secret is set; use it to check configuration state without ever seeing the secret value again. To rotate a secret or headers, PUT new values to the config.
Hot Reload
Create, update, and delete take effect immediately: a live registry hot-reloads on every successful write, so no restart is required for a new or edited config to start (or stop) receiving traffic.
The ExportConfig Object
{
"id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
"org_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "phoenix-otlp",
"kind": "otlp",
"endpoint": "http://phoenix.internal:6006/v1/traces",
"has_secret": false,
"include_sources": ["proxy", "api"],
"enabled": true,
"created_at": "2026-08-29T12:00:00Z",
"updated_at": "2026-08-29T12:00:00Z"
}| Field | Type | Description |
|---|---|---|
id | uuid | Export config ID |
org_id | uuid | Owning org |
name | string | Unique per org |
kind | string | otlp or webhook |
endpoint | string | Destination URL |
has_secret | bool | Whether a webhook HMAC secret is configured |
include_sources | string[] | Which logging.UnifiedLog sources feed this config: proxy, api, otel |
enabled | bool | Whether this config is live in the exporter registry |
created_at / updated_at | timestamp | RFC 3339 |
Next Steps
- Exports API reference: full endpoint documentation
- Arize Phoenix: OTLP export to Phoenix
- Langfuse: OTLP export to Langfuse
- Ingest API: the inbound half, for pushing traces into Ingate rather than out of it