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_keyon every request. - Regional base URL:
base_urlis 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
nextURL rather than computing offsets, withlimit=100per 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
rawremainder column preserving fields the manifest does not project.