schedule89
T2 Corporation Income Tax Return
- Kind
- batch
- Supported tax years
- 2022 and later
- Strict profile
- s89_2025_zero_balance_verification_v1
- Payload schema version
- 0.6.0
- Dependencies (run automatically)
- pool_tracking
Example request
Send this body to POST /api/v1/computations/batch. It satisfies the strict profile, so it works with or without the payloadContract selector.
{
"compute": [
"schedule89"
],
"inputs": {
"taxYear": 2025,
"fiscalStart": "2025-01-01",
"fiscalEnd": "2025-12-31",
"daysInYear": 365,
"t2Jacket": {
"identification": {
"typeOfCorporation": "1",
"isResidentOfCanada": true
},
"filingStatus": {
"firstYearAfterIncorporation": true,
"firstYearAfterAmalgamation": false,
"subsidiaryWindupS88": false
}
},
"schedule89": {
"cdaBalanceAsOfDate": "2025-12-31",
"isBalanceVerificationRequest": "Yes",
"isT2054RelatedRequest": "No",
"predecessorRows": [],
"filingCorpRows": [],
"line400EcpPre2018": 0,
"line410LifeInsuranceCdaPre1985": 0,
"line420PredecessorPre1990": 0
}
}
}Input cells (77)
Paths are relative to the request’s inputs object; [] marks an array element.
Required says when a cell must be present. Always means every request needs it: the default boundary rejects the call when the cell is omitted or null. Strict means only a request that sends this target’s payloadContract selector needs it. See Run computations for the default boundary.
These cells are everything this target accepts. A member that is not published here, or is sent with the wrong JSON type, fails the call with a 400 naming each failing cell.
| Cell | Types | Required |
|---|---|---|
| daysInYearInclusive day count of the taxation year. It must equal the fiscalStart-to-fiscalEnd span, counting both end days, so a leap year states 366. Required for the same reason as fiscalStart; the count reconciles the bounds and never constructs them. | integer | strict |
| fiscalEndLast day of the taxation year, as YYYY-MM-DD, on or after fiscalStart. Its calendar year must equal taxYear. Required for the same reason as fiscalStart. | string | strict |
| fiscalStartFirst day of the taxation year, as YYYY-MM-DD. Required because this target's dependency closure reaches part_i_tax, whose rates and limits are day-weighted; ITA s.249(1)(a) makes the taxation year the fiscal period, and the engine will not invent calendar-year bounds. | string | strict |
| schedule89.businessNumberThe corporation's CRA RC business number for the Schedule 89 filing header. It is normalized and checksum-validated before the filing projection is released. | null | string | |
| schedule89.cdaBalanceAsOfDateThe date the CDA balance is stated as of, pinned to a date aligned with the return. It does not establish the corporation's actual last tax year-end or the CDA history covered through that date. | null | string | strict |
| schedule89.contactExtension | string | |
| schedule89.contactName | string | |
| schedule89.contactPhone | string | |
| schedule89.cumulativeHistoryCompletePractitioner attestation that the cumulative CDA component history in Parts 2A/2B (and the supporting Parts 3-6 detail) is COMPLETE for the period since the corporation last became a private corporation, or that the corporation has no CDA components. The s.89(1) CDA is period-based: empty grids assert "no components ever", not "history unknown", so the engine warns on empty grids until this is "Yes" and errors on "No" (known-incomplete history). null = unanswered (default). | null | string | |
| schedule89.dividendsFromCorps | array | |
| schedule89.dividendsFromCorps[].businessNumber | string | |
| schedule89.dividendsFromCorps[].corporationName | string | |
| schedule89.dividendsFromCorps[].datePayable | null | string | |
| schedule89.dividendsFromTrusts | array | |
| schedule89.dividendsFromTrusts[].datePayable | null | string | |
| schedule89.dividendsFromTrusts[].trustAccountNumber | string | |
| schedule89.dividendsFromTrusts[].trustName | string | |
| schedule89.ecpPost2000 | array | |
| schedule89.ecpPost2000[].badDebtPortion | null | number | |
| schedule89.ecpPost2000[].costAcquired | null | number | |
| schedule89.ecpPost2000[].proceedsSale | null | number | |
| schedule89.ecpPost2000[].taxYearEnd | null | string | |
| schedule89.ecpPre2000 | array | |
| schedule89.ecpPre2000[].costAcquired | null | number | |
| schedule89.ecpPre2000[].proceedsSale | null | number | |
| schedule89.ecpPre2000[].taxYearEnd | null | string | |
| schedule89.filingCorpRows | array | |
| schedule89.filingCorpRows[].capitalDividendsFromTrustColumn 6 (line 150) — s.89(1)(g) capital dividends from a trust. | null | number | strict |
| schedule89.filingCorpRows[].capitalDividendsPayableColumn 7 (line 160) — capital dividends payable per s.83(2). | null | number | strict |
| schedule89.filingCorpRows[].capitalDividendsReceivedColumn 3 (line 120) — s.89(1)(b) capital dividends received. | null | number | strict |
| schedule89.filingCorpRows[].netLifeInsuranceProceedsColumn 4 (line 130) — s.89(1)(d) net life-insurance proceeds. | null | number | strict |
| schedule89.filingCorpRows[].nonTaxableCapGainsTrustPre2016Column 5 (line 140) — s.89(1)(f) non-taxable cap gain from trust pre-Sep 16 2016. | null | number | strict |
| schedule89.filingCorpRows[].nonTaxablePortionCapGainsColumn 2 (line 110) — s.89(1)(a) non-taxable cap gain / non-deductible loss. | null | number | strict |
| schedule89.filingCorpRows[].taxYearEndOrRelevantDateColumn 1 (line 100) — tax year-end or relevant date (ISO YYYY-MM-DD). | null | string | strict |
| schedule89.firmName | string | |
| schedule89.isBalanceVerificationRequestLine 004 — request is a standalone balance verification (mutually exclusive with 005). | null | string | strict |
| schedule89.isT2054RelatedRequestLine 005 — request supports a T2054 s.83(2) capital-dividend election (mutually exclusive with 004). | null | string | strict |
| schedule89.lifeInsurancePolicy1 | null | object | |
| schedule89.lifeInsurancePolicy1.adjustedCostBase | null | number | |
| schedule89.lifeInsurancePolicy1.beneficiaryName | string | |
| schedule89.lifeInsurancePolicy1.dateOfDeathDate of death. Not a CRA box. Subparagraph 89(1)(d)(iii) measures the adjusted cost basis "immediately before the death" and forks on whether the death occurs before March 22, 2016; limbs (iv), (v) and (vi) are gated on it too. Routinely a different taxation year than the receipt. | null | string | |
| schedule89.lifeInsurancePolicy1.insuredName | string | |
| schedule89.lifeInsurancePolicy1.policyNumber | string | |
| schedule89.lifeInsurancePolicy1.policyRedemptionDateBox 355 / 365 — the CRA-prescribed Part 6 identity disclosure. | null | string | |
| schedule89.lifeInsurancePolicy1.proceedsReceivedDateDate the proceeds were RECEIVED by the corporation. Not a CRA box. Subparagraphs 89(1)(d)(i) and (ii) admit only proceeds "received by the corporation in the period", so this — not box 355 — places the amount in the s.89(1) period. The engine falls back to box 355 when it is blank. | null | string | |
| schedule89.lifeInsurancePolicy1.totalNetProceedsReceived | null | number | |
| schedule89.lifeInsurancePolicy2 | null | object | |
| schedule89.lifeInsurancePolicy2.adjustedCostBase | null | number | |
| schedule89.lifeInsurancePolicy2.beneficiaryName | string | |
| schedule89.lifeInsurancePolicy2.dateOfDeathDate of death. Not a CRA box. Subparagraph 89(1)(d)(iii) measures the adjusted cost basis "immediately before the death" and forks on whether the death occurs before March 22, 2016; limbs (iv), (v) and (vi) are gated on it too. Routinely a different taxation year than the receipt. | null | string | |
| schedule89.lifeInsurancePolicy2.insuredName | string | |
| schedule89.lifeInsurancePolicy2.policyNumber | string | |
| schedule89.lifeInsurancePolicy2.policyRedemptionDateBox 355 / 365 — the CRA-prescribed Part 6 identity disclosure. | null | string | |
| schedule89.lifeInsurancePolicy2.proceedsReceivedDateDate the proceeds were RECEIVED by the corporation. Not a CRA box. Subparagraphs 89(1)(d)(i) and (ii) admit only proceeds "received by the corporation in the period", so this — not box 355 — places the amount in the s.89(1) period. The engine falls back to box 355 when it is blank. | null | string | |
| schedule89.lifeInsurancePolicy2.totalNetProceedsReceived | null | number | |
| schedule89.line400EcpPre2018Pinned to zero by this profile. The schema does not establish the historical ECP calculation. | null | number | string | strict |
| schedule89.line410LifeInsuranceCdaPre1985Pinned to zero by this profile. The schema does not establish the pre-May 24, 1985 balance. | null | number | strict |
| schedule89.line420PredecessorPre1990Pinned to zero by this profile. The schema does not establish the pre-July 14, 1990 predecessor or wind-up history. | null | number | strict |
| schedule89.predecessorRows | array | |
| schedule89.predecessorRows[].amalgamationDateColumn 2 (line 082) — amalgamation date (ISO YYYY-MM-DD). | null | string | strict |
| schedule89.predecessorRows[].capitalDividendsFromTrustColumn 7 (line 092) — s.89(1)(g) capital dividends from a trust. | null | number | strict |
| schedule89.predecessorRows[].capitalDividendsPayableColumn 8 (line 094) — capital dividends payable per s.83(2). | null | number | strict |
| schedule89.predecessorRows[].capitalDividendsReceivedColumn 4 (line 086) — s.89(1)(b) capital dividends received. | null | number | strict |
| schedule89.predecessorRows[].cdaBalanceImmediatelyBeforeEventCDA immediately before the amalgamation/wind-up. This supplemental off-form aggregate proves every statutory CDA limb for successor continuity; the printed component columns remain the face detail. Explicit 0 is a completed nil answer; null/absence is unanswered. | null | number | |
| schedule89.predecessorRows[].cdaParagraphABalanceImmediatelyBeforeEventThe signed paragraph-(a) running component immediately before the event. Schedule 89 requires a negative predecessor component to carry into the successor; only the measured paragraph-(a) contribution is floored at nil. | null | number | |
| schedule89.predecessorRows[].continuityEventTypeFilemark continuity classification for this Part 2A row. The printed grid serves both amalgamated predecessors and wound-up subsidiaries; the type is required before an event-time balance can feed the pool. | null | string | |
| schedule89.predecessorRows[].netLifeInsuranceProceedsColumn 5 (line 088) — s.89(1)(d) net life-insurance proceeds. | null | number | strict |
| schedule89.predecessorRows[].nonTaxableCapGainsTrustPre2016Column 6 (line 090) — s.89(1)(f) non-taxable cap gain from trust pre-Sep 16 2016. | null | number | strict |
| schedule89.predecessorRows[].nonTaxablePortionCapGainsColumn 3 (line 084) — s.89(1)(a) non-taxable cap gain / non-deductible loss. | null | number | strict |
| schedule89.predecessorRows[].predecessorBusinessNumberColumn 1 (line 080) — predecessor business number. | string | strict |
| schedule89.predecessorRows[].s83_2_1HypotheticalDividendTaxableNet reviewed s.83(2.1) conclusion for the hypothetical full-CDA dividend in ITA 87(2)(z.1), after applying the non-application rules in subsections 83(2.2)–(2.4). Yes excludes this entity's CDA continuity; No permits it; null is unanswered and blocks the aggregate. | boolean | null | |
| t2Jacket.filingStatus.firstYearAfterAmalgamation | boolean | strict |
| t2Jacket.filingStatus.firstYearAfterIncorporation | boolean | strict |
| t2Jacket.filingStatus.subsidiaryWindupS88 | boolean | strict |
| t2Jacket.identification.isResidentOfCanada | boolean | strict |
| t2Jacket.identification.typeOfCorporation | string | strict |
| taxYearFour-digit taxation year accepted by the batch reader. Historical applicability is decided by the requested form; years after 2027 fail at the shared verified-rate horizon. | integer | string | always |
Strict profile accepted values (30 of 77 cells)
These values apply only when the request sends this target’s payloadContract selector. A cell marked pinned must equal the value shown to satisfy the strict profile. On the default boundary the same cell accepts any value of its published type.
| Cell | Accepted values |
|---|---|
| daysInYear | 1 to 1000000000000000 |
| fiscalEnd | date (YYYY-MM-DD); 10 to 10 characters |
| fiscalStart | date (YYYY-MM-DD); 10 to 10 characters |
| schedule89.cdaBalanceAsOfDate | date (YYYY-MM-DD); 10 to 10 characters |
| schedule89.cumulativeHistoryComplete | one of "Yes", "No" |
| schedule89.filingCorpRows[].capitalDividendsFromTrust | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].capitalDividendsPayable | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].capitalDividendsReceived | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].netLifeInsuranceProceeds | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].nonTaxableCapGainsTrustPre2016 | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].nonTaxablePortionCapGains | -1000000000000000 to 1000000000000000 |
| schedule89.filingCorpRows[].taxYearEndOrRelevantDate | 0 to 20000 characters |
| schedule89.isBalanceVerificationRequest | one of "Yes", "No", null |
| schedule89.isT2054RelatedRequest | one of "Yes", "No", null |
| schedule89.line400EcpPre2018 | -1000000000000000 to 1000000000000000; 0 to 20000 characters |
| schedule89.line410LifeInsuranceCdaPre1985 | -1000000000000000 to 1000000000000000 |
| schedule89.line420PredecessorPre1990 | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].amalgamationDate | 0 to 20000 characters |
| schedule89.predecessorRows[].capitalDividendsFromTrust | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].capitalDividendsPayable | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].capitalDividendsReceived | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].cdaBalanceImmediatelyBeforeEvent | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].cdaParagraphABalanceImmediatelyBeforeEvent | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].continuityEventType | one of "amalgamation", "windup", null |
| schedule89.predecessorRows[].netLifeInsuranceProceeds | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].nonTaxableCapGainsTrustPre2016 | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].nonTaxablePortionCapGains | -1000000000000000 to 1000000000000000 |
| schedule89.predecessorRows[].predecessorBusinessNumber | 0 to 20000 characters |
| t2Jacket.identification.typeOfCorporation | 0 to 20000 characters |
| taxYear | matches ^\s*(?:1[0-9]{3}|2(?:0(?:[0-1][0-9]{1}|2[0-7])))\s*$; 1000 to 2027; 0 to 20000 characters |
Output cells (99)
Paths are relative to this target’s result object in the response.
| Cell | Types |
|---|---|
| cumulative_history.latestComponentRowDate | array | boolean | null | number | object | string |
| cumulative_history.part2AComponentRows | integer |
| cumulative_history.part2BComponentRows | integer |
| cumulative_history.rawComponentSubtotals.7A | number |
| cumulative_history.rawComponentSubtotals.7B | number |
| cumulative_history.rawComponentSubtotals.7C | number |
| cumulative_history.rawComponentSubtotals.7D | number |
| cumulative_history.rawComponentSubtotals.7E | number |
| cumulative_history.rawComponentSubtotals.7G | number |
| fired_gates | object |
| line_003_cda_balance_as_of_date | string |
| line_004_balance_verification_request | boolean |
| line_005_t2054_related_request | boolean |
| line_400_derivation | object |
| line_400_ecp_pre_2018 | number |
| line_410_life_insurance_cda_pre_1985 | number |
| line_420_predecessor_pre_1990 | number |
| line_430_cda_balance | number |
| provisional | boolean |
| ready | boolean |
| subtotals | object |
| warnings[].box | null | string |
| warnings[].citation.applies_to_boxes[] | string |
| warnings[].citation.cra_text_verbatim | string |
| warnings[].citation.form_id | string |
| warnings[].citation.form_revision | string |
| warnings[].citation.gate_id | string |
| warnings[].citation.rule | string |
| warnings[].citation.source | string |
| warnings[].citation.source_url | string |
| warnings[].citation.verified_at | string |
| warnings[].code | string |
| warnings[].gate_id | string |
| warnings[].message | string |
| warnings[].severity | string |
| warnings[].actual | number |
| warnings[].expected | number |
| form.part2ARows[].amalgamationDate | null | string |
| form.part2ARows[].businessNumberReference | null | string |
| form.part2ARows[].businessNumberRoot | null | string |
| form.part2ARows[].capitalDividendsFromTrust | null | number |
| form.part2ARows[].capitalDividendsPayable | null | number |
| form.part2ARows[].capitalDividendsReceived | null | number |
| form.part2ARows[].netLifeInsuranceProceeds | null | number |
| form.part2ARows[].nonTaxableCapGainsTrustPre2016 | null | number |
| form.part2ARows[].nonTaxablePortionCapGains | null | number |
| form.part2ARows[].predecessorBusinessNumber | null | string |
| form.part2BRows[].capitalDividendsFromTrust | null | number |
| form.part2BRows[].capitalDividendsPayable | null | number |
| form.part2BRows[].capitalDividendsReceived | null | number |
| form.part2BRows[].netLifeInsuranceProceeds | null | number |
| form.part2BRows[].nonTaxableCapGainsTrustPre2016 | null | number |
| form.part2BRows[].nonTaxablePortionCapGains | null | number |
| form.part2BRows[].taxYearEndOrRelevantDate | null | string |
| form.part3SectionARows[].costAcquired | null | number |
| form.part3SectionARows[].proceedsSale | null | number |
| form.part3SectionARows[].taxYearEnd | null | string |
| form.part3SectionBRows[].badDebtPortion | null | number |
| form.part3SectionBRows[].costAcquired | null | number |
| form.part3SectionBRows[].proceedsSale | null | number |
| form.part3SectionBRows[].taxYearEnd | null | string |
| form.part4Rows[].businessNumber | null | string |
| form.part4Rows[].businessNumberReference | null | string |
| form.part4Rows[].businessNumberRoot | null | string |
| form.part4Rows[].corporationName | null | string |
| form.part4Rows[].datePayable | null | string |
| form.part5Rows[].datePayable | null | string |
| form.part5Rows[].trustAccountNumber | null | string |
| form.part5Rows[].trustName | null | string |
| form.part6Policy1 | object |
| form.part6Policy1.insuredName | null | string |
| form.part6Policy1.beneficiaryName | null | string |
| form.part6Policy1.policyNumber | null | string |
| form.part6Policy1.adjustedCostBase | null | number |
| form.part6Policy1.totalNetProceedsReceived | null | number |
| form.part6Policy1.policyRedemptionDate | null | string |
| form.part6Policy2 | object |
| form.part6Policy2.insuredName | null | string |
| form.part6Policy2.beneficiaryName | null | string |
| form.part6Policy2.policyNumber | null | string |
| form.part6Policy2.adjustedCostBase | null | number |
| form.part6Policy2.totalNetProceedsReceived | null | number |
| form.part6Policy2.policyRedemptionDate | null | string |
| canonicalCdaReconciliation.canonicalAsOf | null | string |
| canonicalCdaReconciliation.canonicalClosing | null | number |
| canonicalCdaReconciliation.differenceFromForm | number |
| canonicalCdaReconciliation.form7F | number |
| canonicalCdaReconciliation.form7G | number |
| canonicalCdaReconciliation.formLine430 | number |
| canonicalCdaReconciliation.line430 | number |
| canonicalCdaReconciliation.paragraphH | null | number |
| canonicalCdaReconciliation.status | string |
| coverageReason | string |
| coverageStatus | string |
| formId | string |
| formRevision | string |
| missing_required | array |
| taxYear | integer |
| warnings[] | object |