Send your first events
You will learn how to create a stream API key and ingest sample JSON over native HTTP.
First-run ingest uses native HTTP JSON with a stream API key. Session cookies
and JWT login tokens cannot ingest — only a stream API key (lax_…).
Create a stream API key
- Select your stream in the sidebar.
- Open Streams so you see that stream’s settings.
- Scroll to API keys.
- Click New API key.
- Enter a Name (for example
local-curl) and click Create key. - Copy the secret immediately — it is shown only once.
The UI also offers a ready-to-run curl sample with your stream id and key filled in. Prefer that sample when it is available.
Send a single event
Replace the placeholders with your API host, stream id, and key:
export CORDO_API=https://api.cordo.cloud # or your API host
export STREAM_ID=<stream-uuid>
export KEY=lax_<prefix>_<secret>
curl -sS -X POST "$CORDO_API/v1/streams/$STREAM_ID/ingest" \
-H "Content-Type: application/json" \
-H "X-API-Key: $KEY" \
-d '{"level":"info","service":"api","msg":"hello from curl"}'
A successful call returns 202 Accepted with an accepted count.
Send a small batch
The same endpoint accepts a JSON array:
curl -sS -X POST "$CORDO_API/v1/streams/$STREAM_ID/ingest" \
-H "Content-Type: application/json" \
-H "X-API-Key: $KEY" \
-d '[{"level":"info","msg":"a"},{"level":"warn","msg":"b"}]'
Max body size for native ingest is 1 MiB.
Check that events arrived
- Keep the same stream selected in the sidebar.
- Open Events for a recent raw list, or Query to filter on learned
fields (for example
level). - Open Fields after a short wait — paths such as
level,service, andmsgshould appear as Cordo observes the payload.
Materialization can lag slightly behind ingest. If Query is empty for a few seconds, refresh and try again.
Other ways to ship logs
Native curl is enough for first run. When you are ready for production dial-tones (OpenSearch-compatible bulk, OTLP Logs, Vector / Fluent Bit, or MCP sample ingest), start at the chooser:
Next
Learn the sidebar surfaces: Five-minute tour.