---
title: "Impact of a change"
method: GET
path: "/v1/projects/{projectId}/changes/{changeId}/impact"
tags: ["Changes"]
---

# Impact of a change

`GET /v1/projects/{projectId}/changes/{changeId}/impact`

## Request

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

Before and after comparison around a change: visits, goal conversion rates, snags per 100 page views, scroll reach and element click shares, with a one-sentence summary and caveats. This is not an A/B test.

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.
- `changeId` string, required: An identifier: 1 to 80 letters, digits, underscores or hyphens.

## Query parameters

- `days` integer
- `deviceClass` 'desktop' | 'tablet' | 'mobile'
- `locale` string

## Response `200`

The impact report.

- ImpactReport
  - `change` ChangeMarker, required
    - `id` string, required: An identifier: 1 to 80 letters, digits, underscores or hyphens.
    - `projectId` string, required: An identifier: 1 to 80 letters, digits, underscores or hyphens.
    - `at` integer, required: When the change went live, epoch milliseconds.
    - `title` string, required
    - `note` string
    - `pageGroup` string: Absent means the whole site.
    - `release` string
    - `createdBy` 'owner' | 'agent', required
    - `source` string: Free text such as claude-code. Starts with auto: for automatic detections.
    - `kind` 'standard' | 'measurement': measurement for a change that only changes how counting works; its impact report gives no verdict. Absent means standard.
  - `days` integer, required
  - `filters` object, required
    - `deviceClass` 'desktop' | 'tablet' | 'mobile'
    - `locale` string
  - `goals` object[], required
    - `id` string, required
    - `name` string, required
  - `measurementOnly` boolean: True when the change only changed counting: goal verdicts are counting-changed and no rise or fall is claimed.
  - `groups` object[], required
    - `group` string, required
    - `name` string, required
    - `before` object, required
      - `window` object
      - `visits` integer
    - `after` object, required
      - `window` object
      - `visits` integer
    - `needMore` object
      - `before` integer
      - `after` integer
    - `goals` object[]
    - `snagsPer100` object
      - `before` number, nullable
      - `after` number, nullable
      - `snagsBefore` integer
      - `snagsAfter` integer
    - `scrollReach` object
    - `elements` object
  - `summary` string, required: One sentence with the observed numbers and sample sizes.
  - `caveats` string[], required
  - `generatedAt` integer, required: Epoch milliseconds.

## Other responses

- `400`: The request fields are invalid.
- `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)
