Immigration · U.S. Citizenship and Immigration Services
Fill Form I-9 programmatically — straight from your hire data.
Your onboarding flow already collects the employee data. Hand SimplyFill that JSON and get a correctly-filled, flattened Form I-9 back in a single API call — no PDF editor, no manual field mapping.
What is Form I-9?
Form I-9, Employment Eligibility Verification, is the federal form every U.S. employer must complete for each new hire to confirm identity and authorization to work. Section 1 is completed by the employee; Section 2 by the employer after reviewing identity documents.
Who files it?
Every U.S. employer, for every employee hired after November 6, 1986. The current edition must be used or the form is invalid — so any automation has to track USCIS revisions.
Why filling Form I-9 by hand hurts
The I-9 looks simple until you try to fill it at scale. Citizenship-status checkboxes are mutually exclusive, the A-Number / USCIS Number / I-94 fields are conditionally required, and a wrong edition date makes the whole form invalid. Hand-filling in a PDF editor leaves unflattened fields that e-sign tools mangle on re-render.
Fill Form I-9 in one call
Fill Section 1 of the I-9 for a new hire
const res = await fetch('https://api.simplyfill.app/v1/generate', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SIMPLYFILL_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
template: 'i9_2025',
data: {
last_name: 'Lovelace',
first_name: 'Ada',
ssn: '123-45-6789',
date_of_birth: '1990-04-12',
// citizenship_status maps to the right mutually-exclusive checkbox
citizenship_status: 'noncitizen_authorized',
work_authorization_expiration: '2027-08-01',
uscis_a_number: 'A012345678',
},
}),
})
const { url } = await res.json()
// url → signed, flattened I-9 ready for the employee to signFields on Form I-9
Real form fields are named for the PDF spec, not for humans — so a single value can hide behind something like topmostSubform[0].Page1[0].f1_02[0]. SimplyFill lets you map your own readable keys to these once, then forget they exist.
| Raw PDF field name | What it means |
|---|---|
| Last Name (Family Name) | Employee last name |
| First Name Given Name | Employee first name |
| U.S. Social Security Number | SSN (9 digits, no dashes) |
| CB_1 / CB_2 / CB_3 / CB_4 | Citizenship/immigration status (mutually exclusive) |
| 3 A lien Authorized to Work until expiration date | Work authorization expiration |
| USCIS ANumber | A-Number (if applicable) |
Frequently asked questions
Can SimplyFill fill both Section 1 and Section 2 of the I-9?
SimplyFill fills Section 1 from the employee data and produces a Section 2–ready PDF for the employer representative to complete after reviewing documents. You pass the Section 2 values in the same payload when you have them.
How do you handle the citizenship-status checkboxes?
The four status boxes are mutually exclusive. You send a single `citizenship_status` value (citizen, noncitizen_national, permanent_resident, or noncitizen_authorized) and SimplyFill checks exactly the right box and clears the others.
Does the output stay valid as USCIS revises the form?
Each I-9 edition is a versioned template (e.g. `i9_2025`). When USCIS publishes a new edition we add a new template version; your integration pins the version it was tested against and upgrades on your schedule.
Is the filled I-9 flattened?
Yes. SimplyFill writes to the actual form fields and then flattens the PDF, so it renders identically in every viewer and downstream e-sign tools cannot alter or re-flow the values.
Stop hand-filling Form I-9.
Start with a 14-day free trial. Define the template once, then fill Form I-9 from your data with a single API call.