Skip to content
Constaia

I-9 document verification API: what software can and can't do

How an API can help with Form I-9 supporting documents (List A, B and C), where the legal lines are (employee choice, E-Verify, remote examination) and how to build a Section 2 draft your HR reviewer signs off.

By Constaia team5 min read

Every employer in the United States completes Form I-9 for each new hire. The employee fills in Section 1; the employer examines the documents the employee presents and records them in Section 2: document title, issuing authority, number and expiration date. For HR teams hiring at volume, that's a lot of careful copying, and a place where small mistakes pile up.

Searching for an "I-9 document verification API" usually means one of two things. Either you want software to help with the paperwork, which is reasonable and useful. Or you want software to decide whether someone can work, which no document-reading API should do. This article draws that line, using USCIS's own guidance, and shows how to build the useful part.

Not legal advice

This article is general information, not legal advice. The employer remains responsible for Form I-9. Follow the USCIS Handbook for Employers (M-274) and check your process with employment counsel.

The rules in one minute

USCIS publishes the Lists of Acceptable Documents:

  • List A documents establish both identity and employment authorization (for example, a US passport or a Permanent Resident Card). An employee who presents an acceptable List A document shouldn't be asked for anything else.
  • List B documents establish identity only (for example, a state driver's license or ID card).
  • List C documents establish employment authorization only (for example, an unrestricted Social Security card).

So the employee presents one List A document, or one List B plus one List C document. Which ones is the employee's choice.

That last point matters for software design. The M-274 section on discrimination under the INA describes unfair documentary practices: asking for more or different documents than required, asking for a particular document, and rejecting documents that reasonably appear to be genuine and to relate to the person, when done on the basis of citizenship, immigration status or national origin. An onboarding flow that only accepts a passport, or that auto-rejects a document because a model wasn't confident, walks straight into that problem.

What about remote examination?

Since 1 August 2023, DHS has authorized an optional alternative procedure to physical examination (Federal Register, 25 July 2023). According to USCIS, it's available to employers that participate in E-Verify in good standing, and it involves three steps: examining copies (front and back) of the documents, a live video interaction in which the employee presents the same documents, and retaining clear copies of everything examined. The employer also checks a box in Section 2 to record that the alternative procedure was used.

Two consequences for software:

  1. An API that reads uploaded images does not replace the live video step or the employer's examination. It can prepare the reviewer for it.
  2. Under the alternative procedure, copies must be kept. That retention belongs in your I-9 system, under your policy. Outside that procedure, whether to keep copies is an employer choice that must be applied consistently (M-274, section 4.1).

What software can reasonably do

Within those limits there's real work to take off the reviewer's plate:

  • Read each document and tell the reviewer what it appears to be, so the right Section 2 row is filled.
  • Tag the list (A, B or C) that document type belongs to, and whether the combination the employee chose is complete.
  • Extract title, issuing authority, number and expiration date into a draft.
  • Check formats that can be checked deterministically: the structure of a USCIS number, the format of a Social Security number, state-specific driver's license number formats, the AAMVA PDF417 barcode on the back of a license against the front, MRZ check digits on passports.
  • Flag anything that needs a closer look: low-confidence fields, an expiration date in the past (which may still be acceptable in cases M-274 describes, such as automatic extensions), a name that differs from Section 1.

And what it should not do: pick documents for the employee, reject documents automatically, make an employment eligibility determination, or claim to check anything against government databases.

Building it with Constaia

Constaia's catalogue includes the documents on the I-9 lists (US passport book and card, Permanent Resident Card, EAD, I-94, driver's licenses and state IDs, Social Security card, birth certificates and more), and each type records which I-9 list it belongs to. When you analyze a document, the verdict includes an informational reason with its list:

verdict.reasons (excerpt)
[
  { "code": "type_match", "severity": "info", "message": "The document is US driver's license." },
  { "code": "i9_list", "severity": "info", "message": "Acceptable Form I-9 document: List B." }
]

A minimal backend step for one document looks like this:

from constaia import Constaia

constaia = Constaia()  # reads CONSTAIA_API_KEY

LIST_TYPES = {
    "A": ["us_passport_book", "us_passport_card", "us_permanent_resident_card",
          "us_foreign_passport_i551", "us_ead", "us_i94"],
    "B": ["us_driver_license", "us_state_id", "us_school_id", "us_voter_registration_card",
          "us_military_id", "us_tribal_document", "ca_driver_licence"],
    "C": ["us_ssn_card", "us_birth_certificate", "us_consular_birth_report", "us_tribal_document",
          "us_citizen_id_card", "us_resident_citizen_id_card"],
}

def draft_row(path: str, chosen_list: str, employee_id: str, section1_name: str) -> dict:
    analysis = constaia.analyze(
        path,
        expect=LIST_TYPES[chosen_list],       # the list the employee chose, never a single document
        checks={"not_expired": False, "holder": {"full_name": section1_name}},
        storage="none",
        keep_results=False,
        language="en",
        metadata={"employee_id": employee_id, "i9_list": chosen_list},
    )
    flags = [r["message"] for r in (analysis["verdict"] or {}).get("reasons", []) if r["severity"] != "info"]
    return {"analysis_id": analysis["id"], "document": analysis["document"], "fields": analysis["fields"], "flags": flags}

A few design choices worth copying:

  • expect is the whole list the employee chose, not one document. The employee picks; your code follows.
  • not_expired is off, because an expired-looking document may still be acceptable in specific cases. The expiration date becomes a flag for the reviewer instead of an automatic rejection.
  • Every non-informational reason is a prompt for a person, not a verdict on the employee.
  • storage: "none" and keep_results: false keep Constaia out of your retention story: the data lives in your I-9 system.

The complete guide, with Node and Python code, completeness checks and privacy notes, is in Form I-9 supporting documents.

Limits, stated plainly

  • Constaia does not make employment eligibility determinations and does not connect to E-Verify or any government database.
  • It does not do face matching or process biometric data, and a valid format does not prove a document is genuine.
  • Today all processing happens in the EU, including for US customers. A US region is planned, with no date yet. If your policy requires US-only processing, that's a blocker for now.

Summary

  • Form I-9 lets the employee choose: one List A document, or List B plus List C.
  • Software can read, tag, extract, check formats and pre-fill a Section 2 draft.
  • It must not choose documents, auto-reject them or decide who can work; HR examines and signs.
  • The remote alternative procedure requires E-Verify, a live video step and retained copies, all on the employer's side.

To try it with sample documents, create a free account: 150 documents a month on the free plan.

Sources

  1. 01USCIS — Form I-9 Acceptable Documents
  2. 02USCIS — Handbook for Employers M-274
  3. 03USCIS M-274 — 11.2 Types of Employment Discrimination Prohibited Under the INA
  4. 04USCIS M-274 — 4.1 Retaining Copies of Documents Your Employee Presents
  5. 05USCIS — Remote Examination of Documents
  6. 06Federal Register — Optional Alternatives to the Physical Document Examination Associated With Employment Eligibility Verification (Form I-9), 25 July 2023