---
title: "Cases opened by policy rules"
method: GET
path: "/projects/{project_id}/policy-cases"
tags: ["Policy"]
---

# Cases opened by policy rules

`GET /projects/{project_id}/policy-cases`

## Request

- Base URL: `https://adslighthouse.com/api/v1`
- URL: `https://adslighthouse.com/api/v1/projects/{project_id}/policy-cases`
- Auth: HTTP bearer

Lists the project's cases with at least one matching ad observed in the window (last 30 days by default) and the observation filters, most recent first. Cases are leads for human review, not confirmed policy violations. Use get_policy_case and list_policy_case_evidence to inspect the rule, timeline and saved ads before deciding how to handle a case. view: active (open, investigating, contacted; default), one status, or all. Filter by owner_user_id (or unassigned), rule_id and advertiser (part of the domain). status_counts counts every status under the same filters. A match is a lead to review: an observation shows an ad was displayed for a search at a moment, not proof of a violation, spend or a purchased keyword.

## Path parameters

- `project_id` string, required: The project: its id, its brand domain (for example nike.example) or its exact project or brand name. Unknown or ambiguous references return not_found; call list_projects then.

## Query parameters

- `view` 'active' | 'open' | 'investigating' | 'contacted' | 'resolved' | 'dismissed' | 'all'
- `owner_user_id` string: A member's user id, or unassigned.
- `rule_id` string
- `advertiser` string
- `range` '7d' | '14d' | '30d' | '12m' | 'custom': Window ending today: 7d, 14d, 30d (default) or 12m. Use custom with from and to for fixed dates.
- `from` string: First local day, YYYY-MM-DD (custom range).
- `to` string: Last local day, YYYY-MM-DD, included in full (custom range).
- `time_zone` string: IANA time zone for day boundaries, such as America/New_York. Defaults to the time zone of the person the credential acts for.
- `engine` union: Search engine, or a list of engines combined with OR.
  - 'google' | 'bing'
  - string[]
- `device` union: Device, or a list combined with OR.
  - 'desktop' | 'mobile'
  - string[]
- `os` union: Operating system. unspecified matches checks that did not pin one. Must fit the chosen device.
  - 'windows' | 'macos' | 'android' | 'ios' | 'unspecified'
  - string[]
- `country` union: ISO 3166-1 alpha-2 country code such as US, or a list.
  - string
  - string[]
- `location` union: Saved location key: code:<location code>, name:<label> or country:<ISO code>. get_project_details lists the keys that have data.
  - string
  - string[]
- `limit` integer: Items per page, 1 to 200.
- `cursor` string: The next_cursor value from the previous page. Omit it for the first page.

## Response `200`

Cases opened by policy rules

- object
  - `window` object, required
    - `from` string, required: First local day included, YYYY-MM-DD.
    - `to` string, required: Last local day included, YYYY-MM-DD.
    - `time_zone` string, required
    - `start` string, required: Inclusive start instant, ISO 8601.
    - `end` string, required: Exclusive end instant, ISO 8601.
  - `status_counts` object, required: Cases per status under the same window and filters.
    - `open` integer, required
    - `investigating` integer, required
    - `contacted` integer, required
    - `resolved` integer, required
    - `dismissed` integer, required
  - `data` object[], required
    - `id` string, required
    - `rule_id` string, nullable, required: null when the rule was deleted; rule_name is kept.
    - `rule_name` string, required
    - `rule_type` 'forbidden_terms' | 'brand_term' | 'direct_linking' | 'promo_code' | 'position_limit' | 'affiliate_id', required
    - `advertiser_domain` string, required
    - `affiliate_id` string, nullable, required
    - `status` 'open' | 'investigating' | 'contacted' | 'resolved' | 'dismissed', required
    - `owner_user_id` string, nullable, required
    - `owner_email` string, nullable, required
    - `first_seen_at` string, required
    - `last_seen_at` string, required
    - `match_count` integer, required: Every finding recorded on the case.
    - `reopen_count` integer, required: Times a new match reopened it after it was resolved.
    - `matches_in_range` integer, required: Findings observed in the window that match the filters.
  - `next_cursor` string, nullable, required
  - `request_id` string

## Other responses

- `400`: Invalid parameters, cursor or body.
- `401`: Missing, invalid, expired or revoked credential.
- `403`: The credential lacks the write scope, the plan does not include the API, or the allowance is used up.
- `404`: Unknown project, keyword or run in this account.
- `409`: The idempotency key was already used for a different request.
- `429`: Rate limit reached. Retry after the Retry-After seconds.
- `503`: The requested service or file is temporarily unavailable.

---

[API](https://skmtc.dev/adslighthouse/apis/ads-lighthouse-api.md) · [All operations](https://skmtc.dev/adslighthouse/apis/ads-lighthouse-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adslighthouse/apis/ads-lighthouse-api/revisions/e1a4a40b11a9?raw)
