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

# Exports

> Send team-level effectiveness metrics to your BI tools as a CSV or on a schedule to a signed webhook

**Admin → Exports** sends your organization's effectiveness metrics to BI tools: as a one-off CSV, or on a schedule to webhooks you add. Leads and admins can use it. Every export carries team aggregates only, the same ones Synapse shows on its own pages.

## What an export contains

Each row is one team aggregate over a period: the last 7 days in one summary, or one row per UTC day.

| Field | What it is |
| - | - |
| `period_start`, `period_end` | The period the row covers, in UTC |
| `cohort` | How many members had any active work in the period |
| `hsi_cohort` | How many of them contributed a confident human-state signal |
| `deep_work_availability` | Average flow availability across members with a human-state signal |
| `focus_fragmentation` | Average context switches per worked window |
| `capacity_coverage` | Share of active time with a known capacity: how much human state informed the row |
| `adoption_rate` | Share of members with at least one tracked AI-tool hour |
| `ai_habit` | How regularly the team uses AI: the average share of each member's worked days with tracked AI use |
| `alignment_rate` | Share of `human_state` calls where the team's state called for an adapted answer. Not part of AEI; a calm team reads low |
| `suppressed` | `true` when nobody had active work in the period, so the row has nothing to report |
| `human_side_suppression_reason` | Why the human-state columns are blank on a row that isn't suppressed, for example because fewer people than the privacy floor contributed |

Every export also states the organization's `cohort_floor` (the privacy floor), the `aei_version` and the `granularity`.

A metric with no value is an empty cell, never `0`, so a gap can't be read as a score.

> [!NOTE]
>
> When team human-state views are off under **Trust → Privacy controls**, the human-state columns (`deep_work_availability`, `focus_fragmentation`, `capacity_coverage`, `alignment_rate` and related) are blank in every export, and the export's `human_state_withheld_reason` says so. Work and AI-adoption columns are still filled in. They fill in once the setting is turned on.

## What an export never contains

* **Per-person rows.** Not available on any plan: an export can only be built from team aggregates, so there is no individual row to unlock.
* **Raw human-state scores or body signals.** Human-state columns are team totals, and only when enough people contributed to meet the privacy floor. Work and AI-adoption columns have no contributor floor, because they never contain human state.
* **Prompts, code or content.** AI adoption is measured from tool names and counts only.

## Download a CSV

Under **Team export**, choose a **Range** (7, 30 or 90 days) and the **Rows** (one summary for the whole range, or one row per day). The preview below shows the rows exactly as your BI tool will get them, including empty periods and withheld human-state columns. Then select **Download CSV**. Each download is recorded in the organization's audit log.

## Send to a webhook

1. Select **Add destination**.
2. Enter an `https://` URL. Plain `http://` addresses are refused, since exports are only delivered over an encrypted connection.
3. Choose a **cadence** (daily or weekly) and a **granularity** (the last 7 days in one summary, or one row per day).
4. Select **Add destination** and copy the **signing secret**. It's shown once and can't be retrieved later. If you lose it, remove the destination and add it again.

Use **Test** on a destination to send an export now. Its **Last delivery** shows whether your endpoint accepted it, or why not.

### Schedule

A new destination receives its first export within the hour. After that, daily destinations receive one roughly every 24 hours and weekly ones every 7 days, each covering the 7 days before delivery.

A failed delivery isn't retried. The next one follows the destination's usual schedule, so check **Last delivery** if your data stops arriving. **Pause** stops deliveries without deleting the destination; **Remove** deletes it and its signing secret.

### The request

Each delivery is a `POST` with a JSON body and these headers:

| Header | Value |
| - | - |
| `Content-Type` | `application/json` |
| `X-Synapse-Event` | `synapse.effectiveness.cohort.v1` |
| `X-Synapse-Signature` | `sha256=` followed by the hex HMAC-SHA256 of the raw body, keyed with the signing secret |
| `User-Agent` | `Synheart-Synapse-Export/1.0` |

```json theme={null}
{
  "event": "synapse.effectiveness.cohort.v1",
  "delivered_at": "2026-10-29T06:00:00Z",
  "webhook_id": "…",
  "export": {
    "org_id": "…",
    "cohort_floor": 5,
    "aei_version": "…",
    "granularity": "window",
    "from": "2026-10-22T06:00:00Z",
    "to": "2026-10-29T06:00:00Z",
    "series": [
      {
        "period_start": "2026-10-22T06:00:00Z",
        "period_end": "2026-10-29T06:00:00Z",
        "suppressed": false,
        "cohort": 18,
        "hsi_cohort": 12,
        "deep_work_availability": 0.41,
        "focus_fragmentation": 0.32,
        "capacity_coverage": 0.87,
        "adoption_rate": 0.72,
        "ai_habit": 0.55,
        "alignment_rate": 0.58
      }
    ]
  }
}
```

Your endpoint should answer with a `2xx` status within 30 seconds. Any other answer, or no answer in time, is recorded as a failed delivery.

### Verify the signature

Compute the HMAC over the body exactly as received, before parsing it, and compare it in constant time:

```python theme={null}
import hashlib
import hmac

def is_from_synapse(body: bytes, signature: str, secret: str) -> bool:
    expected = "sha256=" + hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)
```

Reject any request whose signature doesn't match.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.