---
title: "Ingest Traces"
method: POST
path: "/api/v1/public/traces"
tags: ["Traces"]
---

# Ingest Traces

`POST /api/v1/public/traces`

## Request

- Base URL: `https://app.traceroot.ai`
- URL: `https://app.traceroot.ai/api/v1/public/traces`
- Auth: HTTP bearer

Ingest OTLP trace data.

Accepts OTLP protobuf format only (optionally gzip compressed).
Protobuf is converted to camelCase JSON before storage in S3.

S3 path: events/otel/{project_id}/{yyyy}/{mm}/{dd}/{hh}/{uuid}.json

Headers:
    Authorization: Bearer <api_key>
    Content-Encoding: gzip (optional)
    Content-Type: application/x-protobuf

Body:
    OTLP trace data in protobuf format

## Request body `application/x-protobuf`

- string, binary

## Response `200`

Successful Response

- IngestResponse: Response for trace ingestion.
  - `file_key` string, required
  - `status` string, required

## Other responses

- `400`: Invalid request body
- `401`: Authentication failed
- `402`: Free plan limit exceeded
- `415`: Unsupported media type
- `422`: Validation Error
- `500`: Storage error
- `503`: Authentication service unavailable

---

[API](https://skmtc.dev/traceroot/apis/traceroot-public-api.md) - [All operations](https://skmtc.dev/traceroot/apis/traceroot-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/traceroot/apis/traceroot-public-api/revisions/ce6aef96c0d6?raw)
