When to use bulk orders
Bulk orders are the right approach whenever you have more than about 10 checks to submit at once. A few common scenarios:
- Seasonal hiring. Retail peak, warehouse peak, summer camps, tax season - anywhere you're onboarding 25+ people in a compressed window.
- Periodic reverification. Driver reverification, annual OIG/SAM monitoring, DOT-regulated retesting.
- M&A integration. Rescreening acquired employees under the acquirer's policy.
- Backfill of compliance gaps. If a prior vendor missed something - common during vendor transitions - running a bulk reverification is the cleanest way to restore coverage.
CSV upload, end to end
Step 1: Download the template
From the portal's "Bulk order" tab, download the current CSV template. It's a single file with a header row and one row per applicant. Using the template (as opposed to your own export) prevents 80% of validation errors.
Step 2: Required and optional columns
Required:
| Column | Format | Notes |
|---|---|---|
first_name | Text | Legal first name |
last_name | Text | Legal last name |
dob | YYYY-MM-DD | Applicant date of birth |
email | Where the disclosure invite is sent | |
package | Text | Package code (e.g. plus, premium, or a custom package slug) |
Optional:
| Column | Format | Notes |
|---|---|---|
middle_name | Text | Improves match quality |
ssn | 9-digit | If omitted, the applicant provides during consent |
phone | 10-digit | Used for SMS reminder if applicant doesn't respond |
external_id | Text | Your tracking ID - appears on the report |
role | Text | Role or title - useful context if you run industry-specific packages |
Step 3: Upload and validate
Upload the CSV. The portal validates every row:
- Required columns present and non-empty.
- DOB parses and represents a plausible adult applicant.
- Email format valid.
- Package code exists for your account.
- SSN, if provided, passes a length and checksum sanity check.
Rows that fail validation are flagged and downloadable as a "needs fixing" CSV. Rows that pass are queued for release.
Step 4: Review and release
Before any applicant invite goes out, you see a preview of the upload: number of valid rows, number of failed rows, estimated total cost. Review, then click "Release." All invites go out in parallel - applicants receive emails within minutes of release.
Step 5: Track as a batch
From the "Bulk orders" tab, each batch shows as a single row with high-level counts:
- Invited / Signed / In progress / Complete / Canceled.
- Average and median turnaround so far.
- Outliers - orders that are taking longer than the batch median by a configurable amount.
Click any row in the batch to drill into individual orders, same view as a single-order detail page.
Best practices for high-volume hiring
Stagger releases if you have tight SLA windows
If your hiring team has a limited review window each morning, release batches the evening before so reports complete overnight. Don't release on Fridays if your review team is off on the weekend - applicants sign over the weekend and run through the auto-reminder cycle with no one watching.
Pre-clean your data
Common issues in client-uploaded CSVs: emails typed in address cells, DOB in DD/MM/YYYY format (U.S. is YYYY-MM-DD or MM/DD/YYYY), phone numbers with (area) and dashes vs. clean digits, and SSN pasted with dashes. The validator handles most of these, but a five-minute pre-clean in Excel removes the retry cycle.
Set a consistent external_id
If you're tracking applicants by your own ID - applicant number, requisition ID, employee ID - put it in external_id. It appears on the report, in the API response, and in the ATS sync. Not using it makes downstream reconciliation painful.
Use the "dry run" option on unfamiliar data
Uploading CSV from a new source - a newly acquired employer list, a new ATS export - run a dry run first. The dry run validates without sending invites, so you can catch systematic issues (e.g., ATS exporting "Lastname, Firstname" instead of split columns) before you generate 200 invites to fix.
API batch orders
For programmatic bulk submission, use POST /v1/orders/batch with a JSON array of order objects. The response returns a batch_id you can poll with GET /v1/batches/:id. Webhooks fire per-order as each completes. See the API reference for the full schema.
{"package": "plus", "orders": [
{ "first_name": "Jordan", "last_name": "Rivera", "dob": "1987-06-14",
"email": "jordan@example.com", "external_id": "REQ-2026-0187" },
{ "first_name": "Priya", "last_name": "Desai", "dob": "1992-03-02",
"email": "priya@example.com", "external_id": "REQ-2026-0188" }
]} Pricing
Volume discounts kick in at 50 orders per month. Discounts are automatic; you don't need to contact us to apply them. If you're running 500+ a month, we'll negotiate a contracted rate - email moses@informationdirect.us to start that conversation.
Common gotchas
- Same email for two applicants. The portal detects this and flags it at validation. If you have a family business with shared emails, use the applicant's phone as the signal channel instead.
- Same package for every row. The CSV allows one package per row - you can mix packages in a single upload. Commonly used for hiring a cohort of both drivers (Premium + MVR) and warehouse staff (Plus), submitted together.
- Applicant already in portal. If an applicant has a prior order in your account, the duplicate is flagged and you're asked whether to re-order or reuse the prior report. Usually you want to re-order (records change); reuse is only appropriate for very recent prior checks.
Next up
If you're integrating with an applicant tracking system, see ATS integration. For direct API access, see API reference.