Tax Filings
This guide explains how to use Check’s filing-related APIs
The Filings API replaces the Legacy Tax Filings API, will be deprecated December 31, 2025.
Overview
The Tax Filings APIs allows you to do two key things:
- Determine what filings Check will file on behalf of a company in the future based on its payroll setup and activity.
- Query for information (including status) about tax filings, for companies and employees, in ~real time.
If you would like to learn more about how to generate previews of employee tax documents, or download groups of company and employee tax documents in bulk, please refer to the Employee Tax Statements and Tax Packages guide.
Why this matters for your product
- Proactive visibility: You can show customers what’s coming due and what’s already filed without stitching together multiple data sources.
- Clear ownership: Blocked states include actionable reasons so employers or partners can resolve issues quickly, ensuring Check can file accurate returns for employers in a timely fashion.
- Reliable timelines:
status_historylets you render clean, comprehensible progress views and notifications.
What is a filing?
A "Filing" represents a specific tax return Check prepares and submits to a government agency for a company for a given period and jurisdiction. It exists for both upcoming obligations and historical returns, so partners can see what Check plans to file and what has already been filed, all in one place
Each Filing includes core identifiers and timestamps to anchor it in your product:
id,company,year,periodand a human-readablelabel.due_at: when the return is due.filed_at: when the agency acknowledges receipt, if applicable.documentlinking to the final PDF once available.amendsandamended_byto show amendment relationships.filing_attemptsto indicate how many times Check attempted to file the return.statusandstatus_historyto track lifecycle changes over time.
Conceptually, a Filing is the end-to-end life of a single return for a company and period. That includes:
- Visibility before filing: upcoming returns that Check plans to file.
- Real-time progress: whether a return is ready to file, blocked, in progress, or complete.
- Outcomes and follow-ups: agency acceptance, rejections, and any required amendments.
- Related documents: links to the authoritative PDF once it’s available.
Filing status model
Filings use a small, stable set of user-facing statuses. You can rely on the status field for current state, and status_history for a chronological trail of changes.
Common statuses you will see:
pending: The filing applies and is being prepared to file. It may move back topendingwhen an amendment begins.blocked: Something prevents filing. Reasons are provided and are designed to be actionable by the employer or partner, for exampleapplied_for_tax_id. This could also mean that the agency rejected the return and a correction or amendment is required.filed: The agency acknowledged the filing as complete. This is usually terminal, though post‑filing corrections can move a return into an amendment flow.inapplicable: Check has determined the filing no longer applies to the company. Reasons might include include: voided payrolls, regulatory change, updated tax elections.
Status history
status_historycaptures changes with timestamps and, when relevant, reason details. Use it to build user timelines, audit trails, and “what changed” views.
Blocked reasons
- When a Filing is blocked, the API includes a list of reason objects that identify why, plus the related resource. These are designed to be surfaced to end users so they can fix issues and unblock progress.
Status lifecycle diagram
The below diagram demonstrates the status lifecycle of a filing. Once a tax filing is determined to be applicable for a company at the start of a filing period, this object will be created as pending or blocked. If there are any determined blockers to Check completing a successful filing — e.g. invalid EINs, EINs marked as applied for, etc. — the filing will be blocked with a set of reason enumerated in the blocked_reasons field. All reasons should be actionable by the employer. Once the filing is acknowledged by the agency as successfully filed, the filing will be marked as filed. If the agency rejects the filing for any reason, the filing will be moved back into blocked with blocked_reasons outlining next steps.

