---
title: "GET /api/projects/{project_id}/insights/{id}/data_checks/"
method: GET
path: "/api/projects/{project_id}/insights/{id}/data_checks/"
tags: ["insights"]
---

# GET /api/projects/{project_id}/insights/{id}/data_checks/

`GET /api/projects/{project_id}/insights/{id}/data_checks/`

## Request

- Base URL: `https://us.posthog.com`
- URL: `https://us.posthog.com/api/projects/{project_id}/insights/{id}/data_checks/`
- Auth: HTTP bearer

Run the data checks on a saved insight, found by its numeric id or its `short_id`. The checks read the query the insight stores, and work the same way as the checks on a query that is not saved. The `status` is `unsupported` for an insight that still stores legacy `filters` and no query. Nothing is stored.

## Path parameters

- `id` union, required
  - integer
  - string
- `project_id` string, required

## Query parameters

- `depth` 'quick' | 'full'
- `format` 'csv' | 'json'

## Response `200`

The result of every check.

- InsightDataChecks
  - `status` 'passed' | 'warning' | 'problem' | 'partial' | 'on_request' | 'no_events' | 'unsupported' | 'inconclusive', required: * `passed` - No data issues found * `warning` - A check found a small issue * `problem` - A check found a large issue * `partial` - Some checks could not run, and the others found no issue * `on_request` - The checks would read a lot of data, so they run only on request * `no_events` - No events to check * `unsupported` - This kind of insight cannot be checked * `inconclusive` - No check could run
  - `checks` InsightDataCheck[], required: Every check, in a fixed order, whatever its result.
    - `key` 'internal_users' | 'local_development' | 'bot_traffic' | 'duplicate_events', required: * `internal_users` - Internal and test users * `local_development` - Local development events * `bot_traffic` - Bot and crawler traffic * `duplicate_events` - Events sent twice
    - `level` 'passed' | 'warning' | 'problem' | 'skipped', required: * `passed` - Passed * `warning` - Warning * `problem` - Problem * `skipped` - Not checked
    - `skip_reason` union, required: Why the check did not run. Null unless `level` is `skipped`. * `too_many_events` - The days checked hold too many events to count * `read_limit` - The check would read more data than it is allowed * `time_limit` - The check took longer than it is allowed * `memory_limit` - The check needed more memory than it is allowed * `too_few_sampled_events` - The sample has too few events to give a share * `filtered_by_traffic_type` - The insight already filters on traffic type * `hidden_property` - A property the check reads is hidden from you * `invalid_filter` - The project's internal and test users filter cannot run * `on_request` - The check would read a lot of data, so it runs only on request
      - 'too_many_events' | 'read_limit' | 'time_limit' | 'memory_limit' | 'too_few_sampled_events' | 'filtered_by_traffic_type' | 'hidden_property' | 'invalid_filter' | 'on_request': * `too_many_events` - The days checked hold too many events to count * `read_limit` - The check would read more data than it is allowed * `time_limit` - The check took longer than it is allowed * `memory_limit` - The check needed more memory than it is allowed * `too_few_sampled_events` - The sample has too few events to give a share * `filtered_by_traffic_type` - The insight already filters on traffic type * `hidden_property` - A property the check reads is hidden from you * `invalid_filter` - The project's internal and test users filter cannot run * `on_request` - The check would read a lot of data, so it runs only on request
      - unknown
    - `method` union, required: `counted` when the check counted every event on the days checked, `sampled` when it read a sample. Null when the check did not run. * `counted` - Counted every event on the days checked * `sampled` - Checked a sample of the events on the days checked
      - 'counted' | 'sampled': * `counted` - Counted every event on the days checked * `sampled` - Checked a sample of the events on the days checked
      - unknown
    - `events` integer, nullable, required: How many events on the days checked the check found. Null when the check did not run.
    - `share` number, double, nullable, required: `events` as a share of the events checked, from 0 to 1. Null when the check did not run, or when the sample is too small to give a share.
    - `scaled` boolean, required: True when `events` is an estimate scaled up from a sample, rather than a count of every event.
    - `action` union, required: The change that fixes it. `filter_internal_users`: set `filterTestAccounts` to true on the insight's query. `open_filter_settings`: change the project's internal and test users filter, for example by adding `filter_to_add`. Null when there is no single change. * `filter_internal_users` - Turn on the internal and test users filter for the insight * `open_filter_settings` - Change the project's internal and test users filter
      - 'filter_internal_users' | 'open_filter_settings': * `filter_internal_users` - Turn on the internal and test users filter for the insight * `open_filter_settings` - Change the project's internal and test users filter
      - unknown
    - `top_events` string[], required: The event names the check found most often, most affected first.
    - `top_hosts` string[], required: For the local development check, the local hosts whose events the project's internal and test users filter keeps, most affected first.
    - `distinct_hosts` integer, nullable, required: For the local development check, how many local hosts sent the events in `events`. Null for the other checks and when the check did not run.
    - `top_bots` string[], required: For the bot traffic check, the bots and crawlers found most often, most affected first.
    - `distinct_bots` integer, nullable, required: For the bot traffic check, how many named bots and crawlers sent the sampled events. Null for the other checks and when the check did not run.
    - `removed_by_filter` integer, nullable, required: For the internal users check, the part of `events` that the project's internal and test users filter removes. It is 0 when the insight already applies the filter. Null for the other checks and when the check did not run.
    - `missed_by_filter` integer, nullable, required: For the internal users check, the part of `events` from team emails that the project's internal and test users filter keeps. Null for the other checks and when the check did not run.
    - `top_emails` string[], required: For the internal users check, the team emails whose events the project's internal and test users filter keeps, most affected first. Only emails the caller may see as the team's are matched. Empty for a token without the `person:read` scope.
    - `distinct_emails` integer, nullable, required: For the internal users check, how many team emails sent events that the project's internal and test users filter keeps. Null for the other checks and when the check did not run.
    - `filter_to_add` InsightDataCheckFilter, required
      - `key` string, required: The property the rule reads, such as `$host`.
      - `type` string, required: The kind of property, such as `event` or `person`.
      - `operator` string, required: How the rule compares the property, such as `not_regex`.
      - `value` string[], required: The values the rule compares the property to.
  - `coverage` InsightDataChecksCoverage, required
    - `date_from` string, date, required: The first day of the insight's date range.
    - `date_to` string, date, required: The last day of the insight's date range.
    - `days_in_range` integer, required: How many days the insight's date range holds.
    - `checked_date_from` string, date, required: The first day the checks read.
    - `checked_date_to` string, date, required: The last day the checks read.
    - `days_checked` integer, required: How many days the checks read. The checks read the newest days of the range, up to 7.
    - `filters_test_accounts` boolean, required: True when the insight filters out the project's internal and test users.
    - `events_checked` integer, nullable, required: How many events the insight reads on the days checked. Counted exactly, or scaled up from the sample when the days hold too many events to count. Null when neither ran.
    - `sample` InsightDataChecksSample, required
      - `rate` number, double, required: The share of the events on the days checked that the sample read, from 0 to 1.
      - `events` integer, required: How many events the sample read.
      - `distinct_ids` integer, required: How many distinct IDs sent the events the sample read.

