cognitive3dpy is a Python client for the Cognitive3D analytics API. It turns raw JSON responses into a Polars or Panadas DataFrames ready for analysis, handling authentication, pagination, property flattening, name resolution, and type coercion so you can go from API key to analysis-ready data in a few lines of code.
pip install cognitive3dpyTo enable pandas output (output="pandas"), install with the optional extra:
pip install "cognitive3dpy[pandas]"- Log in to your Cognitive3D Dashboard
- Click your profile icon in the top-right corner and select Settings
- Navigate to the API Keys tab
- Click Create API Key, give it a name, and copy the generated key
Store the key in a .env file (never commit this to version control):
C3D_API_KEY=your_api_key_hereOr set it as an environment variable in your shell:
export C3D_API_KEY=your_api_key_hereimport cognitive3dpy as c3d
# Authenticate and set project
c3d.c3d_auth() # reads C3D_API_KEY env var, or pass key directly
c3d.c3d_project(4460) # set default project ID
# Pull data
sessions = c3d.c3d_sessions(n=100)
events = c3d.c3d_events()
results = c3d.c3d_objective_results(group_by="steps")
session_steps = c3d.c3d_session_objectives()
polls = c3d.c3d_exitpoll()| Function | Description | Key output columns |
|---|---|---|
c3d_sessions() |
Session-level metrics and properties | session_id, duration_s, hmd, c3d_metrics_*, c3d_device_*, c3d_geo_* |
c3d_sessions(session_type="scene") |
Sessions split by scene visited — one row per session-scene | Adds scene_id, scene_version_id, scene_name |
c3d_events() |
One row per in-session event with session context | event_name, event_date, position_x/y/z, object, scene_name, prop_* |
c3d_objective_results() |
Objective success/failure counts by version | objective_name, version_number, succeeded, failed, completion_rate |
c3d_objective_results(group_by="steps") |
Step-level detail for each objective | Adds step_name, step_type, step_detail, avg_completion_time_s |
c3d_session_objectives() |
Per-session objective step results — one row per step per session | session_id, participant_id, objective_name, step_number, step_description, step_result, step_duration_sec |
c3d_exitpoll() |
Exit poll survey responses | question_title, value, value_label, per hook/version |
Retrieve session-level data with optional date filtering and compact/full column modes.
# Last 30 days, compact columns (default)
sessions = c3d.c3d_sessions(n=100)
# Custom date range, all columns
sessions = c3d.c3d_sessions(
n=50,
start_date="2025-01-01",
end_date="2025-06-01",
compact=False,
)Use session_type="scene" to get session data broken out by scene — one row per session-scene combination. This is useful for comparing metrics across scenes within the same session. Defaults to the latest version of each scene.
# All scenes, latest versions (default)
scene_sessions = c3d.c3d_sessions(session_type="scene")
# Filter to a specific scene
scene_sessions = c3d.c3d_sessions(
session_type="scene",
scene_id="de704574-b03f-424e-be87-4985f85ed2e8",
)
# Filter to a specific scene version
scene_sessions = c3d.c3d_sessions(
session_type="scene",
scene_version_id=7011,
)Retrieve per-event data with session context attached. Events are unnested from sessions — one row per event. Dynamic object IDs are resolved to friendly names, and scene version IDs are resolved to scene names.
events = c3d.c3d_events(
start_date="2025-01-01",
n=20,
)Query objective success/failure counts, optionally sliced by version or with step-level detail.
# By version (default)
results = c3d.c3d_objective_results(group_by="version")
# Step-level detail
detailed = c3d.c3d_objective_results(group_by="steps")Retrieve per-session objective step results. Returns one row per step per session, with step descriptions and outcomes.
session_steps = c3d.c3d_session_objectives(
start_date="2025-01-01",
end_date="2025-06-01",
)Retrieve exit poll response counts across all hooks and versions. Returns one row per response option per question per version, with human-readable value labels.
# All hooks and versions
polls = c3d.c3d_exitpoll()
# Filter to a specific hook and version
polls = c3d.c3d_exitpoll(hook="end_questions", version=3)The default request timeout is 30 seconds per API call. To increase it:
import cognitive3dpy as c3d
c3d.c3d_set_timeout(60) # 60 secondsOr set the C3D_TIMEOUT environment variable before your session starts:
export C3D_TIMEOUT=60c3d_set_timeout() takes effect immediately. The environment variable is read once on first import, so it must be set before importing the package.
- Compact mode —
c3d_sessions(compact=True)(default) returns ~40 curated columns;compact=Falsereturns everything - Scene sessions —
session_type="scene"queries the latest version of each scene by default, giving the full project picture split by scene - Automatic name resolution — dynamic object SDK IDs are resolved to friendly names in events and objective steps; scene version IDs are resolved to scene names
- Date defaults — all functions default to the last 30 days when no date range is specified
- Column naming — top-level API fields use
snake_case; Cognitive3D properties retain theirc3d_prefix (e.g.,c3d_metrics_fps_score) - Polars-native — returns
polars.DataFrameby default; passoutput="pandas"for a pandas DataFrame - Session filtering —
exclude_test,exclude_idle,min_durationparameters across functions
All data-fetching functions support these session filters:
exclude_test/exclude_idle— filter out test and junk sessions (defaultTrue)start_date/end_date— date range as adate/datetimeobject, epoch timestamp, or"YYYY-MM-DD"stringmin_duration— minimum session duration in secondsproject_id— override the default set byc3d_project()output—"polars"(default) or"pandas"warn_empty— emit aUserWarningwhen 0 rows are returned (defaultTrue); set toFalseto suppress