Skip to main content
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 and is beta. Its resources are stable, though future releases may add columns.

Configuration

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. 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.