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.

Input cells for schedule89
CellTypesRequired
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.integerstrict
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.stringstrict
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.stringstrict
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 | stringstrict
schedule89.contactExtensionstring
schedule89.contactNamestring
schedule89.contactPhonestring
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.dividendsFromCorpsarray
schedule89.dividendsFromCorps[].businessNumberstring
schedule89.dividendsFromCorps[].corporationNamestring
schedule89.dividendsFromCorps[].datePayablenull | string
schedule89.dividendsFromTrustsarray
schedule89.dividendsFromTrusts[].datePayablenull | string
schedule89.dividendsFromTrusts[].trustAccountNumberstring
schedule89.dividendsFromTrusts[].trustNamestring
schedule89.ecpPost2000array
schedule89.ecpPost2000[].badDebtPortionnull | number
schedule89.ecpPost2000[].costAcquirednull | number
schedule89.ecpPost2000[].proceedsSalenull | number
schedule89.ecpPost2000[].taxYearEndnull | string
schedule89.ecpPre2000array
schedule89.ecpPre2000[].costAcquirednull | number
schedule89.ecpPre2000[].proceedsSalenull | number
schedule89.ecpPre2000[].taxYearEndnull | string
schedule89.filingCorpRowsarray
schedule89.filingCorpRows[].capitalDividendsFromTrustColumn 6 (line 150) — s.89(1)(g) capital dividends from a trust.null | numberstrict
schedule89.filingCorpRows[].capitalDividendsPayableColumn 7 (line 160) — capital dividends payable per s.83(2).null | numberstrict
schedule89.filingCorpRows[].capitalDividendsReceivedColumn 3 (line 120) — s.89(1)(b) capital dividends received.null | numberstrict
schedule89.filingCorpRows[].netLifeInsuranceProceedsColumn 4 (line 130) — s.89(1)(d) net life-insurance proceeds.null | numberstrict
schedule89.filingCorpRows[].nonTaxableCapGainsTrustPre2016Column 5 (line 140) — s.89(1)(f) non-taxable cap gain from trust pre-Sep 16 2016.null | numberstrict
schedule89.filingCorpRows[].nonTaxablePortionCapGainsColumn 2 (line 110) — s.89(1)(a) non-taxable cap gain / non-deductible loss.null | numberstrict
schedule89.filingCorpRows[].taxYearEndOrRelevantDateColumn 1 (line 100) — tax year-end or relevant date (ISO YYYY-MM-DD).null | stringstrict
schedule89.firmNamestring
schedule89.isBalanceVerificationRequestLine 004 — request is a standalone balance verification (mutually exclusive with 005).null | stringstrict
schedule89.isT2054RelatedRequestLine 005 — request supports a T2054 s.83(2) capital-dividend election (mutually exclusive with 004).null | stringstrict
schedule89.lifeInsurancePolicy1null | object
schedule89.lifeInsurancePolicy1.adjustedCostBasenull | number
schedule89.lifeInsurancePolicy1.beneficiaryNamestring
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.insuredNamestring
schedule89.lifeInsurancePolicy1.policyNumberstring
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.totalNetProceedsReceivednull | number
schedule89.lifeInsurancePolicy2null | object
schedule89.lifeInsurancePolicy2.adjustedCostBasenull | number
schedule89.lifeInsurancePolicy2.beneficiaryNamestring
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.insuredNamestring
schedule89.lifeInsurancePolicy2.policyNumberstring
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.totalNetProceedsReceivednull | number
schedule89.line400EcpPre2018Pinned to zero by this profile. The schema does not establish the historical ECP calculation.null | number | stringstrict
schedule89.line410LifeInsuranceCdaPre1985Pinned to zero by this profile. The schema does not establish the pre-May 24, 1985 balance.null | numberstrict
schedule89.line420PredecessorPre1990Pinned to zero by this profile. The schema does not establish the pre-July 14, 1990 predecessor or wind-up history.null | numberstrict
schedule89.predecessorRowsarray
schedule89.predecessorRows[].amalgamationDateColumn 2 (line 082) — amalgamation date (ISO YYYY-MM-DD).null | stringstrict
schedule89.predecessorRows[].capitalDividendsFromTrustColumn 7 (line 092) — s.89(1)(g) capital dividends from a trust.null | numberstrict
schedule89.predecessorRows[].capitalDividendsPayableColumn 8 (line 094) — capital dividends payable per s.83(2).null | numberstrict
schedule89.predecessorRows[].capitalDividendsReceivedColumn 4 (line 086) — s.89(1)(b) capital dividends received.null | numberstrict
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 | numberstrict
schedule89.predecessorRows[].nonTaxableCapGainsTrustPre2016Column 6 (line 090) — s.89(1)(f) non-taxable cap gain from trust pre-Sep 16 2016.null | numberstrict
schedule89.predecessorRows[].nonTaxablePortionCapGainsColumn 3 (line 084) — s.89(1)(a) non-taxable cap gain / non-deductible loss.null | numberstrict
schedule89.predecessorRows[].predecessorBusinessNumberColumn 1 (line 080) — predecessor business number.stringstrict
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.firstYearAfterAmalgamationbooleanstrict
t2Jacket.filingStatus.firstYearAfterIncorporationbooleanstrict
t2Jacket.filingStatus.subsidiaryWindupS88booleanstrict
t2Jacket.identification.isResidentOfCanadabooleanstrict
t2Jacket.identification.typeOfCorporationstringstrict
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 | stringalways
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.

