Endpoints
| Method | Path | Content-Type | Description |
|---|---|---|---|
| POST | /v1/events | application/json | Ingest events (JSONL) |
| POST | /v1/logs | application/json | Ingest logs (JSONL) |
| POST | /v1/ingest | application/x-flatbuffers | Binary FlatBuffer batches |
| GET | /health | — | Returns {"status": "ok"} |
application/octet-stream and application/x-tell are also accepted on the binary endpoint.
Authentication
Three ways to authenticate, in precedence order:Authorization: Bearer <key>headerX-API-Key: <key>header?token=<key>query parameter
Responses
202 Accepted — all items ingested successfully:max_payload_size. 429 Too Many Requests — rate limited after repeated auth failures. 503 Service Unavailable — pipeline backpressure (channel full).
CORS and browser clients
CORS is enabled by default so browser SDKs work without extra setup. The source mirrors the request’sOrigin header and allows Authorization, Content-Type, X-API-Key, and X-Workspace-ID headers.
To restrict allowed origins:
TLS
Tell supports HTTPS natively via rustls. Provide PEM-encoded certificate and key files:Reverse proxy
Running Caddy in front of Tell is the simplest way to get automatic HTTPS with Let’s Encrypt certificates and zero TLS configuration:trust_proxy in Tell so the real client IP is captured from X-Forwarded-For:
X-Forwarded-For. Only enable trust_proxy when the HTTP source is behind a trusted proxy — clients can forge the header otherwise.
Rate limiting
Authentication failures are rate-limited per IP. After 10 failures within 60 seconds, the IP is temporarily blocked with429 Too Many Requests. The rate limiter cleans up expired entries every 5 minutes.
Safety limits
JSONL endpoints enforce two limits to prevent denial-of-service:- 10,000 lines per request — requests with more lines are rejected
- 32 levels of JSON nesting — deeply nested objects are rejected before parsing
Configuration reference
What’s next
- TCP source — higher throughput for native SDKs
- JavaScript SDK — the primary client for the HTTP source
- API keys — create and manage streaming keys
- Routing — control where HTTP data goes after ingestion