> ## Documentation Index
> Fetch the complete documentation index at: https://platform.atlan.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> To act on Atlan objects, use the Atlan MCP server at https://api.atlan.com/mcp or the SDK. To install or publish skills from a terminal, use the `aireg` CLI; `aireg --map json` prints its command map. The `atlanai` CLI is deprecated. Run a read-only identity check before any write.
> The docs MCP server at /mcp searches these docs only. It cannot read or change Atlan objects.
> SDK packages: Python `atlanai` (PyPI) and TypeScript `@atlanai/sdk` (npm). Show Python first, then TypeScript.
> These docs cover Atlan AI Registry, Atlan's hosted product. The AI registry specification and aireg CLI are maintained separately. /open-source lists publicly reachable signed installers and explains that the source repository and hosted CLI reference currently require GitHub access. Do not claim the repository or its reference docs are publicly accessible. Use these docs for Atlan-specific setup such as the adapter, sign-in and workspaces.

# Trace limits and privacy

> Ingest size and span limits, why a trace batch is rejected, the organization's trace content policy, and how to delete a trace's stored content.

This page lists what `POST /otel/v1/traces` accepts, why it refuses a batch, and the two privacy controls that act after a trace arrives: the organization's content policy and content deletion. To keep content from leaving your process in the first place, follow [Control trace privacy](/tools/sdk/how-tos/privacy).

## Ingest limits

Limits apply to each request. These are the service defaults.

| Limit | Default | When exceeded |
| - | - | - |
| Request body, compressed | 16 MiB | Refused with `413` `compressed_payload_too_large` |
| Request body, decompressed | 64 MiB | Refused with `413` `decompressed_payload_too_large` |
| Spans per request | 10,000 | Refused with `413` `too_many_spans` |
| One attribute value | 256 KiB | Accepted. The string is replaced with `[truncated:<size> bytes]`; an oversized bytes value is emptied. |
| Spans per request, minimum | 1 | Refused with `400` `empty_trace_batch` |
| `X-Atlan-Ingest-Id` | 1 to 128 letters, digits, `-`, `_`, or `.` | Refused with `400` `invalid_ingest_id` |
| Content type | `application/x-protobuf` or `application/json`, optionally `Content-Encoding: gzip` | Refused with `415` |
| Concurrent ingest requests | Bounded per service | Refused with `429` `too_many_concurrent_requests`. Retry later. |

The atlanai SDK splits its exports into payloads of at most 1 MiB by default. See `ATLAN_MAX_PAYLOAD_BYTES` in [Configuration](/tools/sdk/references/configuration).

## Rejected batches

A refused request stores nothing: the whole batch is rejected, not individual spans. The response is an `application/problem+json` body whose `code` names the cause.

| Status | Code | Cause | What to do |
| - | - | - | - |
| `400` | `invalid_json`, `invalid_protobuf`, `invalid_gzip` | The body does not decode as the declared content type or encoding. | Fix the encoding, then send a new batch. |
| `400` | `empty_trace_batch` | The batch has no spans. | Send at least one span. |
| `400` | `invalid_workspace_override` | `X-Atlan-Workspace-Id` is not a valid workspace handle. | Send the `workspace_...` ID. |
| `401` | | The API key is missing or not valid. | Check the key in your secret store. |
| `403` | `workspace_forbidden` | The sender cannot create in the named workspace. | Use an identity with access. Do not change the header to get around an access boundary. |
| `409` | `idempotency_conflict` | The `X-Atlan-Ingest-Id` was already used with a different payload, workspace, or sender. | Read back the earlier batch. Use a new ID only for a changed payload. |
| `413` | `compressed_payload_too_large`, `decompressed_payload_too_large`, `too_many_spans` | The batch is over a limit above. | Split between complete trace trees and resend. |
| `415` | `unsupported_content_type`, `unsupported_content_encoding` | The content type or encoding is not accepted. | Send protobuf or JSON, optionally gzipped. |
| `422` | `invalid_coding_agent_schema` | An SDK or coding-agent batch is malformed, for example an unsupported `atlan.sdk.schema_version` or a missing `service.name`. | Upgrade the SDK or plugin, or correct the resource attributes. |
| `429` | `too_many_concurrent_requests` | Too many ingest requests at once. | Retry with backoff. |
| `503` | `workspace_authorization_unavailable` | Atlan could not check workspace access. | Retry the unchanged batch with the same `X-Atlan-Ingest-Id`. |

