> ## Documentation Index
> Fetch the complete documentation index at: https://developer.rollfi.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# I-9 and E-Verify

### NOTE:

⚠️ I-9 and Everify processes are currently only supported through the whitelabel or hybrid integrations. The webhooks for trascking employee status are designed to keep you informed of the employee's progress through the white label workflows.

### Overview

* Rollfi supports employee I-9 onboarding and optional E-Verify for supported companies.
* Employees complete Section 1 through a secure embedded flow.
* Employers complete Section 2 through a separate embedded counter-sign flow.
* Employee E-Verify status updates are now delivered through the standard employee status webhook.

***

### 🔹 Tracking Status

* Use `getUser` to retrieve the employee's latest onboarding state.
* When I-9 verification has been provisioned for the employee, the `status` object in `getUser` and employee status webhooks may include `i9Verification`.
* When E-Verify has been provisioned for the employee, the same `status` object may also include `eVerify`.
* Treat `i9Verification` as optional in your response parsing. It is omitted when I-9 verification has not been provisioned for that employee.
* Treat `eVerify` as optional in your response parsing. It is omitted when E-Verify has not been provisioned for that employee.

***

### 🔹 Webhooks You Will Receive

* When an employee's I-9 record is created or its status changes, Rollfi sends the standard `employee.employeestatus.update` webhook.
* When an employee's E-Verify record changes status, Rollfi also sends the standard `employee.employeestatus.update` webhook.
* The employee payload mirrors the standard employee status webhook payload. `status.userStatus` continues to represent the employee's overall lifecycle status, while `status.i9Verification` and `status.eVerify` reflect the employee's compliance progress when those workflows have been provisioned.
* `status.userStatus` does not need to change for an I-9 or E-Verify webhook to be sent.

### 🔹 Interpreting I-9 Webhook States

1. `Not Yet Started` means the employee has an active I-9 record, but they have not yet submitted Section 1.
2. `Section 1 Complete` means the employee has completed Section 1 and the I-9 is now waiting for the employer or admin to take action by countersigning the I9.
3. `Section 2 Complete` means the employer or admin completed Section 2, but the full I-9 submission package has not yet been marked as finalized.
4. `Complete` means the I-9 workflow has been finalized and no further I-9 action is required.

> Additional status `Overdue` means a required I-9 step was not completed in time and follow-up is required before the workflow can be considered complete. The company admin should check on the I9 status through the whitelabel when this status is received.
> Additional status `Not Requested` means an I-9 is configured for the company, but this employee was opted out.

### 🔹 Interpreting E-Verify Webhook States

1. `EVerifyPending` means the employee's E-Verify case exists and is still pending an external result.
2. `EVerifyActionRequired` means the employee must take additional action to continue the E-Verify process, please login to the whitelabel to handle this.

> E-Verify status changes are delivered on the same `employee.employeestatus.update` webhook as I-9 changes. Handle `status.eVerify` independently from `status.userStatus` and `status.i9Verification`.

### 🔹 Example Payload

In this example, `userStatus` is still `Invite Sent`, but the full `status` object also includes the onboarding progress fields. `status.i9Verification` has moved to `Section 1 Complete`, which means the employee finished Section 1 and the I-9 is waiting on employer action. `status.eVerify` is `EVerifyPending`, which means the E-Verify case exists but is still awaiting an external result.

```json theme={null}
{
	"trigger": {
		"eventId": "c68d4dc1-638a-4baa-9ccb-26a2520e38a2",
		"eventType": "employee.employeestatus.update",
		"eventTimeStamp": "01/08/2026 13:10:02"
	},
	"payload": [
		{
			"user": [
				{
					"user": "Alex Morgan",
					"userId": "A12F45BC-9D31-4C9E-B28F-7F6E2C91D4A8",
					"userReferenceId": "",
					"companyId": "8E9F2B11-6A44-4D8C-B3A2-91F6D2E8C7A0",
					"status": {
						"userStatus": "Invite Sent",
						"generalInformationComplete": true,
						"jobInformationComplete": true,
						"inviteSent": true,
						"onboardingComplete": false,
						"bankAccountLinked": false,
						"i9Verification": "Section 1 Complete",
						"eVerify": "EVerifyPending"
					},
					"WorkerType": {
						"WorkerType": "W2"
					},
					"firstName": "Alex",
					"lastName": "Morgan",
					"middleName": "",
					"phoneNumber": "5551234567",
					"kycStatus": "passed",
					"jobTitle": "Quality Analyst",
					"dateOfJoin": "2026-01-07",
					"email": "alex.morgan@example.com",
					"userWages": [
						{
							"userWageId": "E4D92C17-1B55-4C3E-A9D8-2F5B9A1C7E44",
							"standardWorkingHours": 0,
							"WageRate": 85,
							"WageBasis": {
								"WageBasis": "Per Month"
							},
							"paymentMethod": {
								"PaymentMethod": "Direct Deposit"
							}
						}
					],
					"bankAccounts": []
				}
			]
		}
	]
}
```

***


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.