---
title: "Findings"
method: GET
path: "/v1/projects/{projectId}/findings"
tags: ["Analysis"]
---

# Findings

`GET /v1/projects/{projectId}/findings`

## Request

- Base URL: `https://hootlens-api-368877148687.us-east1.run.app`
- URL: `https://hootlens-api-368877148687.us-east1.run.app/v1/projects/{projectId}/findings`
- Auth: HTTP bearer

Aggregated snag counts for up to the most recently active heatmap cohorts. Deliberate validation visits are excluded. These are heuristics about observed behavior, not claims about emotion or conversion. groupBy=revision folds the automatic release and page version ids (auto-..., unversioned) of one page group, revision, device class and variant into one row and keeps releases the team named or logged apart; the default, cohort, returns one row per heatmap cohort.

Required token scopes are listed in x-hootlens-scopes. A signed-in person needs the matching permission on the site instead (the viewer and editor roles are presets of the permissions).

## Path parameters

- `projectId` string, required: An identifier: 1 to 80 letters, digits, underscores or hyphens.

## Query parameters

- `groupBy` 'cohort' | 'revision'
- `detail` 'true' | 'false'

## Response `200`

The findings.

- Findings
  - `sample` string, required
  - `grouping` 'cohort' | 'revision'
  - `excludedControlledRecordings` integer
  - `segments` integer, required
  - `signal` object, required: Observed behavior with evidence, never a psychological diagnosis.
  - `pileUpsOnNonControls` integer: Pile-ups on listed elements that carry interactive: false, summed over the rows. Absent when none.
  - `cohorts` object[], required
  - `errors` ErrorGroup[]: The most widespread JavaScript errors of the last 14 days. Present only when the site records errors and some were seen.
    - `id` string, required: Fingerprint: 16 hex digits of the error name, normalized message and top stack frame.
    - `name` string, required
    - `message` string: Absent under the strict privacy preset.
    - `messageHash` string, required
    - `kind` 'error' | 'rejection', required
    - `opaque` boolean
    - `location` string
    - `topFrame` ErrorFrame
      - `url` string: Script URL: no credentials, no fragment, and no query unless the site keeps queries.
      - `line` integer
      - `col` integer
      - `fn` string: Function name.
      - `resolved` object: The original source position, when a source map for the release covers the frame.
        - `source` string, required: Original file path inside the project, never absolute.
        - `line` integer, required
        - `col` integer
        - `name` string
        - `context` object[]: Lines around the original line. Present only when the source map embeds the source.
          - `line` integer, required
          - `text` string, required
    - `count` integer, required: Page views the error happened in (an error counts once per page view).
    - `visits` integer, required: Distinct visits.
    - `firstSeenAt` integer, required: Epoch milliseconds.
    - `lastSeenAt` integer, required: Epoch milliseconds.
    - `releases` ErrorCount[], required
      - `key` string, required
      - `count` integer, required
    - `pageRevisions` ErrorCount[], required
      - `key` string, required
      - `count` integer, required
    - `variants` ErrorCount[], required
      - `key` string, required
      - `count` integer, required
    - `pageGroups` ErrorCount[], required
      - `key` string, required
      - `count` integer, required
    - `deviceClasses` ErrorCount[], required
      - `key` string, required
      - `count` integer, required
    - `followedClicks` object[], required: Elements whose click the error followed within two seconds.
      - `selector` string, required
      - `name` string: The name the team gave this element.
      - `count` integer, required
    - `examples` object[], required: Present only with the replay scope.
      - `recordingId` string
      - `at` integer, required: Epoch milliseconds.
      - `offsetMs` integer: Position to seek to in the recording.

## Other responses

- `401`: The credential is missing, expired or revoked.
- `403`: The credential or the person's permissions on the site do not permit this action.
- `404`: The site, or the record inside it, does not exist or the caller is not a member (a non-member cannot tell the two apart).
- `429`: A rate limit or a per-site limit was reached.

---

[API](https://skmtc.dev/hootlens/apis/hoot-lens-api.md) · [All operations](https://skmtc.dev/hootlens/apis/hoot-lens-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hootlens/apis/hoot-lens-api/revisions/f64f8dc7b84e?raw)
