> ## Documentation Index
> Fetch the complete documentation index at: https://filament.getgalaxy.io/llms.txt
> Use this file to discover all available pages before exploring further.

# PostHog

> Read people, events, cohorts, feature flags, experiments, and session replay metadata from a PostHog project

The PostHog source reads people, events, cohorts, feature flags, experiments,
insights, dashboards, actions, annotations, surveys, and session recordings
from one project. It is built with an
[HTTP manifest](/pages/connectors/building-a-connector/http-manifests) and is
**beta**. Its resources are stable, though future releases may add columns.

## Configuration

| Field        | Scope      | Default                  | Description                                                                   |
| ------------ | ---------- | ------------------------ | ----------------------------------------------------------------------------- |
| `api_key`    | Connection |                          | Required. Secret. Personal API key with read scopes for the synced resources. |
| `project_id` | Connection |                          | Required. The digits after `/project/` in the app URL.                        |
| `host`       | Connection | `https://us.posthog.com` | US Cloud, `https://eu.posthog.com`, or a self-hosted origin.                  |

`host` must be the app origin, not the `us.i.posthog.com` ingestion host,
which does not serve `/api`.

## Resources

All resources are independent lists under `/api/projects/{project_id}/`.
`persons` is the endpoint used by an explicit live connection test. The
service API's normal config validation does not make that request. Useful IDs
from embedded objects are also exposed as columns, such as
`experiments.feature_flag_id` and `session_recordings.person_id`.

## Modes

All resources support full reads. If interrupted, a full read resumes after
the last completed page.

Two resources are incremental.

| Resource   | Cursor field       | Request parameter   | Checkpoint key              | Overlap |
| ---------- | ------------------ | ------------------- | --------------------------- | ------- |
| `events`   | `timestamp`        | `after` (query)     | `events_timestamp`          | 3600 s  |
| `insights` | `last_modified_at` | `date_from` (query) | `insights_last_modified_at` | 300 s   |

Both use the `time` comparator. The cursor field is fixed by the manifest.
Only a lookback window is user-configurable, and only because the comparator
is `time`. The `events` overlap is a full hour because event timestamps are
client-supplied. Buffered mobile SDKs deliver events well behind wall clock,
and the primary key dedupes the re-read. `insights` covers only clock skew,
since `last_modified_at` is server-set. `persons` has no incremental block.
The API offers no updated-since filter, so every run is a full snapshot.

## Behavior

* **Auth**: bearer token from `api_key` on every request.
* **Regional base URL**: `base_url` is templated as `{{ config.host }}` and
  rendered once at Configure, against config only. One manifest serves US
  Cloud, EU Cloud, and self-hosted instances.
* **Pagination**: every list endpoint returns a DRF envelope. The manifest
  follows the absolute `next` URL rather than computing offsets, with
  `limit=100` per page.
* **Rate limiting**: a static 0.3 requests/second limiter, sized to the
  binding constraint (the analytics endpoints share a 1200-requests/hour
  bucket). Draining an hourly bucket is a run failure, not a slowdown.
  Retry sleeps cap at 60 seconds, so an hour-long window cannot be waited out.
  PostHog publishes no rate-limit response headers, so there is no dynamic
  block.
* **Timeout**: `timeout_seconds: 120`, double the engine default, because
  person and session-recording pages carry large embedded property blobs.
* Every resource carries a `raw` remainder column preserving fields the
  manifest does not project.
