Streams and ingest
You will learn how streams receive and store events.
A stream is the named destination for every ingest path. Each stream owns its field catalog, shapes, views, ingest API keys, and retention settings.
What a stream holds
| Piece | Role |
|---|---|
| Raw events | Durable JSON payloads for the stream |
| Field catalog | Learned paths, types, and samples |
| Shapes | Recurring structural fingerprints |
| Analytics projection | Fast query/aggregate store (may lag ingest briefly) |
| Views | Saved query configurations |
| API keys | Secrets used only for ingest |
Usage appears on Streams and Events as event counts and storage sizes (raw and analytics). Retention and optional size caps control how long data stays.
How events get in
All production methods share one pipeline after accept:
Ingest → observe (fields + shapes) → materialize (analytics)
| Method | Typical use | Auth |
|---|---|---|
| Native HTTP JSON | Apps, scripts, custom collectors | Stream API key (X-API-Key) |
| Native HTTP plain text | Unstructured one-line-per-event logs | Stream API key (X-API-Key) |
OpenSearch-compatible _bulk |
DigitalOcean App Platform and similar | HTTP Basic (password = API key) |
| OTLP Logs (HTTP) | OpenTelemetry Collector / exporters | Stream API key (X-API-Key or Bearer) |
| Vector / Fluent Bit | Sidecar / DaemonSet collectors | Same as native, OpenSearch, or OTLP |
MCP ingest_events |
Agents writing sample events | Personal access token |
Traces and metrics are out of scope — Cordo accepts OTLP Logs only.
For step-by-step setup of each method, see Ingest your logs.
What you wait for
| After… | What is ready |
|---|---|
| A successful ingest response | Events are durable; Events and live tails can show them immediately |
| Observe | Fields and Insights shapes update as paths and structures are learned |
| Materialize | Query, aggregates, and field stats over the analytics store catch up |
If Query looks empty for a few seconds after curl, refresh — materialization is asynchronous. Query and Views distinguish lag from a true empty match, and from a truncated page.
Schema learning limits
Field and shape catalogs have soft and hard caps. Streams shows Schema learning (Fields and Insights banner the same state). A hard cap skips new paths or fingerprints; ingest still stores the event. This is not a type conflict.
Ingest refusals
When ingest is rejected (storage cap, rate or byte budget, oversized request, or plaintext-on-JSON-only path), the stream records an Ingest refused reason and count for owners. The payload is not stored.
Retention and size
When you create or edit a stream:
- Retention — how long events are kept (UI presets such as 3 days, 7 days, 30 days, 90 days, 1 year). Default is typically 30 days.
- Max stored bytes — optional size safety valve. Empty means no size cap. When set, oldest events are removed first after time-based retention.
A background worker enforces retention; expired data is removed from both raw storage and the analytics projection.
Parse user agents
Optional stream setting Parse user agents. When enabled, ingest detects
common user-agent field names and adds a sibling {field}_parsed object with
browser, OS, and device details (for example user_agent →
user_agent_parsed.browser_family).
Leave this off unless you need those derived fields.
Redact sensitive fields
Optional stream setting Redact sensitive fields on ingest. When enabled, ingest rewrites event payloads before they are stored (Postgres and analytics):
- Preset denylist paths such as
password,token,authorization, and similar (same rules as catalog sample redaction) - Values that look like secrets (API keys, JWTs, etc.)
- Extra dotted paths you configure on the stream (for example
headers.cookie)
String values become [REDACTED]; other types become null. Sibling _raw /
_cordo_raw fields are cleared when nested children are redacted.
This is irreversible for events already written — turn it on before sending secrets. Sample-only redaction (Fields / Insights) does not protect stored payloads; use this setting for that.
REST create/update expose redact_sensitive and redact_fields. Preview a
sample without storing it via
POST /v1/streams/{id}/redact/preview.
Next
- Fields and shapes: Fields and shapes
- Keys for ingest vs agents: API keys and personal access tokens
- Hands-on: Create and manage streams
- Return to Concepts