> ## Documentation Index
> Fetch the complete documentation index at: https://openrouter.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.
# PostHog
> Send traces to PostHog
[PostHog](https://posthog.com) is an open-source product analytics platform that helps you understand user behavior. With PostHog's LLM analytics, you can track and analyze your AI application usage.
## Step 1: Get your PostHog project API key
In PostHog, navigate to your project settings:
1. Log in to your PostHog account
2. Go to **Project Settings**
3. Copy your Project API Key (starts with `phc_...`)
## Step 2: Enable Broadcast in OpenRouter
Go to [Settings > Observability](https://openrouter.ai/settings/observability) and toggle **Enable Broadcast**.
## Step 3: Configure PostHog
Click the edit icon next to **PostHog** and enter:
* **Api Key**: Your PostHog project API key (starts with `phc_...`)
* **Endpoint** (optional): Default is `https://us.i.posthog.com`. For EU region, use `https://eu.i.posthog.com`
## Step 4: Test and save
Click **Test Connection** to verify the setup. The configuration only saves if the test passes.
## Step 5: Send a test trace
Make an API request through OpenRouter and view the LLM analytics in your
PostHog dashboard.
## Custom Metadata
PostHog receives LLM analytics events with custom metadata included as event properties. Use the `trace` field to attach additional context to your analytics data.
### Supported Metadata Keys
OpenRouter maps the reserved `trace` fields below to PostHog's native `$ai_*` properties,
which power PostHog's built-in LLM analytics dashboards.
| Key | PostHog Property | Description |
| ----------------- | ---------------- | --------------------------------------------------- |
| `trace_id` | `$ai_trace_id` | Custom trace identifier for grouping related events |
| `generation_name` | `$ai_span_name` | Name for the LLM generation event |
### Custom property pass-through
`trace_name` is forwarded as a plain custom property `trace_name` (not as `$ai_trace_name`),
so you can filter events by trace name in PostHog without knowing PostHog's `$ai_*` naming
convention.
Every other key inside `trace` that is not in the table above is forwarded as
`metadata_` (e.g. `feature` → `metadata_feature`).
> **Depth cap:** Custom property values are limited to 3 levels of nesting. Values nested
> deeper than 3 levels are replaced with `'[truncated]'`. This keeps event payloads compact
> and PostHog parse latency low.
### Example
```json lines theme={null}
{
"model": "openai/gpt-4o",
"messages": [{ "role": "user", "content": "Recommend a product..." }],
"user": "user_12345",
"session_id": "session_abc",
"trace": {
"trace_name": "Product Recommendations",
"generation_name": "Generate Recommendation",
"feature": "shopping-assistant",
"ab_test_group": "variant_b"
}
}
```
The above request produces a `$ai_generation` event with these properties (among others):
| PostHog property | Value |
| ------------------------ | --------------------------- |
| `trace_name` | `"Product Recommendations"` |
| `$ai_span_name` | `"Generate Recommendation"` |
| `metadata_feature` | `"shopping-assistant"` |
| `metadata_ab_test_group` | `"variant_b"` |
### Additional Context
* The `user` field maps to PostHog's `distinct_id` for user-level LLM analytics
* The `session_id` field maps to `$ai_session_id` for session grouping
* PostHog's LLM analytics dashboard automatically tracks token usage, costs, and model performance
## Privacy Mode
When [Privacy Mode](/docs/guides/features/broadcast#privacy-mode) is enabled for this destination, the `$ai_input` and `$ai_output_choices` properties are excluded from events. All other analytics data — token usage, costs, model information, and custom metadata — is still sent normally.