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:
- Bulk Processing: Generate tax document previews for multiple employees simultaneously
- Enhanced Integration: Connect seamlessly with Check's filing and document ecosystem through associated
filingsanddocumentendpoints - 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.
| field | type | description |
|---|---|---|
id | ID | ID of the employee tax statement |
employee | ID | ID of the employee this statement belongs to |
company | ID | ID of the company this statement belongs to |
year | int | Tax year for this statement |
amends | nullable ID | Previous statement this one amends (if applicable). If populated, this means this statement is an amendment. |
amended_by | nullable ID | Newer statement that amends this one (if applicable) |
document | nullable ID | Filed document ID (null if not yet filed) |
filings | list of IDs | Company filings that include this employee data |
filed_at | nullable datetime in UTC | When 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.
| field | type | description |
|---|---|---|
id | ID | Unique identifier for the tax package |
company | ID | Company this package belongs to |
status | generating, succeeded, failed | Current status: generating, succeeded, or failed |
contents | {"employee_tax_statements": ["ets_123", "ets_456"]} | Requested employee tax statements |
created_at | nullable datetime in UTC | When the package request was created (UTC) |
succeeded_at | nullable datetime in UTC | When generation completed successfully (UTC) |
result | nullable {"url": downloadable_url} | Download URL where you may access the generated tax package |
error | nullable {"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:
- Provides an interface to request a tax package containing one or more employee tax statements.
- Shows the state of the asynchronous generation job.
- 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.
Updated 2 days ago
