Profiles
Push CPU, wall, allocation and other profiles with an ingestion key that has ingest:profiles. The gateway stores the raw bytes and the worker parses them; the tenant and environment come from the key, never from the request. Limits: 8 MiB (compressed) per request, 60 profiles per minute per project. Over the size you get 413; over the rate you get 429 with Retry-After. Success is 202 {"profile_id": "<uuid>"}. Delivery is at-least-once.
Set WT_ENDPOINT (for example https://ingest.example.com) and WT_INGEST_KEY. Authenticate with Authorization: Bearer $WT_INGEST_KEY.
pprof or folded stacks
curl -X POST "$WT_ENDPOINT/v1/profiles?service=checkout&version=1.4.2&format=pprof" \
-H "Authorization: Bearer $WT_INGEST_KEY" \
-H "Content-Type: application/octet-stream" \
-H "Content-Encoding: gzip" \
--data-binary @cpu.pb.gzservice is required; format is pprof (default) or folded. Content-Encoding may be gzip or absent. env is accepted and ignored: the environment is the key's.
OTLP profiles
OTLP/HTTP protobuf: POST /v1development/profiles with Content-Type: application/x-protobuf. OTLP/gRPC: opentelemetry.proto.collector.profiles.v1development.ProfilesService/Export on the OTLP gRPC port. JSON is not accepted yet.
Pyroscope-compatible ingest
POST /ingest?name=checkout.cpu{env=prod}&from=<unix s>&until=<unix s>&units=samples&format=pprof|folded with a raw body. This is compatible, not Pyroscope: the application name maps to the service, the {...} tags to labels. Multipart uploads are not accepted.
Debug files
Native frames are symbolized from debug files you upload with wtctl sourcemaps; unresolved frames show as [unknown] module+0xoffset until you upload.