Migrating from the Legacy Tax Filings API

A comprehensive guide for migrating from the legacy Tax Filings API to the new Filings API, including status mappings, event changes, and webhook updates.

Overview

The new Filings API provides a more comprehensive view of the tax filing lifecycle compared to the legacy Tax Filings API. While the legacy API only showed filings after they failed, the new API displays all filings—including future ones based on your payroll setup and activity.

Key Benefits:

  • View upcoming filings before they're due
  • Monitor all filing statuses in one place
  • Get a complete picture of your filing timeline
  • Maintain all existing failed filing functionality

Status Changes

The new API uses different status names and logic. Here's how legacy statuses map to the new system:

Legacy StatusNew StatusWhat This Means
pendingpendingCheck is creating the tax return for your company.
submittedpendingFilings stay in pending status until the tax agency responds with success or failure.
filedfiledThe tax agency has accepted your return. This is now a final status that won't change.
rejectedblockedFilings may be marked as blocked before filing (due to issues like pending tax ID applications) or after agency rejection. The blocking_reasons field tells you exactly what needs to be fixed.
amendment_requiredN/AInstead of this status, filing objects now include an amended_by field. Check this field to see if an amendment exists, then query that specific filing object for details.

Event Tracking Changes

Legacy: Used tax_filing_events to track filing history
New: Uses status_history for complete filing lifecycle tracking

The new status_history provides a chronological record of every status change. When a filing becomes blocked, the blocking_reasons field explains what went wrong and how to fix it.

Complete Field Mapping

TaxFiling → Filing Object

Legacy FieldNew FieldNotes
id (tlg_)id (com_fil_)Different ID prefix in new API
companycompanySame field
yearyearSame field
descriptionlabelRenamed for clarity
frequencyDerived from periodNo longer a separate field. Quarterly filings show periods like Q1, Q2, etc. Monthly filings show specific months. Note: Some filings occur only in the first two months of a quarter (like Illinois monthly SUI)—these show the specific month but aren't necessarily monthly frequency.
periodperiodNow uses standardized values: Q1, Q2, Q3, Q4, annual, january, february, march, april, may, june, july, august, september, october, november, december
statusstatusSame field name, different possible values (see status mapping above)
can_retryN/ANo longer needed—blocked filings can always be retried after resolving the blocking issues
filing_eventsstatus_historyRenamed and enhanced with more detailed tracking

TaxFilingEvent → Status History Entry

Legacy FieldNew FieldNotes
id (fev_)N/AIndividual events no longer have separate IDs
tax_filingN/AEvent is now part of the filing object
statusstatusSame concept
created_atstatus_atRenamed for clarity
categoryblocked_reason.typeNow part of the blocked reason structure
labelblocked_reason.typeSame as category
account_numberN/AGet this by using the resource field in status_history.blocked_reasons to query the Company Tax Parameters API

Blocking Reason Categories

Legacy CategoryNew Category
applied_for_invalid_einapplied_for_tax_id
poa_tpa_failuretpa_failure
partial_failure_invalid_ssninvalid_ssn
already_filedalready_filed
not_liablenot_liable
corrected_and_refiled_timelyN/A
inactive_accountinactive_account
missing_prior_quartermissing_prior_quarter
missing_historical_datamissing_historical_data
invalid_tax_rateinvalid_tax_rate

Webhook Changes

Legacy Topic: tax_filing
New Topic: company_filing

Legacy EventNew EventNotes
createdcreatedSame functionality
updatedupdatedSame functionality
status_changeupdatedStatus changes now trigger the general updated event
deletedN/AFilings that need deletion are now marked as inapplicable

Migration Checklist

  1. Update your webhook endpoints to listen for company_filing events instead of tax_filing
  2. Replace API calls from the legacy Tax Filings API to the new Filings API endpoints
  3. Update status handling to use the new status values and blocking_reasons
  4. Modify event processing to use status_history instead of filing_events
  5. Test your integration with both successful and blocked filing scenarios