Employee Tax Statements and Tax Packages

Learn how to use Check's Employee Tax Statements and Tax Packages APIs to generate W-2 and W-2C documents asynchronously and download tax packages for multiple employees.

Overview

The Employee Tax Statements API provides a modern replacement for the Get W-2 Preview Report API.

Migration Timeline:

  • Through 2025: Both APIs will work
  • Starting 2026: The W-2 Preview Report API will no longer return data

What This API Enables

The Employee Tax Statements API offers significant improvements over the W-2 Preview Report:

  1. Bulk Processing: Generate tax document previews for multiple employees simultaneously
  2. Enhanced Integration: Connect seamlessly with Check's filing and document ecosystem through associated filings and document endpoints
  3. Asynchronous Generation: Handle large requests without timeout issues

Important: This API only returns PDF documents. CSV and JSON formats are not supported at this time.

Key concepts

Employee Tax Statements

W-2 and W-2C documents that show:

  • Current and future tax documents Check will file
  • Already submitted documents
  • Filing dates and amendment history
  • Relationships between employee documents and company filings

Tax Packages

Zip files containing multiple employee tax documents in PDF format. These are generated asynchronously to handle large requests efficiently.

Documents

Individual tax documents that reflect the actual data Check filed with tax agencies.

API Reference

Employee Tax Statement Object

The core object representing an employee's tax document.

fieldtypedescription
idIDID of the employee tax statement
employeeIDID of the employee this statement belongs to
companyIDID of the company this statement belongs to
yearintTax year for this statement
amendsnullable IDPrevious statement this one amends (if applicable). If populated, this means this statement is an amendment.
amended_bynullable IDNewer statement that amends this one (if applicable)
documentnullable IDFiled document ID (null if not yet filed)
filingslist of IDsCompany filings that include this employee data
filed_atnullable datetime in UTCWhen the document was successfully filed (UTC)

Key Point: When document is null, the statement hasn't been filed yet. You can generate previews by creating a tax package (see below).

Example: Get Employee Tax Statements

GET /employee_tax_statements/?employee=emp_123

Returns all W-2 and W-2C statements for a specific employee:

[
  {
    "id": "ets_789",
    "employee": "emp_123",
    "company": "com_123",
    "year": 2025,
    "amends": null,
    "amended_by": null,
    "document": null,
    "filings": ["com_fil_999"],
    "filed_at": null
  },
  {
    "id": "ets_456",
    "employee": "emp_123",
    "company": "com_123",
    "year": 2024,
    "amends": "ets_123",
    "amended_by": null,
    "document": "doc_456",
    "filings": ["com_fil_789", "com_fil_888"],
    "filed_at": "2025-02-10T15:30:00Z"
  },
  {
    "id": "ets_123",
    "employee": "emp_123",
    "company": "com_123",
    "year": 2024,
    "amends": null,
    "amended_by": "ets_456",
    "document": "doc_123",
    "filings": ["com_fil_123", "com_fil_234"],
    "filed_at": "2025-02-10T15:30:00Z"
  }
]

Tax Package Object

Manages the asynchronous generation of tax document bundles.

fieldtypedescription
idIDUnique identifier for the tax package
companyIDCompany this package belongs to
statusgenerating, succeeded, failedCurrent status: generating, succeeded, or failed
contents{"employee_tax_statements": ["ets_123", "ets_456"]}Requested employee tax statements
created_atnullable datetime in UTCWhen the package request was created (UTC)
succeeded_atnullable datetime in UTCWhen generation completed successfully (UTC)
resultnullable {"url": downloadable_url}Download URL where you may access the generated tax package
errornullable {"type": "content_not_found", "message": "Human readable error message"}Error details if generation failed

Important: Tax packages generate previews of documents Check will file when employee tax statements are not yet filed. However, once an employee tax statements have been filed, and is therefore associated with a document, a tax package that is generated which contains that employee tax statement will include the actual filed document. For straightforward access to official tax documents, use the List employee tax documents API.

How to Use Tax Packages

The Tax Package API does three things:

  1. Provides an interface to request a tax package containing one or more employee tax statements.
  2. Shows the state of the asynchronous generation job.
  3. Returns a URL at which users can download the tax package.

Step 1: Request a Tax Package

Create a package containing the employee tax statements you need:

POST /tax_packages

{
  "company": "com_myKIvCGb7M86G2CQbYe5",
  "contents": {
    "employee_tax_statements": ["ets_123", "ets_456"]
  }
}

Response: Returns the tax package object with status: "generating". Save the id for polling.

Step 2: Poll for Completion

Check the generation status regularly:

GET /tax_packages/:id

While Generating

{
  "id": "tax_pkg_1MrQwrLkdIwHu7ixUov4x2b3",
  "company": "com_myKIvCGb7M86G2CQbYe5",
  "status": "generating",
  "contents": {
    "employee_tax_statements": ["ets_123", "ets_456"]
  },
  "created_at": "2024-11-03T19:52:15Z",
  "succeeded_at": null,
  "result": null,
  "error": null
}

When Complete

{
  "id": "tax_pkg_1MrQwrLkdIwHu7ixUov4x2b3",
  "company": "com_myKIvCGb7M86G2CQbYe5",
  "status": "succeeded",
  "contents": {
    "employee_tax_statements": ["ets_123", "ets_456"],
  },
  "created_at": "2024-11-03T19:52:15Z",
  "succeeded_at": "2024-11-03T19:55:11Z",
  "result": {
    "url": "https://api.checkhq.com/tax_packages/tax_pkg_1MrQwrLkdIwHu7ixUov4x2b3/download",
    "expires_at": "2024-11-03T20:55:11Z"
  },
  "error": null
}

If Generation Fails

{
  "id": "tax_pkg_1MrQwrLkdIwHu7ixUov4x2b3",
  "company": "com_myKIvCGb7M86G2CQbYe5",
  "status": "failed",
  "contents": {
    "employee_tax_statements": ["ets_123", "ets_456"],
  },
  "created_at": "2024-11-03T19:52:15Z",
  "succeeded_at": null,
  "result": null,
  "error": {
    "type": "generation_timeout",
    "message": "Generation took longer than one hour to generate. Create a new package with fewer contents."
  }
}

Step 3: Download the Package

Once status is succeeded, download your ZIP file:

GET /tax_packages/:id/download

This endpoint returns the complete tax package as a downloadable ZIP file containing all requested tax documents in PDF format.