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

# Import History console: status, skipped-row recovery, and resume for CSV contact imports

> Operate the Audience → Imports page: read the lifecycle status and per-job counters, download the skipped-rows CSV and re-import the fixed rows, resume an in-flight job in the wizard without re-uploading, and understand role access and row retention.

# Import History console

Every CSV contact import that runs in Orbit leaves a job row behind — one per upload, newest first. **Audience → Imports** is the operator console for those rows: it answers "which imports landed, what did they skip, and is one still running" without re-running the wizard. Use it as the archive companion to the import wizard itself (**Audience → Import**) — the wizard runs one file, this page tracks every run.

The console lists jobs from `GET /api/v1/contacts/import-jobs`, the same endpoint powering the wizard's "recent imports" banner; nothing here is privileged over the API.

## 1. What each row shows

Each job row carries:

* **Status** — one of `Running`, `Cancelled`, `Failed`, or `Completed`. The status comes from the job's terminal lifecycle record, and a counters fallback covers rows whose lifecycle record is no longer joined.
* **When** — the timestamp the import finished, rendered in your configured timezone (for in-flight jobs, when it started).
* **Imported / Skipped / Total** — the per-job counters. Imported rows became contacts; skipped rows failed validation; total is the file's row count. A job that never finished shows `Imported + Skipped < Total`.

Use the status filter above the list to narrow the loaded pages to a single lifecycle state. The filter is derived in the browser (the jobs endpoint has no status parameter), so while more pages exist it covers only the rows loaded so far — the page flags that scope with a notice; load more to widen it.

## 2. Download the skipped rows and re-import them

A job with `Skipped > 0` offers a **Skipped CSV** button. It downloads `GET /api/v1/contacts/import-jobs/{id}/skipped.csv` — one row per rejected input row, with the original columns plus the row index and a human-readable reason (unparseable phone, missing phone/email, a custom-field value that failed validation, a duplicate inside the file).

The remediation loop:

1. Download the skipped CSV.
2. Fix the cause class in those rows — reformat the phone, add the missing address, correct the custom-field value.
3. Start a new import with just the fixed file (**Audience → Import**, or `POST /api/v1/contacts/imports`). There is no way to mutate the original upload in place; a remediated file is always a new job.

Idempotency keeps this safe: re-importing the fixed subset merges or skips by phone/email exactly as the original run would have, so you never fork a duplicate contact.

## 3. Resume an in-flight job

A job still `Running` offers a **View running job** link. It opens the import wizard with the job id in the URL (`?resume=<job_id>`), which jumps the wizard straight to its progress step — the file is not re-uploaded and field mapping is not redone; you land on the live progress view for that job. The `resume` parameter is stripped from the URL after the jump so a later back-navigation does not replay it.

If someone already requested cancellation, the link renders disabled — the job is stopping and re-entering it would mislead.

Cancel and rollback are also available here, behind explicit confirmations:

* **Cancel** stops the in-flight job immediately. Rows already written before the abort stay imported, so you can be left with a partially-imported contact set.
* **Roll back import** is offered for a completed job within its 24-hour rollback window and hard-deletes the contacts that job created, along with their list/segment membership, scores, and consent records.

The semantics of both operations — and the error codes when a job has already moved past you — live in [troubleshooting: contact imports](/troubleshooting/import-jobs).

## 4. Role access and retention

* **Who sees it.** The console sits under the Audience nav group, which is visible to **owner, admin, and developer** roles. Reading the list needs `contacts:read`; running a new import from it (or cancelling/rolling back one) needs `contacts:write`.
* **How long rows persist.** Job rows persist in the tenant with no automatic expiry: the history is the archive, and an old row stays downloadable (counters, skipped CSV) until someone deletes it or the tenant is reaped. Rows are listed newest-first and cursor-paginated, so a long history never loads at once — use **Load more** to page back.

## 5. Authoring-side guides

This page is the *operations* half — the guides below are the *authoring* half:

* [Import or migrate contacts](/guides/import-and-migrate-contacts) — pick between the CSV wizard, the async import API, CDP profile ingest, and the platform-migration connectors, then run a first import end to end.
* [Assisted import from Klaviyo, MessageBird, or Telnyx](/guides/assisted-import-wizard) — the onboarding wizard that pulls contacts over a connector instead of a file.
* [Import and reconcile contacts](/guides/import-contacts) — the CSV file-shape walkthrough: phone formats, opt-in columns, dedupe policy, dry-run.

## See also

* [Troubleshooting: contact imports](/troubleshooting/import-jobs) — per-error-code fixes for cancel, rollback, queue, and enqueue failures
* [Import and migration lifecycle](/concepts/imports-migration-model) — the state machine and rollback-by-import-id contract underneath
* [Consent and suppression model](/concepts/consent-and-suppression-model) — why importing an address is not consent
* [Contacts API reference](/api-reference/endpoints/contacts) — the endpoint-by-endpoint schema for the imports routes
