Skip to content

Send OTLP over HTTP/protobuf

The traces endpoint accepts OTLP in both protobuf and JSON over HTTP. Most OpenTelemetry SDKs default to protobuf, so in practice you point the exporter at the endpoint, set the auth header, and you are done.

POST https://traces.siteqwality.com/v1/traces
Authorization: Bearer <api-key>
Content-Type: application/x-protobuf

A successful export returns 202 Accepted.

Most SDKs read standard environment variables, so no code change is needed.

Terminal window
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="https://traces.siteqwality.com/v1/traces"
export OTEL_EXPORTER_OTLP_TRACES_PROTOCOL="http/protobuf"
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer $SITEQWALITY_API_KEY"
export OTEL_SERVICE_NAME="billing-api"

The signal-specific variable is used verbatim, so it must include the full /v1/traces path.

HeaderHandling
application/x-protobufProtobuf. Use this one.
application/jsonOTLP JSON.

Both produce identical stored spans. Parameters after a semicolon are ignored, so application/x-protobuf; charset=utf-8 is fine.

Getting these wrong produces confusing failures, so they are worth stating plainly.

  • gRPC is not supported. This is an HTTP endpoint only. OTEL_EXPORTER_OTLP_PROTOCOL=grpc will not work; use http/protobuf.
  • Only traces. There is no OTLP endpoint for logs or metrics. Use the logs and metrics ingest APIs for those.
  • Compression is not handled. Leave OTEL_EXPORTER_OTLP_COMPRESSION unset. A gzipped body cannot be decoded and the export is rejected.
  • An empty export is rejected with a 400, rather than silently accepted.
  • Instrumentation scope name and version are discarded. Put anything you need to query on into span or resource attributes.

Each ResourceSpans group becomes one internal message with a 250 KiB ceiling. The default OpenTelemetry batch size of 512 spans sits comfortably inside that.

If you have raised max_export_batch_size substantially, or your spans carry unusually large attributes, bring it back down rather than debugging intermittent export failures.

Send some traffic, then look for the service:

Terminal window
curl -G https://api.siteqwality.com/traces/services \
-H "Authorization: Bearer $SITEQWALITY_API_KEY" \
--data-urlencode "start_time=2026-08-02T00:00:00Z" \
--data-urlencode "end_time=2026-08-02T23:59:59Z"

Your OTEL_SERVICE_NAME should appear. If it does not, check that the exporter is not using gRPC and that the Authorization header actually reached the endpoint.