Webhooks
Webhooks allow you to receive real-time notifications when important events occur in the I-9 process. You can use them to trigger downstream workflows, update your internal systems, or monitor form progress without polling our APIs.
Events
When an event occurs, a POST request is sent to the configured webhook endpoint. All event types are included—you cannot subscribe to individual events.
| eventKey | Event | Description |
|---|---|---|
employee.i9Complete | Form I-9 was countersigned | Notifies you when an employee's I-9 is complete and Section 2 is countersigned. |
employee.everifyCaseUpdate | E-Verify case details updated | Triggered when an employee’s E-Verify case is updated. Use this to prompt internal review or next steps. |
employee.profileUpdated | Employee profile updated | Notifies you when an employee's profile is updated (for example, social security number is added). It is not triggered when the employee is created. |
employee.upcomingExpiration | I-9 expiring documents | Triggers for Employment Authorization Documents (EADs) and Passport receipts 30 days before expiration, or immediately upon I-9 submission if within 30 days. Excludes original Passports. Applies only to active employees. |
employee.section1Complete | Employee submitted form | Fires when an employee completes Section 1, allowing you to prompt administrative review. |
employee.submissionRejected | Employee submission rejected | Notifies you when an employer rejects an employee's Form I-9 submission during the review process. Includes the rejection reason. |
employee.submissionReverified | Employee submission reverified | Notifies you when a Form I-9 has been successfully reverified through Supplement B. |
employee.i9AuthRepMismatch | Authorized representative mismatch | Triggered when an authorized representative identifies a mismatch while reviewing an employee’s Form I-9 documents during remote countersigning. |
employer.everifyAuthenticationResult | E-Verify authentication result | Notifies you of the result of an employer’s E-Verify credential authentication attempt (success or failure). This is an employer-level event and does not include employee data. |
Webhooks are distinct from the postback service
While webhooks send lightweight notifications about key events (such as form submission or case updates), the postback sends the full completed form data, including the actual form and its values.
The postback is sent to the
postback.target.urlspecified in theemployersobject and is typically used for processing the full I-9 record after completion. Read more here: Receive Completed I-9 Data.
Sample Payloads
Form I-9 was countersigned (employee.i9Complete)
employee.i9Complete)Sent when Section 2 is countersigned.
{
"eventKey": "employee.i9Complete",
"timestamp": "2025-12-22T15:51:19.757Z",
"data": {
"employerId": "12345-3fe3-7146-8ea6-123456sdfg",
"employeeId": "0987654-d7ee-702f-92f3-123456lkjhgf",
"submission": {
"id": 1334
}
}
}
E-Verify case details updated (employee.everifyCaseUpdate)
employee.everifyCaseUpdate)Sent when an employee’s E-Verify case status changes.
{
"eventKey": "employee.everifyCaseUpdate",
"timestamp": "2025-12-22T15:51:26.109Z",
"data": {
"employerId": "12345-3fe3-7146-8ea6-123456sdfg",
"employeeId": "0987654-d7ee-702f-92f3-123456lkjhgf",
"submission": {
"id": 1334
},
"everifyCase": {
"caseId": "123456789ghj",
"closed": false,
"status": "draft"
}
}
}
Employee profile updated (employee.profileUpdated)
employee.profileUpdated)Sent when the employee's profile is updated.
{
"eventKey": "employee.profileUpdated",
"timestamp": "2024-12-08T22:32:39.398-07:00",
"data": {
"employerId": "0197b38a-a7ca-77a1-86fb-f090890338d3",
"employeeId": "0197b38a-a7ca-77a1-86fb-f090890338d3",
"changedFields": {
"employee": {
"firstName": "Robert",
"lastName": "Johnson",
"middleName": "William",
"nickname": "Bob",
"socialSecurityNumber": "987-65-4321",
"telephoneNumber": "(555) 987-6543",
"gender": "Male",
"dateOfBirth": "1985-06-15",
"address": {
"streetAddress1": "789 Pine St",
"streetAddress2": "Suite 100",
"city": "Another City",
"state": "TX",
"zipCode": "67890",
"country": "US"
}
}
}
}
}
I-9 expiring documents (employee.upcomingExpiration)
employee.upcomingExpiration)Sent 30 days before a document expires, or immediately upon submission if within 30 days.
{
"eventKey": "employee.upcomingExpiration",
"timestamp": "2025-12-22T16:07:41.128Z",
"data": {
"employerId": "12345-3fe3-7146-8ea6-123456sdfg",
"employeeId": "0987654-d7ee-702f-92f3-123456lkjhgf",
"submission": {
"id": 1345,
"documentationExpirationDate": "2025-12-24"
}
}
}
Employee submitted form (employee.section1Complete)
employee.section1Complete)Sent when the employee completes Section 1.
{
"eventKey": "employee.section1Complete",
"timestamp": "2025-12-22T15:50:37.925Z",
"data": {
"employerId": "12345-3fe3-7146-8ea6-123456sdfg",
"employeeId": "0987654-d7ee-702f-92f3-123456lkjhgf",
"submission": {
"id": 1334
}
}
}
Employee submission rejected (employee.submissionRejected)
employee.submissionRejected)Sent when an administrator rejects an employee's Form I-9 submission during the review process.
Workflow
- Employee completes Section 1.
- An administrator reviews the submission and completes Section 2.
- The administrator rejects the Form I-9 submission and provides a rejection reason.
- The
employee.submissionRejectedwebhook is sent.
{
"eventKey": "employee.submissionRejected",
"timestamp": "2026-05-27T00:41:28.476Z",
"data": {
"employerId": "019e4177-aabb-7722-a79f-91234567890",
"employeeId": "019e41bb-2b38-795d-b32d-0987654321",
"submission": {
"id": 2729,
"rejectionReason": "Document could not be verified."
}
}
}
Employee submission reverified (employee.submissionReverified)
employee.submissionReverified)Sent when a Form I-9 has been successfully reverified through Supplement B.
Workflow
- Employee has an existing completed Form I-9.
- An administrator initiates the Supplement B reverification process.
- The administrator reviews and re-examines the employee's documentation as part of reverification.
- The reverification is completed.
- The
employee.submissionReverifiedwebhook is sent.
{
"eventKey": "employee.submissionReverified",
"timestamp": "2024-07-18T21:17:06.847Z",
"data": {
"employerId": "019e4177-aabb-7722-1234567890",
"employeeId": "019e41bb-2b38-795d-b32d-0987654321",
"submission": {
"id": 2730
}
}
}
Authorized representative mismatch (employee.i9AuthRepMismatch)
employee.i9AuthRepMismatch)Sent when an authorized representative identifies a mismatch while reviewing an employee’s documents during remote countersigning.
Workflow
- The employee is configured to use remote countersigning with an authorized representative.
- The employee completes Section 1.
- The authorized representative reviews the employee's documents during the remote countersigning process.
- The authorized representative indicates that the employee's presented documents do not match the information entered in the Form I-9.
- The
employee.i9AuthRepMismatchwebhook is sent.
{
"eventKey": "employee.i9AuthRepMismatch",
"timestamp": "2026-05-13T13:50:13.572-07:00",
"data": {
"employerId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"employeeId": "12345678-abcd-1234-efgh-1234567890ab",
"submission": {
"id": 2500
}
}
}
E-Verify authentication result (employer.everifyAuthenticationResult)
employer.everifyAuthenticationResult)Sent when E-Verify credentials are authenticated or revalidated.
{
"eventKey": "employer.everifyAuthenticationResult",
"timestamp": "2026-02-17T13:50:13.572-07:00",
"data": {
"employerId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"everifyAuthenticated": true
}
}
Configuration
Webhooks are configured at the employer level using the /employers POST endpoint. You can update the callback URL later using the /employers/{employerId} PATCH endpoint. When configured, you will receive all webhook event types.
Request
The webhook object contains the configuration for where webhook events will be delivered.
{
"name": "Example Company",
"federalEIN": "98-7654321",
"timezone": "America/New_York",
"address": {
"streetAddress1": "14350 N 87 ST",
"streetAddress2": "STE 310",
"city": "Scottsdale",
"state": "AZ",
"zipCode": "85260"
},
"webhook": {
"callbackUrl": "https://client-system.example.com/callbacks/i9",
"failureNotificationEmail": "[email protected]",
"authentication": {
"authType": "basic",
"username": "webhook_user",
"password": "webhook_password"
}
}
}
Webhook object fields
| Element | Type | Description |
|---|---|---|
callbackUrl | string | Endpoint in your system where Symmetry will send the webhook event. This should be a publicly accessible URL that can receive POST requests. |
failureNotificationEmail | string | Email address to notify if a webhook request fails |
authentication | object | Specifies how Symmetry should authenticate when sending the webhook request to your system. Supported types include: none, basic, oauth2. |
authentication.authType | enum | Required. Configures the authentication scheme type to be used: none, basic, oauth2. |
authentication.username | string | Username to be used for basic authentication. |
authentication.password | string | Password to be used for basic authentication. |
authentication.oauth2ClientId | string | Oauth2 client ID required if using Oauth2 authentication |
authentication.oauth2ClientSecret | string | Oauth2 client secret, required if using Oauth2 authentication |
authentication.oauth2AuthServerUrl | string | URL to the Oauth2 token authentication server, required if using Oauth2 authentication |
authentication.oauth2GrantType | enum | OAuth 2.0 grant type. Required when using OAuth 2.0 authentication. Currently supports the client_credentials grant. |
authentication.oauth2AdditionalParameters | object | Additional parameters to be provided to the Oauth2 token authentication server |
For full employer configuration details, see Configure Employers.
Authentication
Symmetry supports multiple authentication schemes when sending webhook requests:
- None – no authentication header is included
- Basic –
Authorization: Basic <base64(username:password)> - OAuth2 – Symmetry will request an access token and include it in the
Authorization: Bearer <token>header
Authentication credentials are included in the request header when Symmetry sends webhook payloads to your system. This ensures secure delivery and proper endpoint validation.
If using OAuth2, ensure your token endpoint supports Client Credentials grant type.
Failure Notifications
You can optionally configure a dedicated email address to receive notifications when webhook deliveries fail. Notifications are sent only after all retry attempts have been exhausted.
To configure the notifications, specify the target email address within the failureNotificationEmail field in the webhook object when setting up or updating each employer.