---
title: "Check why a report comes back empty"
type: reference
method: GET
path: /rest-api/analytics/report-check.do
tag: "Analytics"
---

# Check why a report comes back empty

`GET https://YOUR-NETWORK-DOMAIN/rest-api/analytics/report-check.do`

Given the report a caller ran - General or Advanced, its dates, time breakdown, grouping and filters - names what makes it empty without running it: a period that has not happened yet; a report type, date range, breakdown, grouping or filter the role lacks a permission for, or no Impressions column for the role; dates older than the statistics are kept (hourly General statistics are kept for a shorter time than daily ones; Advanced data for the network's configured number of days); a filtered advertiser, campaign, banner, site, zone or placement that does not exist or that the caller may not see, that was created after the period, or filters that contradict each other (a campaign of another advertiser, a placement of another site); and for the Advanced report a network without Advanced data, a detail filter on something its data does not keep, and days whose event logs have not reached the analytics cluster yet. findings lists every finding in that order; decisive is the first one that alone makes the report empty, or null when none does - then the report has to be run with fewer filters (the General report over the same dates without filters, then without one filter at a time) to see which one leaves nothing. Costs no analytics request.

## Query params

| Name | Type | Required | Example | Description |
|---|---|---|---|---|
| `from` | string | yes | `2026-10-01` | First day of the report, yyyy-MM-dd |
| `reportType` | string | no | `GENERAL` | GENERAL (default) or ADVANCED (also HADOOP) |
| `to` | string | no | `2026-10-07` | Last day of the report, yyyy-MM-dd, inclusive; default from |
| `groupRange` | string | no | `DAY` | Time breakdown: NONE (default), HOUR, DAY, WEEK, MONTH or YEAR |
| `groupBy` | array<string> | no | `CAMPAIGN` | Groupings, as the report names them (CAMPAIGN, COUNTRY, DEVICE_FORMAT...) |
| `advertiserIds` | array<integer> | no | `1001` | Advertiser ids the report was filtered to |
| `campaignIds` | array<integer> | no | `2001` | Campaign ids the report was filtered to |
| `bannerIds` | array<integer> | no | `3001` | Banner ids the report was filtered to |
| `siteIds` | array<integer> | no | `5001` | Site ids the report was filtered to |
| `zoneIds` | array<integer> | no | `6001` | Zone ids the report was filtered to |
| `placementIds` | array<integer> | no | `4001` | Placement ids the report was filtered to |
| `countries` | array<string> | no | `US` | Countries the report was filtered to, two-letter codes |
| `deviceFormats` | array<string> | no | `MOBILE` | Advanced report only — device formats it was filtered to (MOBILE, DESKTOP...) |
| `connectionTypes` | array<string> | no | `WIFI` | Advanced report only — connection types it was filtered to |
| `languages` | array<string> | no | `en` | Advanced report only — browser languages it was filtered to |
| `incognito` | string | no | `true` | Advanced report only — incognito filter: true, false or unknown |

## Responses

- `200` — {success, reportType, from, to, decisive:{check, reason, fix}|null, findings:[{check, decisive, reason, fix}]}; check is one of FUTURE, PERMISSION, RETENTION, ENTITY, CONTRADICTION, ADVANCED_DATA, NOT_FLUSHED, COLUMNS, GROUPING, PROVISIONAL
- `400` — A date that is not yyyy-MM-dd, to before from, or an unknown report type, time breakdown or grouping
- `401` — Authentication error
- `403` — Forbidden — insufficient permissions

## Example request

```bash
curl --request GET \
  --url 'https://YOUR-NETWORK-DOMAIN/rest-api/analytics/report-check.do?from=2026-10-01&groupBy=CAMPAIGN&reportType=GENERAL&to=2026-10-07' \
  --header 'X-Api-Key: YOUR_API_KEY'
```

Source: https://epom.com/ad-server/docs/api/analytics/get-analytics-report-check