## Changes

> 53 revisions in range; 1 not diffed.

- **2026-10-22** `417e6bbbc890`: 6 warning, 1 info
  - added the new `on_request` enum value to the `checks/items/skip_reason/oneOf[#/components/schemas/InsightDataCheckSkipReasonEnum]/` response property for the response status `200` (media type: application/json)
  - added the new `on_request` enum value to the `checks/items/skip_reason/oneOf[#/components/schemas/InsightDataCheckSkipReasonEnum]/` response property for the response status `200` (media type: text/csv)
  - added the new `on_request` enum value to the `status/allOf[#/components/schemas/InsightDataChecksStatusEnum]/` response property for the response status `200` (media type: application/json)
  - added the new `on_request` enum value to the `status/allOf[#/components/schemas/InsightDataChecksStatusEnum]/` response property for the response status `200` (media type: text/csv)
  - …3 more
- **2026-10-20** `1b28c15d563d`: 14 info
  - added the required property `checks/items/distinct_bots` to the response with the `200` status (media type: application/json)
  - added the required property `checks/items/distinct_bots` to the response with the `200` status (media type: text/csv)
  - added the required property `checks/items/distinct_emails` to the response with the `200` status (media type: application/json)
  - added the required property `checks/items/distinct_emails` to the response with the `200` status (media type: text/csv)
  - …10 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/posthog/apis/posthog-api/changes/api/projects/:project_id/insights/:id/data_checks/get.md)

---

[API](https://skmtc.dev/posthog/apis/posthog-api.md) · [All operations](https://skmtc.dev/posthog/apis/posthog-api/llms.txt) · [OpenAPI document](https://skmtc.dev/posthog/apis/posthog-api/revisions/993f70ab941b?raw)