Flow diagram of status transitions for Filings.
API Integration Guide
Filings API
List filings - GET /filings?company=com_vIFHhvyGN47ej1upyIT8
GET /filings?company=com_vIFHhvyGN47ej1upyIT8List the filing history, plus expected upcoming filings, for a single company.
[
{
"id": "com_fil_GaeJoEAzbqqc2D9GMfOF",
"company": "com_vIFHhvyGN47ej1upyIT8",
"year": 2025,
"period": "q1",
"label": "Texas Quarterly Employment Return",
"due_at": "2025-04-30",
"filed_at": null,
"filing_attempts": 0,
"document": null,
"amends": null, // nullable list
"amended_by": null, // nullable list
"status": "blocked",
"status_history": [
{
"status": "blocked",
"status_at": "2025-01-01T01:08:00.957364Z",
"blocked_reasons": [
{
"type": "applied_for_tax_id",
"resource_type": "company_tax_param",
"resource": "spa_h7zSw4NITCtef4Taf5yA"
}
]
}
]
},
{
"id": "com_fil_bISuBs24PYIOF4hN2wh7",
"company": "com_vIFHhvyGN47ej1upyIT8",
"year": 2025,
"period": "q1",
"label": "Amended Federal Quarterly Tax Return",
"due_at": "2025-04-30",
"filed_at": "2025-05-10T16:31:00Z",
"filing_attempts": 1,
"document": "doc_2345",
"amends": ["com_fil_AaeJoEAzbqqc2D9GMr3R"],
"amended_by": null,
"status": "filed",
"status_history": [
{
"status": "filed",
"status_at": "2025-05-10T16:31:00.957364Z",
"blocked_reasons": null
},
{
"status": "pending",
"status_at": "2025-01-01T01:04:00.957364Z",
"blocked_reasons": null
}
]
},
...
]Get a filing - GET /filings/com_fil_GaeJoEAzbqqc2D9GMfOF
GET /filings/com_fil_GaeJoEAzbqqc2D9GMfOFGet a single filing.
{
"id": "com_fil_GaeJoEAzbqqc2D9GMfOF",
"company": "com_vIFHhvyGN47ej1upyIT8",
"year": 2025,
"period": "q1",
"label": "Texas Quarterly Employment Return",
"due_at": "2025-04-30",
"filed_at": null,
"filing_attempts": 0,
"document": null,
"amends": null,
"amended_by": null,
"status": "blocked",
"status_history": [
{
"status": "blocked",
"status_at": "2025-01-01T01:08:00.957364Z",
"blocked_reasons": [
{
"type": "applied_for_tax_id",
"resource_type": "company_tax_param",
"resource": "spa_h7zSw4NITCtef4Taf5yA"
}
]
}
]
}The Filing object
Fields non-nullable unless specified.
field | type | description |
|---|---|---|
| ID | ID of the |
| ID | ID of the |
| int | Year in which the filing is for |
| enum, one of | Filing period in the |
| string | Human-readable label for the filing. |
| date | ISO8601 date the filing is due to the agency by. |
|
| ISO8601 datetime the filing status became successfully |
|
| If the |
| int, default 0 | Number of filing attempts made by Check. |
|
| List of original |
|
| List of |
| enum, one of | The current filing processing status. |
| list of | List of the most recent status changes, in reverse chronological order. Limited to most recent 50. Each object represents a processing status change |
StatusHistory
| field | type | description |
|---|---|---|
status | enum | One of pending, blocked, filed , inapplicable |
status_at | datetime in UTC | When the previous status was changed to status. |
blocked_reasons | nullable list of BlockedReason objects | Optional list of reason enumerations for the status change to blocked. |
BlockedReason
| field | type | description |
|---|---|---|
type | enum | Options enumerated below. |
resource_type | nullable company_tax_param or requirement | CompanyTaxParam or Requirement |
resource | nullable ID | ID of the resource for resolving the blocker |
Possible BlockedReason types
The accompanying resource_type is specified in parentheses, if applicable.
already_filedapplied_for_tax_id(company_tax_param)company_bad_standingheld_by_customerinactive_accountincorrect_account_setupinvalid_ssninvalid_tax_idinvalid_tax_ratelate_company_reactivationmissing_historical_datamissing_prior_quarternot_liablepoa_failureprevious_filing_in_progresstpa_failure
Updated 1 day ago