A `200` means the batch was accepted and durably queued. The trace becomes readable after processing; see [Imported trace not found](/registry/traces/troubleshooting#imported-trace-not-found). After a timeout or `5xx`, follow [Import outcome unknown](/registry/traces/troubleshooting#import-outcome-unknown).

## Organization content policy

A trace has two parts. Its **structure** is the timeline, span names, timings, models, token counts, and costs. Its **content** is the prompts, responses, tool arguments and results, and title. The organization's content policy decides whether Atlan stores the content part of new traces. Usage analytics are always stored.

| `capture` | Meaning |
| - | - |
| `store` | Store the content of traces collected from now on. |
| `drop` | Discard the content of traces collected from now on. Structure is still stored. |
| `null` | The organization never set a value. Set `store` or `drop` explicitly rather than rely on this state. |

* **Who can read it**: every member of the organization, with `GET /registry/v1/organisations/trace-content-policy`.
* **Who can change it**: organization admins with settings access, with `PUT /registry/v1/organisations/trace-content-policy`. Others get `403`. The change is audited.
* **What it can't do**: the policy only narrows. It cannot store content that a sender already dropped, such as with `trace_content=False` in the SDK. Changing it does not recover dropped content or erase stored content.

In the app, open **Settings → Personal → Trace privacy**, select **Organization settings**, and review **Store session content**. See [Manage trace privacy](/admin/security/how-tos/manage-trace-privacy).

```bash theme={null}
curl -sS --fail-with-body \
  -X PUT "${ATLAN_BASE_URL}/registry/v1/organisations/trace-content-policy" \
  -H "Authorization: Bearer ${ATLAN_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"capture": "drop"}'
```

The response is the saved policy, with `capture`, `updated_at`, and `updated_by`. A value other than `store`, `drop`, or `null` is refused with `400`.

## Delete a trace's content

`DELETE /registry/v1/users/{user_id}/traces/{trace_id}/content?workspace_id=...` permanently removes one trace's stored content.

| Parameter | Required | Meaning |
| - | - | - |
| `user_id` | Yes | The trace's creator: the identity whose key sent it. Read your own ID from `GET /registry/v1/users/me`. |
| `trace_id` | Yes | The trace whose content to delete. |
| `workspace_id` | Yes | The workspace the trace is in. The same trace ID can exist in several workspaces. |

* **Who can delete**: the trace's creator, or an organization admin with settings access. An admin addresses the trace under its creator's `user_id`.
* **What it removes**: prompts, responses, tool arguments and results, and the trace title. The structure, including token counts and costs, stays.
* **When**: reads return structure only from the moment the request succeeds. Stored copies are then removed in the background.
* **Permanence**: content arriving later for a deleted trace is refused, and turning storage back on does not restore it.

| Status | Meaning |
| - | - |
| `200` | `{"outcome": "deleted"}`, or `{"outcome": "already_deleted"}` for a repeat. |
| `403` | You are not the creator and lack settings access, or cannot read the workspace. |
| `404` | No content was stored for this trace in this workspace, or `user_id` is not its creator. |

With the SDK, call `client.users.traces.delete_content(user_id, trace_id)` with a workspace set on the client. See [Users](/tools/sdk/references/operations/users).

## Retention

The trace store has no automatic expiry. Deleting content removes only the content; there is no public operation that deletes a trace's structure.

## Related

* [Manage trace privacy](/admin/security/how-tos/manage-trace-privacy): Change the content policy in the app and review your history.
* [Control trace privacy](/tools/sdk/how-tos/privacy): Suppress, mask, or sample content before it is sent.
* [Trace attributes](/registry/traces/references/attributes): The keys Atlan reads from each span.
* [Trace errors](/registry/traces/troubleshooting): Symptoms and fixes for sending and import failures.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.