Strict profile accepted values for schedule89
CellAccepted values
daysInYear1 to 1000000000000000
fiscalEnddate (YYYY-MM-DD); 10 to 10 characters
fiscalStartdate (YYYY-MM-DD); 10 to 10 characters
schedule89.cdaBalanceAsOfDatedate (YYYY-MM-DD); 10 to 10 characters
schedule89.cumulativeHistoryCompleteone 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[].taxYearEndOrRelevantDate0 to 20000 characters
schedule89.isBalanceVerificationRequestone of "Yes", "No", null
schedule89.isT2054RelatedRequestone 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[].amalgamationDate0 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[].continuityEventTypeone of "amalgamation", "windup", null
schedule89.predecessorRows[].netLifeInsuranceProceeds-1000000000000000 to 1000000000000000
schedule89.predecessorRows[].nonTaxableCapGainsTrustPre2016-1000000000000000 to 1000000000000000
schedule89.predecessorRows[].nonTaxablePortionCapGains-1000000000000000 to 1000000000000000
schedule89.predecessorRows[].predecessorBusinessNumber0 to 20000 characters
t2Jacket.identification.typeOfCorporation0 to 20000 characters
taxYearmatches ^\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.

Output cells for schedule89
CellTypes
cumulative_history.latestComponentRowDatearray | boolean | null | number | object | string
cumulative_history.part2AComponentRowsinteger
cumulative_history.part2BComponentRowsinteger
cumulative_history.rawComponentSubtotals.7Anumber
cumulative_history.rawComponentSubtotals.7Bnumber
cumulative_history.rawComponentSubtotals.7Cnumber
cumulative_history.rawComponentSubtotals.7Dnumber
cumulative_history.rawComponentSubtotals.7Enumber
cumulative_history.rawComponentSubtotals.7Gnumber
fired_gatesobject
line_003_cda_balance_as_of_datestring
line_004_balance_verification_requestboolean
line_005_t2054_related_requestboolean
line_400_derivationobject
line_400_ecp_pre_2018number
line_410_life_insurance_cda_pre_1985number
line_420_predecessor_pre_1990number
line_430_cda_balancenumber
provisionalboolean
readyboolean
subtotalsobject
warnings[].boxnull | string
warnings[].citation.applies_to_boxes[]string
warnings[].citation.cra_text_verbatimstring
warnings[].citation.form_idstring
warnings[].citation.form_revisionstring
warnings[].citation.gate_idstring
warnings[].citation.rulestring
warnings[].citation.sourcestring
warnings[].citation.source_urlstring
warnings[].citation.verified_atstring
warnings[].codestring
warnings[].gate_idstring
warnings[].messagestring
warnings[].severitystring
warnings[].actualnumber
warnings[].expectednumber
form.part2ARows[].amalgamationDatenull | string
form.part2ARows[].businessNumberReferencenull | string
form.part2ARows[].businessNumberRootnull | string
form.part2ARows[].capitalDividendsFromTrustnull | number
form.part2ARows[].capitalDividendsPayablenull | number
form.part2ARows[].capitalDividendsReceivednull | number
form.part2ARows[].netLifeInsuranceProceedsnull | number
form.part2ARows[].nonTaxableCapGainsTrustPre2016null | number
form.part2ARows[].nonTaxablePortionCapGainsnull | number
form.part2ARows[].predecessorBusinessNumbernull | string
form.part2BRows[].capitalDividendsFromTrustnull | number
form.part2BRows[].capitalDividendsPayablenull | number
form.part2BRows[].capitalDividendsReceivednull | number
form.part2BRows[].netLifeInsuranceProceedsnull | number
form.part2BRows[].nonTaxableCapGainsTrustPre2016null | number
form.part2BRows[].nonTaxablePortionCapGainsnull | number
form.part2BRows[].taxYearEndOrRelevantDatenull | string
form.part3SectionARows[].costAcquirednull | number
form.part3SectionARows[].proceedsSalenull | number
form.part3SectionARows[].taxYearEndnull | string
form.part3SectionBRows[].badDebtPortionnull | number
form.part3SectionBRows[].costAcquirednull | number
form.part3SectionBRows[].proceedsSalenull | number
form.part3SectionBRows[].taxYearEndnull | string
form.part4Rows[].businessNumbernull | string
form.part4Rows[].businessNumberReferencenull | string
form.part4Rows[].businessNumberRootnull | string
form.part4Rows[].corporationNamenull | string
form.part4Rows[].datePayablenull | string
form.part5Rows[].datePayablenull | string
form.part5Rows[].trustAccountNumbernull | string
form.part5Rows[].trustNamenull | string
form.part6Policy1object
form.part6Policy1.insuredNamenull | string
form.part6Policy1.beneficiaryNamenull | string
form.part6Policy1.policyNumbernull | string
form.part6Policy1.adjustedCostBasenull | number
form.part6Policy1.totalNetProceedsReceivednull | number
form.part6Policy1.policyRedemptionDatenull | string
form.part6Policy2object
form.part6Policy2.insuredNamenull | string
form.part6Policy2.beneficiaryNamenull | string
form.part6Policy2.policyNumbernull | string
form.part6Policy2.adjustedCostBasenull | number
form.part6Policy2.totalNetProceedsReceivednull | number
form.part6Policy2.policyRedemptionDatenull | string
canonicalCdaReconciliation.canonicalAsOfnull | string
canonicalCdaReconciliation.canonicalClosingnull | number
canonicalCdaReconciliation.differenceFromFormnumber
canonicalCdaReconciliation.form7Fnumber
canonicalCdaReconciliation.form7Gnumber
canonicalCdaReconciliation.formLine430number
canonicalCdaReconciliation.line430number
canonicalCdaReconciliation.paragraphHnull | number
canonicalCdaReconciliation.statusstring
coverageReasonstring
coverageStatusstring
formIdstring
formRevisionstring
missing_requiredarray
taxYearinteger
warnings[]object
Filemark | schedule89 cells