The bulk import verifies many applicants in one upload. You provide a CSV with one applicant per row; the platform validates, dedupes, debits your wallet, and starts a verification per row.

## Before you start

You need:

- An active organization (the import is scoped to whichever organization you have selected).
- At least one [workflow template](/guides/workflows/workflow-templates-create), or pick a default at upload time.
- The **Owner** or **Admin** role.
- Enough wallet balance to cover every row in the CSV. The platform pre-checks before the import starts; failed pre-check rejects the upload.

## CSV format

Download the canonical template from the **New bulk import** page, or use your own spreadsheet as long as it has these columns. One row per applicant. Columns:

- `email`: applicant's email (required).
- `workflow_id`: per-row override of the page's default workflow (optional; format `wt_<uuid>`). Find the id on each workflow's page under **Workflows**, where it's shown as a copyable `wt_…` value.
- `phone`: applicant's phone number in E.164 format (optional).
- `reference_label`: internal label to find this applicant in your dashboard (optional). Not shown to the applicant.
- `reference_type`: categorization tag, e.g. `rental_application` (optional).
- `reference_id`: your external system's identifier for this applicant (optional).
- `send_invite`: whether to email this applicant their verification invite once they're added (optional; `true`/`false`, also accepts `yes`/`no`/`1`/`0`, any case). When the cell is blank, the upload form's **Auto-send invite emails** setting applies.

Static validation is strict: any malformed row rejects the whole CSV. You download the validation errors, fix, and re-upload.

Spreadsheet editors often rewrite a lowercase `false` as `FALSE`; the `send_invite` column is case-insensitive, so either is accepted.

## Limits

- 2,000 rows per upload.
- 5 MB (5 MiB) file size.
- 5 concurrent in-flight imports per organization.

Re-uploading the same file within 24 hours is flagged as a duplicate. You can confirm to proceed anyway, or open the earlier import instead.

## After upload

The detail page shows live progress with per-row counters. When the import finishes you can:

- Download a results CSV with each row's outcome (`succeeded` / `failed`), verification ID, and applicant URL.
- Jump to the filtered [applicants list](/guides/verification/track-status) for the applicants added by this import.
- Correct any failed rows and upload them as a new import: copy the failed rows from the results CSV into a fresh file.

Canceling an in-flight import stops new rows from dispatching; rows already in flight finish on their own. Rows that had not started yet are recorded as `failed` (reason: `canceled`) in the results CSV.