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
published_atnullable datetime in UTCWhen the document was published (UTC)
publication_statusenumPublication status: draft, published, or pending_correction
delivery_methodenumDelivery method: manual or mail
mail_recipientnullable enumMail recipient: employee or company. Null if manual delivery.

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

List Employee Tax Statements

GET /employee_tax_statements

Returns W-2 and W-2C statements matching the specified filters.

Query Parameters

parametertypedescription
companyIDFilter by company ID
employeeIDFilter by employee ID
publication_statusenum (optional)Filter by publication status: draft, published, or pending_corrections

Example Requests

GET /employee_tax_statements?employee=emp_123
GET /employee_tax_statements?company=com_123&publication_status=draft
GET /employee_tax_statements?company=com_123&publication_status=published

Example Response

[
  {
    "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,
    "published_at": null,
    "publication_status": "draft",
    "delivery_method": "manual",
    "mail_recipient": 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",
    "published_at": "2025-02-10T15:30:00Z",
    "publication_status": "published",
    "delivery_method": "mail",
    "mail_recipient": "employee"
  },
  {
    "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",
    "published_at": "2025-02-10T15:30:00Z",
    "publication_status": "published",
    "delivery_method": "mail",
    "mail_recipient": "company"
  }
]

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.