> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hubtalk.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# The upload report

> What came back for each row of the file, and the row-level issue codes.

# The upload report

| Method and path                                                | What it returns                                                                                                                                                                           |
| -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GET /v1/imports/{import_id}`                                  | the import summary (the same object as `import` in the creation response) plus live/frozen `dnc_screen`                                                                                   |
| `GET /v1/imports/{import_id}/report?format=csv`                | per-row report: `csv` (default) or `xlsx` (anything else → `422 report_format_invalid`); filename `import-<id>-report.<ext>`                                                              |
| `GET /v1/imports/{import_id}/report?only=dnc_match&format=csv` | only the exact do-not-call matches; filename `import-<id>-dnc.<ext>`. Any other `only` → `422 report_filter_invalid`; an import without a recorded projection → `409 dnc_screen_required` |

Imports are visible only through campaigns of your organization (`404 import_not_found` otherwise).

### The import summary object

| Field                                                             | Type    | Meaning                                                                                                                                                                                                                                                                                                              |
| ----------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `import_id`                                                       | string  |                                                                                                                                                                                                                                                                                                                      |
| `status`                                                          | string  | `accepted` \| `refused`.                                                                                                                                                                                                                                                                                             |
| `rows_seen`, `accepted`, `warned`, `rejected`, `duplicates_found` | integer | Row counters. On a refused batch of added calls `rejected`/`warned` are counted from the issues.                                                                                                                                                                                                                     |
| `dnc_matched`                                                     | integer | `matched_rows` of the screen (`0` when unavailable).                                                                                                                                                                                                                                                                 |
| `refusal_code`                                                    | string  | `""` for an accepted import; otherwise one of `unreadable_file`, `no_rows`, `no_phone_column`, `ambiguous_phone_column`, `too_many_rows`, `no_usable_rows`, `missing_required_column`, `calls_rejected`, `calls_dnc_matched` (file-only codes such as `unsupported_format`, `file_too_large` do not occur on `/v1`). |
| `issues`                                                          | object  | **Keyed by issue code**: `{"<code>": {"severity": "error"\|"warning", "count": n, "rows": [row numbers, first 10]}}`. Empty object when there are no issues.                                                                                                                                                         |
| `dnc_screen`, `dnc_matches`                                       |         | See [Campaign fields](/v4/web-api/campaign-fields).                                                                                                                                                                                                                                                                  |

<Warning>
  `issues` in the summary is an **object keyed by code**, not an array. The array form (`{"row_number", "code", "severity"}` items, first 50) appears only inside `error.import` on a refused batch.
</Warning>

### Row-level issue codes

The `code` column of the report, and the keys of `issues`:

| Code                                                                                                               | Severity | Meaning                                                                            |
| ------------------------------------------------------------------------------------------------------------------ | -------- | ---------------------------------------------------------------------------------- |
| `phone_unreadable`                                                                                                 | error    | No readable phone (fewer than ten digits).                                         |
| `row_empty`                                                                                                        | error    | Empty row.                                                                         |
| `duplicate_row`                                                                                                    | error    | Duplicate number under `duplicate_action: "reject"`.                               |
| `duplicate_ignored`                                                                                                | warning  | Duplicate skipped or replaced (`keep_first` / `keep_last`).                        |
| `timezone_invalid`                                                                                                 | warning  | Unknown `timezone` value (the campaign zone is used).                              |
| `timezone_required`                                                                                                | error    | `calls` batch only: no `timezone` in a contact-zone campaign under the kz profile. |
| `group_role_invalid`, `group_key_missing`, `group_key_too_long`                                                    | error    | Contract-group columns inconsistent.                                               |
| `variable_name_collision`                                                                                          | warning  | Two columns map to one variable.                                                   |
| `dnc_match`                                                                                                        | warning  | The number is on the do-not-call registry.                                         |
| `state_mismatch`, `state_invalid`, `zip_invalid`, `city_mismatch`, `timezone_override`, `state_only`, `multi_zone` | warning  | US market package: location resolution flags.                                      |
| `unresolvable_location`, `non_callable_geography`                                                                  | error    | US market package: the row cannot be dialed.                                       |

### The report file

The report columns are `row_number`, `severity`, `code`, `supplied`, `duplicate_of_row` (`supplied` is a JSON object with the submitted values). There is **no message column**: the machine-readable contract of the report is the `code`, and rendering it as human text is the consumer's job.

The summary block at the end of the file (`import_summary`) uses the field keys as labels — `filename, format, encoding, phone_column, rows_seen, accepted, warned, rejected, duplicates_found, status`, plus `refusal` with the refusal code for a refused import; for `planned_calls` and `calls` sources `filename` and `encoding` are empty and `format` is `json`. The `dnc_match` report has the columns `row_number, phone, contact_name, phone_key, dnc_entry_id, source, reason, recorded_at` and a `dnc_screen_summary` block (`checked_rows, unscreened_rows, matched_rows, suppressed_contacts`).

Two conventions of the shared upload machinery apply on every path alike — a file in the dashboard, the `planned_calls` of campaign creation, and an added `calls` batch:

* **row numbers count the header as row 1**, so the first planned call is `row_number` 2 and the N-th is N+1 — in `issues`, in `error.import` and in the report file;
* **the CSV is UTF-8 with a BOM and CRLF line endings** (so Excel opens Cyrillic correctly): decode it as `utf-8-sig`, or the first header cell reads as `﻿row_number`.

Summary rows carry field keys instead of a numeric `row_number` and are not data rows.
