Appearance
Integrations
If your code already sends data somewhere, you probably don't need to change it. Ingest speaks the wire protocols of the common tools, so you switch by changing an endpoint and a key in configuration.
| You use | Change | Guide |
|---|---|---|
| OpenTelemetry SDK or Collector (logs) | The OTLP logs endpoint and an authorization header | OpenTelemetry |
| Vector, Fluent Bit or another log shipper | An HTTP sink to /v1/ingest | Vector and Fluent Bit |
| Segment SDKs | The API host, and the ingest key as the write key | Segment |
| Sentry SDKs | Only the DSN | Sentry |
| Datadog Agent, Vector or Fluent Bit to Datadog logs | The logs intake URL and the API key | Datadog logs |
| Promtail, Grafana Alloy, Vector or Fluent Bit to Loki | The Loki URL and the token or password | Loki |
| Splunk HEC senders | The HEC URL and the token | Splunk HEC |
| PostHog, Mixpanel or Amplitude payloads | Post their event shapes to /v1/ingest | Payload shapes |
| Vercel | Add a Log Drain, signed with the ingest key | Vercel |
| Heroku | Add an HTTPS log drain with the key in its URL | Heroku |
| Fly.io | Add a sink file to fly-log-shipper | Fly.io |
| Cloudflare | Point a Logpush job at /v1/ingest | Cloudflare |
| OpenRouter | Add a Webhook destination under Broadcast | OpenRouter |
| Stripe, Buy Me a Coffee, Lemon Squeezy, Paddle, Gumroad, Ko-fi, Patreon, GitHub, Typeform, Tally or any JSON webhook | Paste a webhook URL from the Webhooks tab | Inbound webhooks |
On WordPress or Shopify, there's nothing to change in code: install the WordPress plugin or the Shopify app and paste a public key.
Every recipe works with a public (sdl_pub_…) or secret (sdl_sec_…) key. Use a secret key for servers and shippers, and give each source its own deployment and key so its numbers get their own tab.
Limits that shape every recipe
- 512 KB per request as sent. Gzip counts compressed bytes. Aim for 256 KB or less.
- Hosting logs count too. Every request log a drain sends is an event, so pick its sources and sample it (each page says how).
- Exact counts need
event_idandts. OpenTelemetry, Segment, Sentry, Datadog, Loki, Splunk, Vercel and Heroku get ids automatically, from the content or the message id. NDJSON senders must set both before the first send attempt. - Retry everything that isn't a success, with backoff. Each path answers success only once the data is stored.
- Gzip is the only compression, except that Loki's snappy protobuf is accepted.
br,zstdanddeflateare refused with415.
What isn't stored
The drop-ins carry events and log lines. Other parts of each protocol are answered clearly, never silently dropped:
- OpenTelemetry
/v1/tracesand/v1/metricsanswer404with a message naming the setting to turn off. OpenRouter's traces are the exception: each LLM call becomes an event. - Sentry transactions, spans, sessions, replays, attachments and profiles are skipped, and every answer tells the SDK to stop sending them.
- Datadog metrics, APM and events, Loki queries and Splunk acknowledgments answer
404.
Errors from Sentry, and OpenTelemetry records with an exception.type, group into Issues. Requests, jobs and traces come from telemetry objects on /v1/ingest, which the Laravel SDK sends for you.
Next steps
Pick your tool in the table above, or use an SDK for new code.