---
title: "List ads that need attention"
method: GET
path: "/v1/ads/alerts"
tags: ["Ad Campaigns"]
---

# List ads that need attention

`GET /v1/ads/alerts`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/v1/ads/alerts`
- Auth: HTTP bearer

Lists what needs attention across your ads, most severe first:

- ads created in the last 90 days that were rejected
- campaigns the platform reports delivery issues on
- Meta ad accounts with a failed or overdue payment, or disabled while holding live ads
- campaigns that spent on 3 or more of the last 7 days without a result (conversion, lead, purchase or conversation goals)
- budgets spent to their daily cap yesterday
- ads connections that need reconnecting while they still hold live ads
- ad accounts whose sync has been failing

Built from stored data and the last 7 days of synced metrics, so it costs no platform call.

Each alert has a stable `id`. Dismiss one with `POST /v1/ads/alerts/{alertId}/dismiss` to hide it for 30 days.

## Query parameters

- `accountId` string
- `profileId` string
- `includeDismissed` boolean

## Response `200`

Alerts, most severe first.

- object
  - `alerts` AdsAlert[]
    - `id` string: Stable for the same problem on the same entity. Pass it to POST /v1/ads/alerts/{alertId}/dismiss.
    - `kind` 'ad_rejected' | 'delivery_issue' | 'payment' | 'budget_limited' | 'spend_no_results' | 'connection_lost' | 'sync_failing'
    - `severity` 'error' | 'warning' | 'info'
    - `title` string
    - `message` string: What happened, in plain words. For a rejection or delivery issue, the platform's own reason when it gave one.
    - `platform` string
    - `platformAdAccountId` string
    - `entity` object
      - `level` 'ad_account' | 'campaign' | 'ad_set' | 'ad'
      - `id` string: The platform id of the entity.
      - `name` string, nullable
    - `adId` string: The Zernio ad id when the entity is an ad, for GET /v1/ads/{adId}.
    - `accountId` string: The Zernio ads connection, on connection_lost and sync_failing alerts.
    - `currency` string, nullable
    - `detectedAt` string, date-time
    - `fix` object: Where to fix it: a page on the platform, or for connection_lost the Zernio dashboard path (starting with /) where the connection is reconnected.
      - `label` string
      - `url` string, uri-reference
    - `dismissed` boolean
  - `counts` object: Open (not dismissed) alerts per severity.
    - `error` integer
    - `warning` integer
    - `info` integer

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key. `code` is `missing_credentials` when no Authorization header was sent and `invalid_credentials` when the key is unknown, revoked or expired.
- `403`: Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans.

## Changes

- **2026-10-30** `f239e5073e14`: 1 breaking, 2 warning, 2 info
  - the `alerts/items/fix/url` response's property format changed from `uri` to `uri-reference` for status `200`
  - added the new `connection_lost` enum value to the `alerts/items/kind` response property for the response status `200`
  - added the new `sync_failing` enum value to the `alerts/items/kind` response property for the response status `200`
  - added the new optional `query` request parameter `profileId`
  - …1 more
- **2026-10-27** `45d71f903fcc`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/ads/alerts/get.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) - [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) - [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/907df8806180?raw)
