See how different teams leverage real-time logs to improve their workflows
Empower non-technical teams to search payments and resolve tickets 73% faster
Track customer engagement and conversion events
Coming soonEverything you need is on this page. No SDK required, no code required either: your AI builder can do all of this from one prompt.
Anatomy of a log
A log is one tiny package of JSON. Three fields are required, the rest are seasoning.
Payment received
● revenuejust nowrichard@piedpiper.com paid $49
notify: true also sends a push notification to your phone.
Hover the JSON, or the card, to see what maps where
projectRequiredWhich workspace this belongs to. Your workspace ID, copied once from Setup.
e.g. "wsp_4f2k…"
channelRequiredWhich shelf of your feed this lands on. revenue, signups, failures. You invent them just by using them.
e.g. "revenue"
eventRequiredThe headline. Short, human, emoji up front so you can read the feed at a glance.
e.g. "💰 Payment received"
descriptionOptionalOne sentence of detail under the headline. The who and how much.
e.g. "richard@piedpiper.com paid $49"
iconOptionalOne emoji that becomes the face of the event in the feed. Skipped? We use the one in your title.
e.g. "💰"
notifyOptionalSet true and your phone buzzes. Save it for events you would get out of bed for.
e.g. true
tagsOptionalLittle labeled chips on the card. Amounts, plans, ids. Searchable forever.
e.g. {"plan": "Solo", "amount": "$49"}
user_idOptionalWho did it. Send an email or id and every event builds that customer's timeline.
e.g. "richard@piedpiper.com"
timestampOptionalWhen it happened, in Unix seconds. Skip it and we stamp it on arrival.
e.g. 1735123456
keywordsOptionalExtra search words that do not show on the card but make it findable.
e.g. ["stripe", "checkout"]
parserOptionalHow the description is rendered. MARKDOWN by default, TEXT if you want it raw.
e.g. "MARKDOWN"
Click any log
Every event in the feed is clickable. Inside, the description renders Markdown, and any media URL you send becomes a real preview. Not just text: proof.
{
"channel": "renders",
"event": "🎬 Video rendered",
"description": "**24s clip** for [gwen](mailto:gwen@web.app),
ready to publish.",
"tags": {
"video": "https://cdn.yourapp.com/render-42.mp4",
"duration": "24s",
"preset": "vertical-1080p"
}
}Video rendered
just now24s clip for gwen, ready to publish.
MarkdownDescriptions render bold, links, and lists by default. Write a readable sentence, not a code dump.
MediaAny image, video, or audio URL in your tags embeds automatically, lazy-loaded. Generated a thumbnail, a render, a voice note? Preview it right in the feed.
ButtonsAttach an action link with buttonData: "Open order", "View in admin". One click from the event to the fix.
Media is detected by URL: png, jpg, gif, webp for images · mp4, webm, mov for video · mp3, wav, m4a for audio.
Quick start
Step 2
Your Project ID and API key live in Workspace → Settings → API (click Reveal to show the key). Each key is scoped to a single workspace. Authenticate every request with it:
Authorization: <your-api-key>Keep it server-side. Never ship it to the browser.
Step 3
curl -X POST https://api.logs.so/v2/log \
-H "Content-Type: application/json" \
-H "Authorization: your-api-key-here" \
-d '{
"project": "my-project",
"channel": "api-logs",
"event": "User Registration",
"description": "New user registered successfully",
"tags": {"user": "123"},
"notify": false,
"timestamp": 1735123456
}'Open your feed. It's already there.
API reference
https://api.logs.so/v2/log| Field | Type | Required | Description |
|---|---|---|---|
| project | string | yes | Your workspace/project ID |
| channel | string | yes | Channel name for the log |
| event | string | yes | Event title |
| description | string | no | Event description |
| icon | string | no | Single emoji character |
| notify | boolean | no | Send notification (default: false) |
| tags | object | no | Custom tags (object) |
| parser | string | no | Parser type [MARKDOWN, TEXT] |
| user_id | string | no | User ID |
| timestamp | number | no | Unix timestamp (seconds) |
| keywords | array | no | Keywords for search (array) |
export interface CreateLogParams {
project: string,
channel: string,
event: string,
description?: string,
icon?: string,
notify?: boolean,
tags?: Record<string, any>,
parser?: string,
user_id?: string,
timestamp?: number, // Unix timestamp (seconds)
keywords?: string[],
}
export interface CreateLogRemoteParams extends CreateLogParams {
apiKey: string;
apiUrl?: string;
}Examples
curl -X POST https://api.logs.so/v2/log \
-H "Content-Type: application/json" \
-H "Authorization: your-api-key-here" \
-d '{
"project": "my-project",
"channel": "api-logs",
"event": "User Registration",
"description": "New user registered successfully",
"tags": {"user": "123"},
"notify": false,
"timestamp": 1735123456
}'Connect your agent
Hook an MCP client to your feed and ask things like:
Rather not write any of this?
Paste one prompt into your AI builder and it wires everything up.